클래스를 작성하면서 기본 생성자는 왜 쓰는건지 , 메개변수가 존재하는 생성자를 만들면 왜 기본생성자를 만들어줘야 하는지 이해하지 못했다, 해당 예제를 접하면서 기본생성자의 필요성을 이해할수 있었다.
컴파일 오류
class Point{ //부모
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
String getLocation() {
return "x:"+x + ", y:" + y;
}
}
class Point3D extends Point{//자식
int z;
Point3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
String getLocation() {
return "x:"+x + ", y:" + y+",z : "+z ;
}
}
public class PointTest {
public static void main(String[] args) {
Point3D p3 = new Point3D(1,2,3); //컴파일 에러발생
}
}
코드는 매우 간단하지만 왜 컴파일 오류가 나는지 이해하지 못했다 .
자바는 매개변수가 있는 생성자를 만들면 기본 생성자는 만들어 주지 않는다. 부모클래스인 Point 는 기본생성자가 없고 매개변수2개를 갖는 생성자가 있다.자식 클래스인 point3D는 부모인 point를 상속받고 있다.
메인 메서드를 실행시키면 컴파일 에러가 발생한다.
그이유는 모든 생성자는 첫줄에 다른 생성자를 호출해줘야하는데 , 없으면 컴파일러가 super() 를 넣어준다. < 규칙
컴파일러가 자동 추가
class Point3D extends Point{
int z;
Point3D(int x, int y, int z) { //1,2,3 값이 넘어옴
//super() <컴파일러가 자동으로 넣어주고 point() 를 호출
this.x = x;
this.y = y;
this.z = z;
}
이렇게 컴파일러가 super()를 넣어주고 , super()를 이용해 부모의 정보를 불러온다. 이떄 부모인 point() 기본생성자를 호출한는데 , 부모클래스에는 기본생성자가 없기떄문에 컴파일 오류가 난다.
해결방법 1
class Point{
int x;
int y;
Point(){ //기본생성자 추가
}
Point(int x, int y) {
this.x = x;
this.y = y;
}
String getLocation() {
return "x:"+x + ", y:" + y;
}
}
부모 클래스에 기본생성자를 추가하거나
해결방법 2
class Point3D extends Point{
int z;
Point3D(int x, int y, int z) {
super(x,y); //부모 생성자 호출
this.z = z;
}
String getLocation() {
return "x:"+x + ", y:" + y+",z : "+z ;
}
}
부모 기본생성자 호출 안하게 , 자식 생성자에서 부모 생성자 매개 변수가 두개인 super(x,y)를 명시적으로 호출한다 .
결론
해결방법 2번 처럼 부모의 맴버는 부모 생성자가 초기화 하도록 하지만, 이외에도 리플렉션의 Class.newInstance()를 사용해서 생성자 코드를 만드는데 이때 이 코드가 바라보는게 바로 기본 생성자다. 또한 DTO의 직렬화(다른 자바 프로그램에도 사용하기위함) 클래스에서도 항상 기본 생성자가 필요하다.
그래서 항상 클래스를 작성할떄 기본 생성자를 작성해주는게 좋다.
참고:
https://stir.tistory.com/52#recentEntries
자바의 정석
'Develop > Java' 카테고리의 다른 글
[Java] JVM , 자바 프로그램 실행 과정 (0) | 2024.08.27 |
---|---|
[Java] String, StringBuilder, StringBuffer의 차이 (0) | 2024.07.16 |
[Java] 자료구조 Arraylist/LinkedList 특징 (0) | 2024.07.10 |
[Java ] 컬렉션 프레임워크 map 이해하기 (1) | 2024.01.27 |