개발자의 길/글로 적는 웹개발


■ 은닉화(-캡슐화)

- 멤버필드를 접근제한자 private 으로 선언하여 외부에서 접근불가

*private 으로 선언하면 자기 클래스에서만 접근이 가능한다.

- 세터(Setter)와 게터(Getter) 로 접근

- 외부에서 접근가능한 기능을 최소화 캡슐화

 

■ VO(Value Object) = DTO(Data Transfer Object) 라고도 함

  1. 멤버필드를 private 으로 선언
  2. Setter 와 Getter 
  3. 기본생성자

■ 생성자

접근제한자 클래스명(인자..) {
 멤버필드 초기화 구문작성 등...
}
  1. 멤버필드의 초기화
  2. 생성자를 프로그래머가 만들지 않으면 기본생성자를 컴파일러(Compiler)가 자동으로 생성합니다.

■ 자바의 숨겨진 비밀(코딩의 편리함을 위해 생략가능)

  1. import.java.lang.* 은 생략이 가능하다. 
  2. 생성자 개발자가 단 한개의 생성자라도 선언하지 않으면 컴파일러가 컴파일시에 기본생성자 한개를 만들어서 사용
  3. this. 같은 클래스 내부에서 인스턴스 멤버끼리 접근 할 때는 this. 생략 가능
  4. 클래스명. 같은 클래스 내부에서 static 끼리 접근 할 때는 클래스. 생략이 가능

■ public void test(int a, boolean b){...}

  1. 메서드명 test()
  2. 접근제한자 public
  3. 리턴 자료형 void(리턴값 없음)
  4. 인자 2개 int형과 boolean형

=> 접근제한자가 public 이고 static과 리턴값이 없고 int형과 boolean형 인자가 2개인 test 인스턴스 메서드 입니다.

 

■ 다음과 같은 클래스를 java 클래스로 선언해보세요.( VO) 로 

TV
제조사
모델명
가격

 

public class Tv(){
    //1) 멤버필드를 private 선언
    private String company; //제조사
    private String model; //모델명
    private int price; //가격
    
    //2)기본생성자
    public Tv(){}
    
    //3)setter 와 getter 설정
    public void setCompany(String company){
        this.company = company;
    }
    public getCompany(){
    	return company;
    }
    
    public void setModel(String model){
    	this.model = model;
    }
    public getModel(){
    	return model;
    }
    
    public void setPrice(int price){
    	this.price = price;
    ]
    public getPrice(){
    	return price;
    }
    
}

■ 아래의 소스코드에서 왜 컴파일 에러가 나는지 설명해 보세요.

 

public class Homework2{
    private int a;
    private boolean b;
    
    public static void main(Stringp[] args){
     
    	Homework2 h = new Homework2();
        Homework2 h2 = new Homework2(3, false);
    }
}
...더보기

(1) 기본생성자 호출은 프로그래머가 생성하지 않아도 컴파일시 컴파일러가 자동으로 생성해주기에 h 는 에러가        나지 않는다.

(2) 인자 2개를 가지고 있는 h2 는 직접 인자 2개 짜리 생성자를 만들어주지 않으면 에러가 난다.


■ 멤버필드를 정보은닉하기 위해 접근제한자를 privatte 로 선언하고, 멤버필드에 데이터를 세팅하기 위해 set메서드를, 데이터를 얻기 위해 get 메서드를 이용합니다.


 

■ 다음의 결과를 쓰세요.

public class ConTest{
	Contest(){
    	this(3);
    }
    
    void ConTest(int a){
    	System.out.println("A");
    }
    
    ConTest(char c){
    	this("");
        System.out.println("B");
    }
    
    private ConTest(int a){
    	this('a');
        System.out.println("C");
    }
    
    private ConTest(String str){
    	System.out.println("D");
    }
    
    public static void main(String[] args){
    	ConTest con1 = new Contest("ConTest");
        ConTest con2 = new ConTest();
    }
}
...더보기
public class ConTest{

//ConTest 클래스안에는 멤버필드는 없다.

	Contest(){
    	this(3);
    }//접근제한자, 인자가 없는 기본 생성자
    
    void ConTest(int a){
    	System.out.println("A");
    }//void 라는 void 라는 리턴자료형이 있으니 메서드이다.
    
    ConTest(char c){
    	this("");
        System.out.println("B");
    }//char형 인자 1개를 가지고 있는 생성자
    
    private ConTest(int a){
    	this('a');
        System.out.println("C");
    }//int형 인자 1개를 가지고 있는 생성자
    
    private ConTest(String str){
    	System.out.println("D");
    }//접근제한자가 private 이고 String 형 인자 1개를 가지고 있는 생성자
    
    public static void main(String[] args){
    	ConTest con1 = new Contest("ConTest");
        ConTest con2 = new ConTest();
    }//멤버 main 메서드
    
//해보자
    
    
}

메서드 오버로딩이란 메서드 이름이 같고, 인자가 다른 것 입니다.

- 인자가 다르다는 것은 다음과 같다.

  1. 자료형이 다르거나
  2. 이름이 다르거나 
  3. 순서가 다르다는 것

■ 다음 소스는 왜 컴파일 에러가 나지 않을까요?(기본생성자 관련하여)

public class Homework(){
    void Homework(){}
    private Homework(){}
}
...더보기

 Homework 클래스 안에 Homework() 같은 이름이지만 void Homework() 는 리턴자료형인 void(리턴값이 없음) 이기 때문에 메서드, private Homework()는 접근제한자 private 를 가지고 리턴자료형이 없고 인자가 없는 기본 생성자이기 때문에 에러가 나지 않는다.


■ 해당 프로그램의 결과를 쓰세요.

public class Homework(){
 int a; //멤버필드
 
 private int test(int a){
  return a++; //*후위증가연산자는 return 하고 증가됩니다.
 }//int형 인자를 1개 가지고 있는 test 생성자
 
 private int test2(Homework h){
   return h.a++
 }//객체자료형 homework 인자를 1개 가지고 있는 test2 생성자
 
 public static void main(String[] args){
   Homework h = new Homework(); 
   
   h.a = 5;
   int a = 4;
   
   h.test(a); 
   
   a = h.test2(h);
   
   System.out.println(h.a);
   System.out.println(a);
   
 }
}
...더보기

결과:


■ 다음 프로그램의 실행 결과는 무엇일까요?

public class Homework2 {
 private String str;
 
 public Homework() {
  this("Chupa_Chups!");
  System.out.println("★");
 }
 
 private Homework2(String str){
  this.str = str;
  System.out.println("●");
 }
 
 private void test(String str){
  str = "Hello World!";
 }
 
 public static void main(String[] args){
  Homework2 ho = new Homework2();
  ho.test(ho.str);
  
  String str = ho.str.substring(2,5);
  
  System.out.println(str);
  System.out.println(ho.str);
 }
}
...더보기

결과:


 


class A{
    static a;
    int b;
}
class B{
    static int a;
    boolean b;
}
public class C{
	public static void main(String[] args){
          A a = new A();
          B b = new B();
          a.a = 10;
          a = new A();
          b.a = a.a;
          b.b = true;
    }
}​

- 말로 설명하는 의미 해석

static int a;
=>접근제한자가 default 이고 기본자료형이 int 인 static 멤버필드 a 입니다.

public static void main(String[] args){}
=> 접근제한자가 public 이고 return 값이 없고 인자는 String형 배열 args 인자를 가지고 있는 static
   메서드 main 입니다.
   
A a = new A();
=> 객체자료형 클래스 A에 레퍼런스를 저장할 수 있는 지역변수 a를 선언하고 new 라는 키워드를 통해 heap
   메모리 안에 공간을 할당받아 클래스 A 생성자를 호출해 객체를 생성합니다.
   
   

- 접근제한자

  1. public
  2. protected
  3. default
  4. private

- 멤버필드의 선언

=> 접근제한자 static 자료형 변수명

- 메서드의 선언

=> 접근제한자 static 리턴자료형 메서드명(인자...){

리턴 키워드

}

 

- 멤버의 종류에는 인스턴스(Instance)스태틱(Static)이 있다.

- 인스턴스의 호출방법은 객체명.(같은 멤버면 this. 생략가능) 으로 접근한다.

- 스태틱의 호출방법은 클래스명.(같은 멤버면 클래스명. 생략가능) 으로 접근한다.

최근 글