상속
기존 클래스를 재사용하여 새로운 클래스를 작성하는 것.
- 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있음
- 코드를 공통적으로 관리 가능
- 코드 추가 및 변경 용이
class Parent { }
// extends 키워드를 사용(조상 클래스를 확장한다는 의미)
class Child extends Parent {
...
}
Parent 클래스와 Child 클래스는 서로 "상속 관계"
- Parent: 조상 클래스
- Child: 자손 클래스
자손 클래스는 조상 클래스의 모든 멤버를 상속받는다.
그렇기에 Child 클래스는 Parent 클래스의 멤버를 모두 포함하고 있음.
그러나 자손 클래스인 Child에 새로운 코드가 추가되어도 조상인 Parent 클래스는 아무런 변화 X
(물론 Parent 클래스에 새로운 코드 추가 시 Child는 자동적으로 해당 코드 추가됨)
[주의]
① " 자손 클래스 멤버 >= 조상 클래스 멤버 "
상속을 거듭할수록 클래스 멤버 개수는 점점 증가.
② 자손 클래스는 조상 클래스의 모든 멤버를 상속받으나, 생성자와 초기화 블럭은 상속되지 않는다.
※ 초기화 블럭: 클래스/인스턴스 초기화 블럭으로 나뉜다.
- 클래스 초기화 블럭은 클래스 변수의 초기화에 사용
- 인스턴스 초기화 블럭은 친스턴스 변수의 초기화에 사용됨.
package ch7;
class Tv{
boolean power;
int channel;
void power() {power = !power;}
void channelUp() { ++ channel; }
void channelDown() { --channel; }
}
class CaptionTv extends Tv{
boolean caption;
void displayCaption(String text) {
if(caption) {
System.out.println(text);
}
}
}
public class Ex7_1 {
public static void main(String[] args) {
CaptionTv ctv = new CaptionTv();
ctv.channel = 10;
ctv.channelUp();
System.out.println(ctv.channel);
ctv.displayCaption("Hello,World! 1");
ctv.caption =true;
ctv.displayCaption("Hello,world! 2");
}
}
상속 말고도 클래스를 재사용 하는 방법 존재
▶ 포함 관계
클래스 간 포함 관계를 맺어준다
= 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것
class Circle {
int x; // 원점 x좌표
int y; // 원점의 y좌표
int r; // 반지름
}
class Point {
int x; //x좌표
int y; //y좌표
}
Circle 클래스 내 x, y 좌표를 Point 클래스 타입으로 선언하자.
class Point {
int x; //x좌표
int y; //y좌표
}
class Circle {
Point c = new Point(); //원점
int r;
}
이게 바로 포함관계이다.
Circle 클래스 작성할 때 다른 클래스인 Point를 멤버변수로 선언하여 포함시킨 것.
재사용함으로서 간결하고 손쉽게 클래스 작성 가능.
그런데....
이게 상속이랑 뭐가 다를까?
위 코드를 상속 관계로서 짜보자.
class Point {
int x; //x좌표
int y; //y좌표
}
class Circle extends Point {
int r;
}
별다를 것 없어보인다.
상속 관계: "~는 ~이다."
포함 관계: "~는 ~를 가지고 있다"
(여기서 ~는 클래스를 의미)
예를들어,
- [상속관계] Circle은 Point이다?
- [포함관계] Circle은 Point를 가지고 있다.
아무래도 아래 쪽이 더 자연스럽다. (포함관계)
다른 예를 들어보면,
- [상속관계] CaptionTv는 Tv이다.
- [포함관계] CaptionTv는 Tv를 가지고 있다.
아무래도 위쪽이 더 자연스럽다. (상속관계)
JAVA의 특징 중 하나 단일 상속(single inheritance)
단일 상속만을 허락함.
- 다중 상속을 하는 언어 C++.
- 그러나 실제로 C++에서도 많이 쓰이지는 않는다.
(많은 프로그래머들이 득보다 실이 많다고 판단함)
다중상속 허용 시 여러 클래스로부터 상속 받음으로서, 복합적인 기능을 가진 클래스를 쉽게 작성 가능.
그러나... 클래스 간 관계가 복잡해지며, 상속받은 멤버 간 이름 중복의 문제도 존재함.
ex) 오락 클래스는 tv와 dvd 클래스의 자손 클래스이다. 그런데 tv, dvd 둘 모두 power() 메서드가 존재하는 것. 어떤 조상의 power()를 상속받는지 확실치 않음.
단일 상속이 하나의 조상 클래스만을 가질 수 있기에, 다중 상속에 비해 불편한 점도 있으나.. 클래스 간 관계가 보다 명확해지고 코드를 신뢰할 수 있게 만들어준다.
Object 클래스 - 모든 클래스의 조상
모든 클래스의 최상단에 존재하는 클래스가 Object이다.
- 해당 클래스가 존재하는 패키지는 "java.lang"
- 자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합.
- 무튼 모든 클래스의 최상단에 존재한다는 건..모든 클래스가 Object의 멤버변수에 접근이 가능하다.
ex) toString(), equals() 메서드 등...
'프로그래밍 > java' 카테고리의 다른 글
[JAVA] 다형성(polymorphism) (0) | 2022.08.28 |
---|---|
[JAVA] 패키지와 import, 제어자, 겟터와 셋터 (0) | 2022.08.28 |
[JAVA] 오버라이딩(overriding)과 참조변수 super, super() 생성자 (0) | 2022.08.27 |
[JAVA] 객체, 인스턴스, 클래스, 메서드, 변수, static (0) | 2022.08.26 |
[JAVA] 2차원 배열과 초기화 (0) | 2022.08.25 |