[작성일: 2023. 01. 26]
목차
상속(Inheritance)
- 기존의 클래스로 새로운 클래스를 작성하는 것
- 객체지향의 가장 큰 특징: *코드의 재사용
- 두 클래스를 부모와 자식으로 관계를 맺어주는 것
- 부모 객체가 먼저 생성되고 자식 객체가 생성 됨.
- 부모 클래스로부터 변수와 메서드를 물려받는 것
- 클래스를 만들 때 처음부터 모든 것을 만드는 것이 아니라, 부모로부터 상속을 받고 추가적인 것만 새로 만들거나 고치는 것
✏️ 용어
부모 클래스, super, 상위 클래스, 베이스 클래스 ➡️ 주는 쪽
자식 클래스, 서브, 하위, 파생(Derived) ➡️ 받는 쪽
class 자식클래스 extends 부모클래스 { // ... } class Parent {} // 기존의 클래스 class Child extends Parent { // ... }
- 자손은 조상(부모의 부모)의 모든 멤버를 상속받음. (생성자, 초기화 블럭 제외)
- 자손의 멤버 개수는 조상보다 적을 수 없음. (같거나 많음.) ➡ 조상의 모든 멤버를 상속받기 때문.
class Parent {
int age; // 부모는 멤버 1개
}
class Child extends Parent{}
//멤버 0개 (실제로는 멤버 1개-> 상속받은 멤버 1개 존재)
- 자손의 변경은 조상에 영향을 미치지 않음.
class Parent { // 멤버 1개
int age;
}
class Child extends Parent {
void play() { // 새로운 멤버 추가
System.out.println("놀자~");
// 자신의 멤버 1개+ 상속 멤버1개 = 멤버 2개
}
}
연습예제 1
// 부모가 될 클래스 생성
class Point {
int x;
int y;
}
// 1. 부모 클래스와 관계없는 새로운 클래스
// 부모 클래스를 변경해도 전혀 관여받지 않음.
class Point3D {
int x;
int y;
int z;
// 2. 부모 클래스와 상속관계
// 부모 클래스가 바뀌면 Point3D 클래스에도 영향을 미침
class Point3D extends Point {
int z;
}
연습예제 2
class Tv {
boolean power; // 전원상태 (on/off)
int channel; // 채널
void power() { power = !power; }
void channelup() { ++channel; }
void cannelDown() { --channel; }
}
class SmartTv extends Tv {
boolean caption;
void displayCaption(String text) {
if (caption) { // 캡션 상태가 true일 때 text 보여줌.
System.out.println(text);
}
}
}
class Ex7_1 {
public static void main(String args[]) {
SmartTv stv = new SmartTv();
stv.channel = 10; // 조상 클래스로부터 상속받은 멤버
stv.channelUp(); // 조상 클래스로부터 상속받은 멤버
System.out.println(stv.channel);
stv.displayCaption("Hello, World");
stv.caption = true;
stv.displayCaption("Hello, World");
}
}
포함(Composite)
- 클래스의 멤버로 참조변수를 선언하는 것.
- 작은 단위의 클래스를 만들고, 이들을 조합해서 클래스를 만듦.
class Circle {
int x; // 원점의 x 좌표
int y; // 원점의 y 좌표
int r; // 반지름
}
⬇
class Circle { // circle이 point를 포함하고 있는 관계
Point c = new Point(); // 원점
int r; // 반지름
}
class Point {
int x;
int y;
}
클래스 간의 관계 결정하기
- 상속관계 'A는 B이다.(is-a)'
- 포함관계 'A는 B를 가지고 있다.(has-a)'
// 더 자연스러운 코드는?
// 1.
class Circle { // 포함
Point p = new Point();
int r;
}
// 2.
class Circle extends Point { // 상속
int r;
}
class Point {
int x;
int y;
}
public class InheritanceTest {
public static void main(String[] args) {
Circle c = new Circle();
c.x = 1;
c.y = 2;
c.r = 3;
//System.out.println("c.x="+c.z);
//System.out.println("c.y="+c.y);
System.out.println("c.p.x="+c.p.x);
System.out.println("c.p.y="+c.p.y);
System.out.println("c.r="+c.r);
}
}
✏️ 원(Circle)은 점(Point)이다. - Circle is a Point.
✏️ 원(Circle)은 점(Point)을 가지고 있다. - Circle has a Point. ✅
단일 상속(Single Inheritance)
- Java는 단일 상속만 허용함.
- 비중이 높은 클래스 하나만 상속관계, 나머지는 포함관계로 함.
class TvDVD extends Tv, DVD {
// ... // 에러. 조상은 하나만 허용됨.
}
Object클래스
- 모든 클래스의 조상
- 부모가 없는 클래스는 자동적으로 Object 클래스를 상속받음.
- 모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받음.
- toString(), equals(Object obj), hashCode(), ...
class Tv extends Object { // 컴파일러 자동 추가
// ...
}
class SmartTv extends Tv {
// ...
}
🐣 해당 게시글은 자바의 정석(남궁성 님) 영상으로 함께 공부하며 요약/정리한 글입니다.
🐣 입문 개발자가 작성한 글이므로 틀린 내용이나 오타가 있을 수 있습니다.