상속

배지원·2022년 9월 26일
0

JAVA

목록 보기
12/32

1. 상속

  • 기존의 클래스로 새로운 클래스를 작성하는 것(코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것
  • 자손은 조상(부모클래스)의 모든 멤보를 상속받는다(생성자, 초기화블럭 제외)
  • 부모클래스의 변경이 있으면 자손 클래스는 영향을 받는다(자손클래스의 변경은 부모클래스에 영향 없음)

class Tv{
    boolean power;
    int channel;

    void power(){           // 전원
        power = !power;
    }
    void channelUp(){       // 채널 up
        ++channel;
    }
    void channelDown(){     // 채널 down
        --channel;
    }
}

class SmartTv extends Tv{
    boolean caption;
    void displayCaption(String text){       // 자막 기능
        if(caption){
            System.out.println(text);
        }
    }
}


public class Ex7_1 {
    public static void main(String[] args) {
        SmartTv stv = new SmartTv();

        stv.channel = 10;				// 상속을 통해 Tv클래스의 channel 인스턴스 변수를 초기화함
        stv.channelUp();				// 상속을 통해 부모 클래스의 메서드를 호출함
        System.out.println(stv.channel);
        stv.channelDown();
        System.out.println(stv.channel);

        stv.displayCaption("Hello, World");
        stv.caption = true;     //
        stv.displayCaption("hello,world");
    }
}

2. 클래스간의 관계 - 포함관계(상속 x)

  • 클래스의 멤버로 참조변수를 선언하는 것
  • 작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
  • 왼쪽의 Circle 클래스는 3개의 인스턴스 변수를 가지고 있는 반면에 오른쪽의 Circle 클래스는 Point클래스를 객체로 생성하여 포함관계를 이루고 있다.

3. 클래스간의 관계 결정하기(상속 or 포함)

  • 상속관계 ('A는 B이다')
  • 포함관계 ('A는 B를 가지고 있다') - 대부분 포함기능 사용

    상속

    class MyPoint{								// 부모 클래스
       int x;
       int y;
    }
    class Circle2 extends MyPoint{				// 자식 클래스(상속 받음)
       int r;
    }
    public static void main(String[] args) {
           Circle2 c2 = new Circle2();
           c2.x = 1;							// 상속으로 인해 부모클래스 변수 초기화
           c2.y = 2;
           c2.r = 3;
           System.out.println(c2.x);
    }

    포함

    class MyPoint{							// MyPoint 클래스 생성
       int x;
       int y;
    }	
    class Circle3{
       MyPoint m = new MyPoint();			// MyPoint객체 생성(포함 기능)
       int r;
    }
    public static void main(String[] args) {
       Circle3 c3 = new Circle3();			// 객체 생성
       c3.m.x = 1;							// 객체의 객체 변수 초기화
       c3.m.y = 2;
       c3.r = 3;
    }

4. 단일 상속

  • 자바는 단일 상속만 허용한다(1개의 부모한테만 상속 받음)
  • 만약 다중일 경우 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.

5. Object 클래스 - 모든 클래스의 조상

  • 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 된다.
  • 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
    ex) toString(), equals(Object obj), hashCode(),...
    class Tv extends Object{			// 부모가 없는 클래스라 Object클래스를 상속 받음
    								    // (실사용때는 Object클래스를 상속받는것이 생략되어있음)
    	// ...
    }
    class SmartTv extends Tv{
     // ...
    }

6. Super

(1) Super

  • 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수입니다.

  • 조상 클래스로부터 상속받은 멤버도 자손 클래스 자신의 멤버이므로 super대신 this를 사용할 수 있다. 그래도 조상 클래스의 멤버와 자손클래스의 멤버가 중복 정의되어 서로 구별해야하는 경우에만 super를 사용하는 것이 좋다.

    class Parent2{
       protected int num = 10;
    }
    class Child2 extends Parent2{
       private int num = 30;
    
       void method(){
           System.out.println("num :"+num);                    // 가장 가까이 있는 num값 출력
           System.out.println("this.num :"+num);               // 현재 클래스에 있는 num값 출력
           System.out.println("super.num :"+super.num);        // 부모 클래스에 있는 num값 출력
       }
    }
    class Child3 extends Parent2{								// 인스턴스 변수 없는경우
    	    void method(){	
           System.out.println("num :"+num);                    // 가장 가까이 있는 num값(부모 인스턴스 변수) 출력
           System.out.println("this.num :"+num);               // 현재 클래스에 값이 없으므로 부모의 값 출력
           System.out.println("super.num :"+super.num);        // 부모 클래스에 있는 num값 출력
       }
    }
    public class Super {
       public static void main(String[] args) {
           Child2 c = new Child2();
    
           c.method();
       }
    }

(2) Super() - 조상의 생성자

  • 조상의 생성자를 호출할 때 사용

  • 조상의 멤버는 조상의 생성자를 호출해서 초기화

  • 생성자의 첫 줄에 반드시 생성자를 호출해야 한다.(중요!!) 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입

    class Parent2{			// 부모 클래스
       protected int num;		// 인스턴스 변수 선언
    
       Parent2(int num){		// 생성자 생성
           this.num = num;
       }
    }
    class Child2 extends Parent2{		// 상속 받음
       private int num2;
       Child2(int num,int num2) {			// 생성자 생성
           super(num);				// 조상의 클래스 생성자 호출(필수임)
           this.num2 = num2;
       }
    }
profile
Web Developer

0개의 댓글