Java 객체지향

[Java][객체지향] 객체의 초기화

객체

기본 초기화

생성자 안에서 인스턴스 변수를 명시적으로 설정하지 않으면 자동으로 기본값으로 설정된다.

숫자는 0, 불값은 false, 객체 참조는 null이 기본값이다.

ex) name 변수를 명시적으로 설정하지 않았는데 getName()메소드를 호출하면 예상하지 못한 널 참조를 얻는다.

이럴 때 널 포인터 예외를 일으킨다.

 

인스턴스 변수 초기화

public class Employee{

  private String name = "";

....

}

이  초기화는 객체 할당되고 생성자 실행 전에 이루어졌다. 따라서 모든 생성자는 같은 초깃값을 갖게 된다. 물론 생성자에서 초깃값을 덮어쓸 수도 있다.

 

이 방법 말고 클래스 선언부에 임의의 초기화 블록을 포함시키는 방법도 있다.

public class Employee{

private String name = "";

private int id;

private double salary;

}

{//초기화 블록

  Random generator = new Random();

id = 1 + generator.nextInt(1_000_000);

}

//초기화블록은 흔히 사용하지는 않는다.

 

최종 인스턴스 변수

인스턴스 변수를 최종(final)로 선언 할 수 있다. 최종으로 선언한 변수는 반드시 모든 생성자가 작업을 마치기 전에 초기화해야 한다. 초기화 한 후에는 해당 변수를 다시 수정할 수 없다.

ex) name 변수같은 변수는 객체 생성 후 절대 변하지 않으므로(setName 메서드 없음) final로 선언할 수 있다.

public class Employee{

  private final String name;

  ...

}

 

cf. 변경 가능한 객체에 참조를 사용하면 final 제어자는 그저 해당 참조가 절대로 변하지 않는다는 사실만 나타낸다.

따라서 객체를 변경하는 일은 완전히 합법적이다.

private final ArrayList<Person> friends = new ArrayList<>();

이 메서드에서 friends가 참조하는 배열 리스트를 변경할 수 있지만, 다른 객체로는 절대 교체할 수 없다. 특히, null이 될 수 없다.  

 

참고: 책 '카이 호스트만의 코어 자바8'

 

 

'Java 객체지향' 카테고리의 다른 글

[Java][객체지향] 인터페이스  (0) 2019.05.30
'Call by reference' 그리고 'Call by value'  (0) 2019.05.10