상속
- 부모 클래스의 멤버(필드, 메서드, 이너 클래스)를 내려받아 자식 클래스 내부에 포함시키는 자바의 문법 요소
1. 상속의 개념
- 부모 클래스 : 사람 클래스
- 자식 클래스 : 대학생 클래스, 직장인 클래스
- 두 자식 클래스는 부모의 모든 멤버를 내려받기 때문에 대학생과 직장인 클래스 내에서는 추가 필드와 메서드만 구성하면됨
- UML로 상속을 표시할 때는 화살표를 부모 클래스 쪽으로 향하게
- 부모 클래스에서 자식 클래스로 갈수록 더 많은 특징과 기능이 구체화되므로 범위가 좁아짐(동물 <- 사람 <- 학생 <- 대학생)
2. 상속의 장점
1) 코드의 중복성 제거
2) 클래스의 다형적 표현 가능
- 다형성(polymorphism)
- 1개의 객체를 여러 가지 모양으로 표현할 수 있는 특성
- '대학생은 대학생이다' (o)
- '대학생은 사람이다' (o)
- '사람은 대학생이다' (x)
- 상속 구조도에서 화살표 방향으로는 항상 다형적 표현 가능
- ex)
사과, 포도, 키위 클래스를 만들고 각각의 객체를 2개, 3개, 3개씩 만들어 배열로 관리
- 배열은 같은 자료형만 저장할 수 있으므로 3개의 배열 자료형으로 따로 만들어 관리
- 3개의 서로 다른 과일 배열 자료형
사과[] apple = {new 사과{}, new 사과()};
포도[] grape = {new 포도{}, new 포도{}};
키위[] kiwi = {new 키위{}, new 키위{}, new 키위{}};
- '과일' 이라는 부모 클래슬르 만들어 각각에게 상속시키면 다형적 표현 가능
과일 fruit1 = new 사과() //사과는 과일이다.
과일 fruit2 = new 포도() //포도는 과일이다.
과일 fruit3 = new 키위() //키위는 과일이다.
- 모든 객체를 과일 배열 하나로 관리 가능
- 1개의 배열 자료형으로 여러 과일 객체 저장
과일[] fruits = {new 사과(), new 사과(),
new 포도(), new 포도(), new 키위(), new 키위(), new 키위()};
3. 상속 문법
- extends 키워드 사용
class 자식 클래스 extends 부모 클래스 {
...
}
- 자바의 클래스는 다중 상속(부모 클래스가 2개 이상) 불가 -> 모호성(ambiguous) 발생
- 클래스의 상속과 사용할 수 있는 멤버
package Inheritance;
class Human {
String name;
int age;
void eat() {}
void sleep() {}
}
class Student extends Human {
//Human 클래스 상속
int studentID;
void goToSchool() {}
}
class Worker extends Human {
//Human 클래스 상속
int workerID;
void goToWork() {}
}
public class Inheritance_1 {
public static void main(String[] args) {
//Human 객체 생성
Human h = new Human();
h.name = "김현지";
h.age = 11;
h.eat();
h.sleep();
//student 객체 생성
Student s = new Student();
s.name = "김민성";
s.age = 16;
s.studentID =128; //추가로 정의한 멤버
s.eat();
s.sleep();
s.goToSchool(); //추가로 정의한 멤버
//Worker 객체 생성
Worker w = new Worker();
w.name = "봉윤정";
w.age = 45;
w.workerID =128; //추가로 정의한 멤버
w.eat();
w.sleep();
w.goToWork(); //추가로 정의한 멤버
}
}
4. 상속할 때의 메모리 구조
class A {
int m;
void abc() {...}
}
class B extends A {
int n;
void bcd() {...}
}
B b = new B();
- 클래스 영역에는 선언된 자료형의 클래스와 그 부모 클래스가 모두 로딩
- 참조 변수 b는 B 자료형으로 선언됐기 때문에 힙 메모리에 있는 B 타입 객체만을 가리킬 수 있음
- 자바 가상 머신은 자식 클래스의 객체를 생설할 때 가장 먼저 부모 클래스의 객체를 생성
이후 자식 클래스에서 추가한 필드와 메서드가 객체에 추가됨으로써 클래스 B의 전체 객체가 완성되는 것
- 자식 클래스 객체의내부에는 부모 클래스 객체가 포함돼 있으므로 자식 클래스 객체에서 부모 클래스의 멤버를 사용 가능
5. 생성자의 상속 여부
- 생성자는 절대 상속돼서는 안됨
6. 객체의 다형적 표현
- 클래스 A를 상속받아 클래스 B를 생성 (A<-B)
- 상속관계에서 다형성의 코드 표현
A a1 = new A(); //A는 A이다.
A a2 = new B(); //B는 A이다.
- 생성한 객체를 동일한 타입으로 선언 + 자식 클래스의 객체를 부모 클래스 타입으로 선언 가능
- 클래스 A,B,C,D의 상속 구조
class A{}
class B extends A{}
class C ectends B{}
class D extends B{}
- 다형적 표현의 올바른 사용 예
A a = new A();
B b = new B();
C c = new C();
D d = new D();
A a1 = new B();
A a2 = new C();
A a3 = new D();
B b1 = new C();
B b2 = new D();
- 다형적 표현의 잘못된 사용 예
B b1 = new A(); // A는 B이다 (x)
C c1 = new B(); // B는 C이다 (x)
C c2 = new D(); // D는 C이다.(x)
D d1 = new A(); // A는 D이다.(X)
D d2 = new B(); // B는 D이다.(X)
D d3 = new C(); // C는 D이다.(x)
'Java > 문법' 카테고리의 다른 글
10-3장 메서드 오버라이딩 (0) | 2023.05.04 |
---|---|
10-2장 객체의 타입 변환 (0) | 2023.05.04 |
9-2장 static 제어자 (0) | 2023.04.30 |
9-1장 접근 지정자 (0) | 2023.04.30 |
8-2 장 외부 클래스 (0) | 2023.04.24 |