객체2(야마)
- 상속(inheritance)
- 1 상속의 정의와 장점
조상 클래스 부모(parent)클래스, 상위(super)클래스, 기반(base)클래스
자손 클래스 자식 (child)클래스. 하위 (sub)클래스, 파생된 (derived) 클래스
만일 Parent클래스에 age라는 정수형 변수를 멤버변수로 추가하면, 자손 클래스는 조상
의 멤버를 모두 상속받기 때문에, Child클래스는 자동적으로 age라는 멤버변수가 추가된
것과 같은 효과를 얻는다.
class Parent {
int age;
}
class Child extends Parent ( )
Child클래스에 새로운 코드가 추가되어도 조상인 Parent클래스는 아무런 영향도 받지 않
는다.
조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받게 되지만,자손 클래스가 변경되는 것은 조상 클래스에 아무런 영향을 주지 못한다.
자손 클래스는 조상 클래스의 모든 멤버를 상속 받으므로 항상 조상 클래스보다 같거나
많은 멤버를 갖는다. 즉,상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 점점
늘어나게 된다.
그래서 상속을 받는다는 것은 조상 클래스를 확장(extend)한다는 의미로 해석할 수도
있으며 이것이 상속에 사용되는 키워드가 ‘extends’인 이유이기도 하다.
- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
자손 클래스는 조상 클래스의 모든 멤버를 물려받으므로 GrandChild클래스는 Child클래
스의 모든 멤버,Child클래스의 조상인 Parent클래스로부터 상속받은 멤버까지 상속받
게 된다. 그래서 GrandChild클래스는 Child클래스의 자손이면서 Parent클래스의 자손
이기도 하다. 좀 더 정확히 말하자면,Child클래스는 GrandChild클래스의 직접 조상이
고. Parent클래스는 GrandChild클래스의 간접 조상이 된다. 그래서 GrandChild클래스
는 Parent클래스와 간접적인 상속관계에 있다고 할 수 있다.
class Parent {
int age;
}
class ChilId extends Parent { }
class Child2 extends Parent { }
class GrandChild extends Child { }
Parent클래스는 클래스 Child, Child2, GrandChild의 조상이므로 Parent클래스에 추가
된 멤버변수 age는 Parent클래스의 모든 자손에 추가된다. 반대로 Parent클래스에서 멤
버변수 age를 제거 한다면,Parent의 자손클래스인 Child, Child2, GrandChild에서도
제거된다.
이처럼 조상 클래스만 변경해도 모든 자손 클래스에, 자손의 자손 클래스에까지 영향을
미치기 때문에, 클래스간의 상속관계를 맺어 주면 자손 클래스들의 공통적인 부분은 조상
클 래 스 에 시 관 리 하 고 자 손 클 래 스 는 지 - 신 에 정 의 된 멤 버 들 만 관 - 리 하 면 되 므 로 각 클래스
의 코드가 적어져서 관리가 쉬워진다.
1.2 클래스간의 관계 _ 포함관계
1.3클래스간의 관계 결정하기
두 경우를 비교해 보면 Circle클래스를 작성하는데 있어서 Point클래스를 포함시키거나
상속받도록 하는 것은 결과적으로 별 차이가 없어 보인다
그 럴 때 는 ‘〜 은 〜 이 다 (i s - a)’와 ‘〜은 〜을 가지고 있다(h a s _a ),를 넣어서 문장을 만들어
보면 클래스 간의 관계가 보다 명확해 진다.
원 (Circle)은 점 (Point) 이다. - Circle is a Point.
원 (Circle) 은 점 (Point)을 가지고 있다. - Circle has a Point.
상속관계 '〜은〜이다.(is-a)’
포함관계 、은 〜을 가지고있다.(has-a)'
class DrawShape {
public static void main(String[] args) {
Point[] p = ( new Point(100, 100),
new Point(140, 50),
new Point(200, 100)
};
Triangle t = new Triangle(p);
Circle c = new Circle(new Point(150z 150), 50);
t.draw(); // 삼각형을그린다.
c.draw(); // 원을그린다.
}
}
class Shape {
String color = "black";
void draw() {
System.out.pr丄ntf(”[color=%s]%nn, color);
class Point {
int x;
int y;
Point(int x ,int y) {
this.x = x;
this.y = y;
}
Point(){
this (0,0);
}
String getXY() {
return " ("+x+", "+y+"》// x외 y의 값을 문자열로 반환
}
class Circle extends Shape {
Point center; // 원의원점좌표
int r; //반지름
Circle()
this(new Point(0,0),100;//Circle(point center, int r)호출
}
도형을 의미하는 Shape클래스를 정의하고, 2차원 좌표에서의 점을 의미하는 Point클래
스토 한 다유,이 두 클래스를 재활용해서 Circle클래스와 Triangle클래스를 정의하
였다. 앞서 배운 ‘is-a’와 ‘has_a’로 클래스간의 관계를 어떻게 맺어야하는지 확인해보
자.
Circle을 Shapes와 상속관계로, 그리고 Point외는 포함관계로 정의하면 다음과 같다.
class Circle extends Shape { // Circle과 Shape는 상속관계
Point center; // Circle과 Point는포함관계
int r;
}
Circle클래스에도 draw()가 정의되어 있다. 그러면 둘 중에 어떤 것이 호출되는
것일까? 이미 결과를 통해 알 수 있듯이 Circle클래스의 draw()가 호출된다.
class Circle extends Shape {
void draw() ( // 원을 그리는 대신에 원의 정보를 출력하도록 했다.
System.out.printf (H [center = (%d,%d), r = %dr color = %s] %nnf
center .xz center', y, r, color);
Circle c = new Circle(new Point(150, 150), 50);
위 문장이 좀 복잡해 보이지만,아래의 두 문장을 하나로 합쳐놓은 것일 뿐이다.
Point p = new Point(150, 150);
Circle c = new Circle(p, 50);
1.4 단일 상속(single inheritance)
다른 객체지향언어인 C++에서는 여러 조상 클래스로부터 상속받는 것이 가능한 ‘다중상
속(m ultiple inheritance)을 허용하지만 자바에서는 단일 상속만을 허용한다. 그래서 하
나 이상의 클래스로부터 상속을 받을 수 없다. 예를 들면,TV클래스와 VCR클래스가 있을
때, 이 두 클래스로부터 상속을 받는 TVCR클래스를 작성할 수 없다.
그래서 TVCR클래스는 조상 클래스로 TV클래스와 VCR클래스 중 하나만 선택해야한다.class TVCR extends TV, VCR { // 에러 . 조상은 하나만허용된다.
1.5 Object클래스 _ 모든 클래스의 조상
Object클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다. 다른 클래스
로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object클래스로부터 상속받게 함으
로써 이것을 가능하게 한다.
만일 다음과 같이 다른 클래스로부터 상속을 받지 않는 Tv클래스를 정의하였다고 하자.class Tv {
}
위의 코드를 컴파일 하면 컴파일러는 위의 코드를 다음과 같이 자동적으로 ‘extends
Object'를 추가하여 Tv클래스가 Object클래스로부터 상속받도록 한다.class Tv extends Object ( }
이렇게 함으로써 Object클래스가 모든 클래스의 조상이 되도록 한다. 만일 다른 클래스로
부터 상속윤 받는다고 하더라도 상속계충도를 따라 조상클래스, 조상클래스의 조상클래
스를 찾아 올라가다 보면 결국 마지막 최상위 조상은 Object클래스일 것이다.
모든 상속계층도의 최상위에는 Object클래스가 위치한다. 그래서 자바의 모든 클
래스들은 Object클래스의 멤버들을 상속 받기 때문에 Object클래스에 정의된 멤버들을
사용할 수 있다.
그동안 toString()이나 equals(Object o)와 같은 메서드를 따로 정의하지 않고도 사용
할 수 있었던 이유는 이 메서드들이 Object클래스에 정의된 것들이기 때문이다.
Ob ject클래스에는 toString(), equals()와 같은 모든 인스턴스가 가져야 할 기본적인
11개의 메서드가 정의되어 있으며 이에 대해서는 ‘9장 java.lang패키지와 유용한 클래스’
에서 자세히 학습하게 될 것이다.
->다음 포스팅 오버라이딩
'취준 note 2023 > 자바의정석' 카테고리의 다른 글
자바의정석 기초편 - 변수의 초기화 ~객체지향 개념 2-2 (0) | 2023.01.11 |
---|---|
자바의 정석 요약본 한번에 정리하기 - 객체 1-2~6. 변수으 초기화 (0) | 2023.01.10 |
자바의 정석 기초편 -요약파일 한꺼번에 정리하기 변수~객체1 (0) | 2023.01.09 |
자바의 정석- 객체지향의 원리2 (2) | 2022.12.27 |
자바의정석-객체지향 -클래스와 객체, 인스턴스 (1) | 2022.11.20 |