[Java] 자식클래스가 상속받으면 부모 객체를 사용할 수 있는 이유와 상속 사용 주의사항

    자바에서 상속을 이용하면 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과 때문에 유지보수 측면에서 효율성을 높일 수 있다. 그래서 객체지향 프로그래밍 특징 중에 상속이 포함되는 것이다.

     

    [상속 특징]

      1. 현실에서 상속은 부모가 자식을 선택해서 물려주지만, 프로그램에서는 자식이 부모를 선택한다.

      2. 현실에서도 부모를 여러명 가질수 없듯이, 프로그램에서도 단 하나의 부모만 가질 수 있다.

      3. 부모 클래스가 private나 다른 패키지에 있고 default 접근 제한자를 가지고 있으면 상속을 할 수 없다.

     

    [자식클래스가 부모클래스를 사용할 수 있는 이유]

    상속을 받은 자식 클래스의 객체가 생성되면 부모 객체가 먼저 생성되는데 그 이유는 자식 클래스의 기본 생성자에 있는 super() 함수로 부모 객체가 생성되기 때문이다. 

     

    ※ super() 함수는 부모 클래스의 객체를 생성하기 위해서 실행되는 함수이다.

     

    [CellPhone 부모 클래스]

    public class CellPhone {
        String model;
        String color;
    
        protected void powerOn() {
            System.out.println("전원을 켭니다");
        }
    }

     

    [CellPhone 클래스를 상속 받은 DmbCellPhone 클래스]

    public class DmbCellPhone extends CellPhone {
        int channel;
    
        DmbCellPhone(String model, String color, int channel) {
            this.model = model;
            this.color = color;
            this.channel = channel;
        }
    }

     

    [DmbCellPhone 자식 객체를 만들어서 사용]

    public class DmbCellPhoneExample {
        public static void main(String[] args) {
            DmbCellPhone dmbCellPhone = new DmbCellPhone("자바폰", "검정", 10);
    
            System.out.println(dmbCellPhone.model);     //자바폰
            System.out.println(dmbCellPhone.color);     //검정
            System.out.println(dmbCellPhone.channel);   //10
    
            dmbCellPhone.powerOn(); //전원을 켭니다
        }
    }

     

    DmbCellPhone 객체를 만든 순간 DmbCellPhone 클래스에 있는 생성자에서 생략된 super() 함수가 자동으로 추가되면서 먼저 실행된다. 힙 영역에 CellPhone 객체가 생성되고 DmbCellPhone 객체가 그다음 생성된 후에 스택 영역에 있는 dmbCellPhone의 값은 DmbCellPhone 객체의 주소를 바라본다. 

    CellPhone 클래스의 model, color 필드와 powerOn() 메서드를 상속 받았기 때문에 사용할 수 있다.

     

     

     

    [자식 클래스의 객체 만들때 주의사항]

    생략된 super() 함수가 자동으로 추가되면서 실행되는데 만약에 부모 클래스의 기본 생성자가 없으면 어떻게 될까? 

     

    생성자를 하나 만들어서 기본 생성자가 안 만들어지도록 하였다.

    public class CellPhone {
        String model;
        String color;
    
        CellPhone(String model) {
    
        }
    
        protected void powerOn() {
            System.out.println("전원을 켭니다");
        }
    }

     

    main 함수를 실행시켰더니 아래 에러가 난다. 기본생성자가 없으니 나는 에러다.

     

    에러를 해결하기 위해서는 super() 함수를 기입해줘야 하고 생성자를 만들때 기입한 매개변수도 넣어줘야 한다.

    public class DmbCellPhone extends CellPhone {
        int channel;
    
        DmbCellPhone(String model, String color, int channel) {
            super(model);
            this.color = color;
            this.channel = channel;
        }
    }

     

     

    또 주의사항으로는 부모 클래스의 생성자가 접근제한자 private를 사용한다면  부모클래스의 생성자를 자식클래스에서 만들수 없기 때문에 에러가 발생한다. 

     

    ※ 또한 부모 클래스가 다른 패키지에 있고,  접근제한자가 default 이면 자식클래스에서 사용될수 없다는점도 알고 있어야 한다.

     

    참고 : 혼자 공부하는 자바 / 신용권  https://www.yes24.com/Product/Goods/74269939  

    댓글

    Designed by JB FACTORY