[Java/객체지향] 클래스의 관계 - 상속/포함관계/단일상속/Object클래스

2024. 8. 21. 20:22프로그래밍 언어/Java

클래스의 관계

(1)상속

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

2차원 좌표의 한 점(x,y)

class Point{
	int x;
	int y;
}

 

3차원 좌표의 한 점(x, y, z)

//(1)Point와 관계없는
class Point3D{
	int x;
	int y;
	int z;
}
//(2)Point와 상속관계
class Point3D extends Point{
	int z;
}

 


(2)포함 관계

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

//(1)
class Circle{
	int x;
	int y;
	int r;
}

//(2)
class Point{
	int x;
	int y;
}
class Circle{
	Point c = new Point();
	int r;
}

클래스 간의 관계 결정하기

상속관계 ~은 ~이다. (is-a)
  • 원(circle)은 점(point)이다.(부자연)
  • Sportcar는 Car이다.
  • 상속은 여러 제약 존재 → 꼭 필요할 때만

class Circle extends Point{
	int r;
}

 

포함관계 ~은 ~을 가지고 있다. (has-a)
  • 원(circle)은 점(point)을 가지고 있다.(자연스럽-더 적절)
  • Deck은 Car를 가지고 있다.
  • 90%이상 대부분이 포함

class Circle{
	Point c = new Point();
	int r;
}

 


단일 상속

  • Java는 단일상속만 허용(C++은 다중상속 허용)
    • 단일상속: 하나의 부모로부터 상속받을 수 있게 하는 것
  • 다중상속을 할 수 있는 방법: 비중이 높은 클래스만 상속관계로, 나머지는 포함관계로 함
.class TV{
    boolean power;
    int channel;

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

    void power() {power = !power;}
    void play(){/*내용생략*/}
    void stop(){/*내용생략*/}
    void rew(){/*내용생략*/}
    void ff(){/*내용생략*/}
}
public class TvDVD extends TV{
    DVD dvd = new DVD();

    void play(){
        dvd.play();
    }
    void stop(){
        dvd.stop();
    }
    void rew(){
        dvd.rew();
    }
    void ff(){
        dvd.ff();
    }
}


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

  • 부모가 없는 클래스는 자동적으로 Object클래스를 상속받게 됨
    • Object클래스: 모든 클래스의 상속계층도의 최상위에 있는 조상 클래스
    → 컴파일러가 extends Object 자동 추가
  • 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받음
  • → ex) toString(), equals(Object obj), hashCode()…