본문 바로가기

공부방/JAVA

상속

자바에서 상속을 정의할 때 extends라는 키워드를 사용한다.

extend는 확장하다라는 의미로 부모에게 물려받는 것 외에 추가로 확장할 수 있다라고 이해하면 된다.

class 자식클래스 extends 부모클래스{ ... }


상속의 특징

 

 

  1. 단일 상속만 가능 - 자식 클래스는 하나의 부모 클래스에서만 상속 받을 수 있다.
  2. 자식 클래스를 객체로 생성할 때 , 부모 클래스가 먼저 객체화 된다.
  3. 모든 클래스는 Object 클래스로 부터 시작하는 상속관계 하위 객체이다. (모든 클래스의 가장 상위 클래스는 Object 클래스이다.)

상속 예제

Phone.java

public class Phone {
    String name;
    String color;
    String company;

    void call() {
        System.out.println("전화를 건다.");
    }

    void receive() {
        System.out.println("전화를 받다.");
    }
}

SmartPhone.java

 

public class SmartPhone extends Phone {
    public void installApp() {
        System.out.println("앱 설치");
    }
}

SmartPhoneMain.java

public class SmartPhoneMain {
    public static void main(String[] args) {
        Phone p = new Phone();
        p.name = "전화기";
        p.company = "현대";
        p.color = "화이트";

        System.out.println("Phone 출력");
        System.out.println(p.name);
        System.out.println(p.company);
        System.out.println(p.color);
        p.call();
        p.receive();

        SmartPhone sp = new SmartPhone();
        sp.name = "갤럭시";
        sp.company = "삼성";
        sp.color = "블랙";

        System.out.println("SmartPhone 출력");
        System.out.println(sp.name);
        System.out.println(sp.company);
        System.out.println(sp.color);
        sp.call();
        sp.receive();
        sp.installApp();
    }
}

// Phone 출력
// 전화기
// 현대
// 화이트
// 전화를 건다.
// 전화를 받다.

// SmartPhone 출력
// 갤럭시
// 삼성
// 블랙
// 전화를 건다.
// 전화를 받다.
// 앱 설치

 

 


super

super 는 자식 객체에서 부모 객체를 가리키는 참조변수이다.

 

public class SuperEx {
    public static void main(String[] args) {
        Child child = new Child();
        child.print();
    }
    
}

class Parent{
    int number = 3;
    Parent(){
        System.out.println("부모 객체 생성");
    }
}

class Child extends Parent{
    int number = 2;

    Child(){
        System.out.println("자식 객체 생성");
    }

    void print(){
        int number = 1;
        System.out.println(number);
        System.out.println(this.number);
        System.out.println(super.number);
    }
}

// 부모 객체 생성
// 자식 객체 생성
// 1
// 2
// 3

부모 -> 자식 순서로 객체가 생성되는 것을 확인할 수 있다.

 

매서드의 지역 변수 number

자신 객체의 number

부모 객체의 number

순서로 1,2,3이 print된 것을 확인할 수 있다.

 

public class SuperEx {
    public static void main(String[] args) {
        Child child = new Child();
        child.print();
    }
    
}

class Parent{
    int number = 3;
    Parent(){
        System.out.println("부모 객체 생성");
    }
}

class Child extends Parent{
    // int number = 2;

    Child(){
        System.out.println("자식 객체 생성");
    }

    void print(){
        int number = 1;
        System.out.println(number);
        System.out.println(this.number);
        System.out.println(super.number);
    }
}

// 부모 객체 생성
// 자식 객체 생성
// 1
// 3
// 3

자식 객체에서 number가 존재하지 않는 경우를 확인할 수 있다.

이때 자식 객체는 부모 객체에 존재하는 number를 상속받고 있기 때문에 this.number 결과는 부모 객체의 number와 동일한 3을 print 하는 것을 확인할 수 있다.

 

public class SuperEx2 {
    
}

class Parent2{
    String name;
    Parent2(String name){
        this.name = name;
    }
}

class Child2 extends Parent2{
    Child2(){
        super("child");
    }
}

부모 클래스인 parent2를 살펴보면 매개변수 생성자만 존재하고 기본생성자는 없는 상태이다. 이런경우에 child2가 parent2를 상속받게 되면 기본적으로 에러가 발생한다.

 이 에러를 해결하기 위해서는 위와 같이 child2 생성자에서 super를 이용하여 부모 클래스의 매개변수 생성자를 반드시 실행해주어야 한다.

'공부방 > JAVA' 카테고리의 다른 글

mysql  (0) 2022.07.07
Map, Hash table  (0) 2022.06.19
일급 컬렉션  (0) 2021.08.15
예외처리  (0) 2021.07.14
[JAVA] enum 이란?  (0) 2021.07.14