본문 바로가기
Develop/Java

[Java/Error] 기본 생성자가 필요한 이유

by dev_m.w 2024. 3. 2.

클래스를 작성하면서  기본 생성자는 왜 쓰는건지 , 메개변수가 존재하는 생성자를 만들면 왜 기본생성자를 만들어줘야 하는지 이해하지 못했다,   해당 예제를  접하면서  기본생성자의 필요성을 이해할수 있었다.

 

컴파일 오류 

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

자바의 정석