상속 & 포함

김설영·2022년 3월 29일
0

상속(Inheritance)

  • 기존의 클래스로 새로운 클래스를 작성하는 것 (코드의 재사용)
  • 두 클래스를 부모와 자식으로 관계를 맺어주는 것
class 자식클래스 extends 부모클래스 {
	// ...
}
  • 자식 클래스는 조상(부모, 조부모....)의 모든 멤버를 전부 상속받는다 (생성자, 초기화 블럭 제외)
  • 자손의 멤버 갯수 >= 조상의 멤버 갯수
  • 자손의 변경은 조상에 영향을 미치지 않는다
class Parent {
	int age;
}

class Child extends Parent {
	void method1() {
    	//...
    }
}
// 자신의 멤버 1개
// 부모로 부터 상속받은 멤버 1개 => Total 멤버 2개
// 부모 클래스로부터 상속받은 것도 자기꺼처럼 사용함
  • 자바는 단일 상속(하나의 부모만 상속)만을 허용한다. (C++은 다중 상속 가능)
  • 여러개를 상속할 수는 없으니, 비중이 높은 클래스 하나만 상속 관계로 받고 나머지는 포함 관계로 받아서 클래스를 구성하면 된다.
  • Object class : 모든 클래스의 최고 조상임
  • 부모가 없는 클래스는 자동으로 Object 클래스를 상속받는다.
class Tv {   -> class Tv extend Object {} 로 컴파일러가 자동 추가
	//... 
}

class SmartTv extends Tv {
	//...
}
  • 모든 클래스는 Object 클래스에 정의된 11개의 메서드를 상속받는다.
    ex : toString(), equals(Object obj), hashCode(),...
  • 상속 계층도
    SmartTv -> Tv -> Object

참조변수 super

  • 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자) 내에만 존재
    -> static 메서드 내에 사용 불가
  • 조상의 멤버를 자신의 멤버와 구별할 때 사용
class Parent { int x = 10; /* super.x */ }

class Child extends Parent {
	// 변수의 이름이 같아도 메모리 상에는 
    // 조상 클래스의 변수와, 자식 클래스의 변수가 따로 만들어짐
	int x = 20; // this.x
    
    void method() {
    	System.out.println("x=" + x);
        System.out.println("this.x=" + this.x);
        System.out.println("super.x=" + super.x);
    }
}
class Parent { int x = 10; /* super.x와 this.x 둘 다 가능*/ }

class Child extends Parent {    
	// 자식 클래스에 없는 변수는, this.x, super.x 전부 같은 주소를 가리킨다
    void method() {
    	System.out.println("x=" + x);
        System.out.println("this.x=" + this.x);
        System.out.println("super.x=" + super.x);
    }
}

생성자 super()

  • 조상의 생성자를 호출할 때 사용
  • 조상의 멤버는 조상의 생성자를 호출해서 초기화 (상속을 할 때, 생성자와 초기화 블럭은 상속되지 않기 때문)
  • 모든 생성자는 생성자의 첫 줄에 반드시 생성자를 호출해야 한다.
    그렇지 않으면, 컴파일러가 생성자의 첫 줄에 super();를 삽입한다.

포함(Composite)

  • 클래스의 멤버로 참조변수를 선언하는 것
  • 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만든다
class Point {
	int x;
    int y;
}

// Circle이 Point class를 "포함"
class Circle {
	point c = new Point();
    int r;
}
  • 상속관계 : A는 B이다 (is - a)
  • 포함관계 : A는 B를 가지고 있다 (has - a)
    ex) 원은 점이다. vs 원은 점을 가지고있다.
    -> 오른쪽이 더 자연스러우므로, 원과 점의 관계를 포함관계로 하는게 좋다.
  • 상속으로 해야되는 경우는 드물며, 포함관계를 자주 사용한다.
  • 상속은 꼭 필요할 때에만 이용한다.
profile
블로그 이동하였습니당! -> https://kimsy8979.tistory.com/

0개의 댓글