클래스로부터 객체가 생성될 때 필드는 기본 초기값으로 자동 설정 됩니다. 만약 다른 값으로 초기화를 하고 싶다면 두 가지 방법이 있습니다. 하나는 필드를 선언할 때 초기값을 주는 방법이고 또 다른 하나는 생성자에게 초기값을 주는 방법입니다.
필드를 선언할 때 초기값을 주게 되면 동일한 클래스로부터 생성되는 객체들은 모두 같은 데이터를 갖게 됩니다. 물론 객체 생성 후 변경은 가능합니다. 객체 생성 시점에는 필드의 값이 모두 같습니다.
예를 들어 코드를 작성해보면
public class Korean {
String nation = "대한민국";
String name;
String ssn;
}
Korean k1 = new Korean();
Korean k2 = new Korean();
k1 의 필드값은 k2와 동일하다
하지만 객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화되어야 한다면 생성자에서 초기화를 해야 합니다.
위에 코드에서 name 과 ssn 필드값은 클래스를 작성할 때 초기값을 줄 수 없고 객체 생성 시점에서 다양한 값을 가져야 합니다. 따라 이 값들을 받아 초기화 해야하죠
public class korean {
// 필드
String nation = "대한민국";
String name;
String ssn;
// 생성자
public korean(String n, String s) {
name = n;
ssn = s;
}
}
이제 아래 코드에서 "박자바","김자바"는 매개 변수 n을 통해 전달되고 뒤에 숫자들은 매개 변수 s를 통해 전달됩니다.
이 값들은 각각name필드와 ssn 필드의 초기값으로 사용됩니다.
korean k1 = new korean("박자바", "123456-123456");
korean k1 = new korean("김자바", "123456-123456");
public class KoreanExample {
public static void main(String[] args) {
// 생성자
Korean k1 = new Korean("박자바", "12345-123456");
System.out.println("k1.name : " + k1.name);
System.out.println("k1.ssn : " + k1.ssn);
Korean k2 = new Korean("김자바", "12345-123456");
System.out.println("k2.name : " + k2.name);
System.out.println("k2.ssn : " + k2.ssn);
}
}
Korean 생성자의 매개 변수 이름을 각각 n과 s를 사용 하였는데 매개 변수의 이름이 너무 짧으면 코드의 가독성이 좋지 않기 때문에 가능하면 초기화시킬 필드 이름과 비슷하거나 동일한 이름을 사용할 것을 권합니다.
관례적으로 필드와 동일한 이름을 갖는 매개 변수를 사용합니다. 이 경우 필드와 매개 변수 이름이 동일하기 떄문에 생성자 내부에서 해당 필드에 접근할 수 없습니다.
왜냐하면 동일한 이름의 매개 변수가 사용 우선순위가 높기 때문입니다. 해결 방법은 필드 앞에 "this." 를 붙이면 됩니다.
this는 객체 자신을 참조인데, 우리가 우리 자신을 "나" 라고 하듯이 객체가 객체 자신을 this라고 합니다.
"this.필드"는 this라는 참조 변수로 필드를 사용하는 것과 동일합니다.
public Korean(String name, String ssn) }
this.name = name;
this.ssn = ssn;
}
객체의 필드는 하나가 아나라 여러 개가 있고, 이 필드들을 모두 생성자에서 초기화가 필요하다면 생성자의 매개 변수의 수는 객체의 필드 수만큼 선언되어야 합니다. 그러나 실제로는 중요한 몇 개 필드만 매개 변수를 통해 초기화되고 나머지 필드들은 필드 선언 시에 초기화하거나 생성자 내부에서 임의의 값 또는 계산된 값으로 초기화 합니다.
아니면 객체 생성 후 필드 값을 별도로 저장하기도 합니다.
'JAVA' 카테고리의 다른 글
JAVA 메서드 (0) | 2022.07.21 |
---|---|
JAVA 생성자 오버로딩 (0) | 2022.07.20 |
JAVA 생성자 (0) | 2022.07.19 |
Java 클래스 - 필드 (0) | 2022.07.15 |
Java 클래스 (0) | 2022.07.15 |