객체
기본 초기화
생성자 안에서 인스턴스 변수를 명시적으로 설정하지 않으면 자동으로 기본값으로 설정된다.
숫자는 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 |