Java

[Java] 상속 (Inheritance)

dalooong 2023. 6. 1. 10:18

상속이란 ?

  • 기존의 클래스로 새로운 클래스를 작성하는 것 (코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것
  • 자손은 조상의 모든 멤버를 상속 받는다. (생성자 ,초기화블럭은 제외)
  • 자손의 멤버가 항상 조상의 멤버보다 같거나 많다.
  • 자손의 변경은 조상에 영향을 미치지 않는다.
**class** 자식 클래스 **extends** 부모클래스 {} 

class Parent {}

class Child extends Parent{}

class Parent { //부모
		int age; //멤버 1개 
}

class Child extends Parent {} 
//자손 멤버 1개 -> 부모꺼를 물려받았으므로 자신의 멤버가 0개일지라도 상속받은 멤버가 1개이다. 

 

class Parent { //부모
		int age; //멤버 1개 
}

class Child **extends** Parent {
		void play(){
		System.out.println("놀자~");	
} 
자손 클래스에서 새로운 멤버가 추가되도 조상에 영향을 미치지 않는다. 
상속멤버1개
자신의 멤버 1개 총 2개인 것이다. 
class Point { //2차원 좌표의 한점을 나타내는 클래스 (0,0)
		int x; 
		int y;
}

예제)

public class EX7_1 {
    class Tv { //부모멤버 5개 
        boolean power; 
        int channel;

        void power()       {   power = !power; }
        void channelUp()   {   ++channel;      }
        void channelDown() {   --channel;      }
    }

    static class SmartTv extends Tv { //자식멤버 2개 + 부모 5개 
        boolean caption;     
        void displayCaption(String text) {
            if (caption) {  
                System.out.println(text);
            }
        }
    }

    class Ex7_1 {
        public static void main(String args[]) {
            SmartTv stv = new SmartTv();
            stv.channel = 10;			// 조상클래스로부터 상속받은 멤버
            stv.channelUp();			// 조상클래스로부터 상속받은 멤버 
            System.out.println(stv.channel);
            stv.displayCaption("Hello, World");
            stv.caption = true;	
            stv.displayCaption("Hello, World");
        }
    }
} 
//자식,자손 멤버는 부모에게 영향을 끼치지 않지만 부모멤버의 변동사항은 자식과 자손 멤버에게 영향을 끼친다. 

포함관계

포함이란?

  • 클래스의 멤버로 참조변수를 선언하는 것
  • 작은 단위의 클래스를 만들고 ,이 들을 조합해서 클래스를 만든다.

클래스의 관계 : 1. 상속 2.포함

클래스 간의 관계 결정하기

  • 상속 관계 : is-a 관계 a는 b이다.
  • 포함 관계 : has-a 관계 a는 b를 가지고 있다.

단일 상속(Single Inheritance)

  • 자바는 단일 상속만을 허용한다.
class TvDVD extends Tv, DVD { //에러발생, 조상은 하나만 허용한다. TV, DVD 둘다 상속 X
}
  • 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
class TvDVD extends Tv { //TV 상속
	DVD dvd = new DVD(); //DVD 포함 

}
예제
class MyPoint{
    int x;
    int y;
}
//class Circle extends MyPoint{ //상속
//    int r;
//
//}

class Circle{ //포함
    MyPoint p = new MyPoint(); //참조변수의 초기화
    int r;
}

public class InheritanceTest {
    public static void main(String[] args) {
        Circle c = new Circle(); //객체 생성
         c.p.x = 1;
         c.p.y = 2;
         c.r = 3;
        System.out.println("c.p.x="+c.p.x);
        System.out.println("c.p.y="+c.p.y;
        System.out.println("c.r="+c.r);

    }
}

 

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

  • 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.
  • 모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받는다.
  • toString(). equals(), hashCode()
  • System.out.println(c.toString()); = System.out.println(c); 같은 문장이다.
class Tv{  -> class Tv extends Object 컴파일러 자동 추가 
}
class SmartTv extends Tv{
}
class MyPoint extends Object{
    int x;
    int y;
}

class Circle extends Object { //object가 최고 조상
    MyPoint p;
    int r;

    Circle(){
        p = new MyPoint();
    }
}

public class InheritanceTest {
    public static void main(String[] args) {
        Circle c = new Circle(); //객체 생성
        System.out.println(c.toString()); //Circle@7699a589
        System.out.println(c); //Circle@7699a589 위와 같은 결과 출력
    }
}

 

 

 

출처 : 자바의정석 - 기초편