Kim-Baek 개발자 이야기

자바 기본 (11) - 생성자, 접근제한자, VO 본문

개발/java basic

자바 기본 (11) - 생성자, 접근제한자, VO

김백개발자 2020. 10. 2. 02:39
예전에 자바를 처음 공부하던 때, 네이버 블로그에 정리한 내용을 이제 티스토리로 옮기고자 한다

 

◎ this( [ 값, ... ] ) 의 사용
- 생성자에서 오버로딩된 다른 생성자 호출시에 사용한다
- 반드시 생성자 구문의 첫 명령으로만 올 수 있다.

ex) this( ); , this( 10 ); , this( 10, "abc" );
  -> 생성자에서 다른 생성자를 호출하고 싶을 때 사용!

* A( ) {
다른 내용 ->  조건문이나 반복문의 사용도 허용이 안된다. 무조건 첫번째에 와야한다.
this( 10 )
}

* A ( int i , int j , String s ){
this.i = i; 
this.j = j;     -> 이 두줄을 this( i, j ) : 코드의 편리를 위해. i, j 는 다른 생성자에서 초기화
this.s = s;
}
 A ( int i , int j ){
this.i = i;
this.j = j;
}


◎ Local 변수
- Default 초기화가 일어나지 않는다
- 알아서 default 값을 넣어야 한다 (내가 생각하는 기본값)

void method( ) {
int i; - 사용하기 위해서는 초기화가 필요하다 : i = 10; ->의미 없는 값이 아닌, 값이 없다는 것을 지칭하는 것!
}

* Class A{
  int age;   -> instance 변수는 default 초기화가 된다
}
new A ( );



◎ instance 변수 초기화 3단계
1. 묵시적 초기화(Default 초기화)
- 변수 type 의 기본값을 넣는다
2. 명시적 초기화
- code 상에 대입한 값을 넣는다.
3. 생성자 실행에 의한 초기화
- 생성자 code 에서 대입한 값을 넣는다.

Class Member()
{
int age = 20;
  public Member(int age)
  {
        this.age = age;
  }  
}

- new Member(10)를 했을때 age 의 변화는

1. 묵시적 초기화에 의해 0 이 되었다가

2. 명시적 초기화에 의해 20이 되고 마지막으로

3 생성자 실행에 의한 초기화로 10이 들어가게 된다.

 묵시적 초기화에서 값이 0이였는데 명시적 초기화로 다시 0이 들어가게 되면 값이 그대로 인것이 아니라 0이 다시 들어가게 되는 것이다.
-> 
메모리 (heap) 에 저장된다.


◎ 자바의 3대 특징 (캡슐화, 상속, 다형성)


- 캡슐화(은닉성) 
- 비슷한 기능끼리 묶는 것. 캡슐화를 했다(객체를 만드는 과정)
- 
각각은 독립적으로 구분이 있기 때문에 사용범위의 제한이 가능하다 -> 은닉성

◎ 접근제한자(access modifier)


- 모두접근이 가능하다 -> public
- 같은 class 안에서만 접근이 가능하다 -> private ( 보통 변수에 붙여서 사용한다) 
+ protected
* 알려주기 싫어서 감추는 것이 아니라 마음대로 변경이 되지 않게 하려고!
ex) public int age;
      private int age;
- class 의 구성요소는 instance 변수, instance 메소드, 생성자가 있는데 여기에서 instance 메소드, 생성자의 경우 private 를 통해 감출 수 있으나 객체가 제공하는 기능인데 제한을 한다는 것은 이상하다!

재고 객체{
재고량 = 25
}

주문 객체{
  주문(50){
   if(주문개수<재고)
   주문처리
  }
}


※ 이 경우 주문이 이루어 지면 안된다. 하지만 '재고량 = 주문개수' 라는 코드가 삽입이 되면 실행이 되어버린다. 실제로는 말이 안되는 결과이다. private로 이런걸 막으면 아예 접근조차 불가능하다!
-> 해결책은 메소드이다
※ 메소드를 통해 바꾸는 것과 변수로 그냥 바꾸는 것의 차이
- 변수로 넣는 것은 그냥 데이터 대입만 가능하지만, 메소드는 검증(조건문 등)이 가능하다!

- Encapsulation (캡슐화) : 연관싱 있는 Data(변수)와 동작(메소드)을 class로 묶은 것
-> 은닉성(information hiding) - 접근제한자를 이용해 객체의 멤버(메소드, 생성자, 변수)들에 대한 외부 접근을 제한하는 것

- 접근제한자 (access modifier) : public - 접근제한이 없는 것,   private - 같은 class 내에서만 접근가능
instance 변수 : 주로 private
instace 메소드, 생성자 : public

-> instance 변수는 private로 감추고, public 메소드를 통해 변경/조회 할 수 있도록 한다.

Class person{
private int age;   private boolean; -> setMarraige(), isMarriage()
변경 -> public void setAge( int age ) { -> set 변수명 : setter 메소드
     if(나이의 범위) this.age = age; 
}
조회 -> public int getAge( ) { -> get 변수명, is 변수명(타입이 boolean 일때) : getter 메소드
    return age;
}



※ 객체 중 속성을 주로 갖는 객체 : 다양한 데이터를 관리하는 타입의 값으로 주로 쓰인다 (Reference type), primitive 로는 표현이 불가능하다

값으로 사용되는 객체 : valueObject
size : 34   30   40
제조: 삼성 LG  Sony    -> 하나하나의 객체가 값으로 들어간다
가격: 300 200 150
    -> Class -> DataType 이고 객체 -> 값이 된다.

◎ ValueObject (Data Transfer Object, Domain Object)
-> VO ( DTO, DO )
-> 값으로 사용되는 객체를 생성하기 위한 class
-> attribute 중심의 class
-> 
업무처리 로직은 제공하지 않는다.
      
-(동작) 메소드 중심 class : Business Manager(Service) Class

- 구현 패턴 
 class 이름 : Data 명, Data명VO, Data명DTO, Data명DO


구현의 규칙

1. public class 로 선언
2. instance 변수의 접근제한자 private
3. public setter/getter 메소드 제공
4. 매개변수 없는 생성자, 모든 instance 변수 초기화하는 생성자 , +a 제공   -> 4번까지는 필수
5. 모든 instance 변수의 값을 String 으로 묶어 리턴하는 메소드 제공
  -> 
public Stiring toString()
6. class 선언시 implements Serializable 추가
7. equals(), hashcode() 메소드 구현


※ UML 에서 접근제한자 표기
private => -
public => +
ex) private String name -> 
 - name : String;
      public int go ( int a ) ->  
+ go ( a : int ) : int

반응형
Comments