클래스의 상속(inheritance)
by mignon25오늘 배운 것을 나에게 설명해주기.
상속이란?
상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것.
상속의 장점 - 다형성 의 표현
- 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있다.
- 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.
- 코드의 재사용성이 높아지고 코드의 중복이 제거되어 프로그램의 생산성과 유지보수에 크게 기여한다.
상속의 구현
새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 extends와 함께 써주면 된다.
class Parent { // 조상 클래스 Parent
// ...
}
class Child extends Parent { // 자손 클래스 Child
// ...
}
Parent와 Child 클래스는 서로 상속관계에 있다고 하며,
상속해주는 클래스를 조상(부모, 상위) 클래스라고 하고, 상속받는 클래스를 자손(자식, 하위) 클래스라고 한다.
상속의 특징
- 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
- 하위 클래스의 멤버 개수는 상위 클래스보다 항상 같거나 많다.
- 하위 클래스의 인스턴스를 생성하면 상위 클래스의 멤버와 하위 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성된다.
상속 예시
class Tv { // 상위 클래스
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
class CaptionTv extends Tv { // 하위 클래스 // Tv 상속
boolean caption; // 캡션상태 on/off // 하위 클래스의 멤버 => 상위 클래스에는 없다.
void displayCaption(String text) { // 하위 클래스의 멤버 => 상위 클래스에는 없다.
if(caption) { // 캡션 상태가 on(true)일 때만 text를 보여준다.
System.out.println(text);
}
}
}
public class Test {
public static void main(String[] args) {
CaptionTv ctv = new CaptionTv();
ctv.channel = 10; // 상위 클래스로부터 상속받은 멤버
ctv.channelUp(); // 상위 클래스로부터 상속받은 멤버
System.out.println(ctv.channel);
ctv.displayCaption("Hello, World"); // 출력 X
ctv.caption = true;
ctv.displayCaption("Hello, World"); // Hello, World
}
}
클래스 간의 관계 - 포함관계(Composite)
클래스를 재사용하는 또 다른 방법.
한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것.
class Circle {
int x; // 원점 x 좌표
int y; // 원점 y 좌표
int r; // 반지름
}
class Point {
int x; // x 좌표
int y; // y 좌표
}
// Point 클래스를 재사용해서 Circle 클래스 작성
class Circle {
Point c = new Point();
int r;
}
하나의 거대한 클래스를 작성하는 것보다 이렇게 단위별로 여러 개의 클래스를 작성한 다음, 단위 클래스들을 포함관계로 재사용하면 보다 간결하고 손쉽게 클래스를 작성할 수 있다.
상속관계 vs 포함관계
- ~은 ... 이다 의 관계 : 상속
- ~은 ...을 가지고 있다 의 관계 : 포함관계
양자택일의 상황이라면 조금이라도 위의 기준에 가까운 방향으로 관계를 설정해주자.
그리고 자바는 다른 객체지향 언어와 달리 다중상속이 불가능하고 단일상속만을 허용한다.
(다중 상속은 클래스 간의 관계가 복잡해지고, 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별할 수 있는 방법이 없다.)
대신 상속과 포함을 적절히 함께 사용하면 다중 상속의 단점은 보완하면서 여러 클래스로부터 상속받는 효과를 낼 수 있다.
Object 클래스
모든 클래스 상속계층도의 최상위에 있는 모든 클래스의 상위 클래스.
- 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 된다.
(컴파일러가 자동적으로 'extends Object' 추가) - toString(), equals() 와 같은 모든 인스턴스가 가져야 할 기본적인 11개의 메서드가 정의되어 있다. (몇 가지 예시 👇🏻)
| 메서드명 | 반환타입 | 주요 내용 |
| toString() | String | 객체 정보를 문자열로 출력 |
| equals(Object obj) | boolean | 등가 비교 연산(==)과 동일하게 스택 메모리값을 비교 |
| hashCode() | int | 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단 |
| wait() | void | 현재 쓰레드 일시 정지 |
| notify() | void | 일시정지 중인 쓰레드 재동작 |
'Java' 카테고리의 다른 글
| 오버라이딩(overriding), super, super() (feat. this, this()) (0) | 2023.02.25 |
|---|---|
| Inner Class - Instance, Static, Local (0) | 2023.02.24 |
| 오버로딩(overloading), 생성자(Constructor), 초기화 블럭(initialization block) (0) | 2023.02.23 |
| [객체지향 프로그래밍] 변수와 메서드 (0) | 2023.02.22 |
| 객체지향 프로그래밍 공부를 시작하며... (0) | 2023.02.21 |
블로그의 정보
Mignon'S Dev Log
mignon25