본문 바로가기

Java/문법

10-1장 클래스 상속의 개념과 문법적 특징

상속

 - 부모 클래스의 멤버(필드, 메서드, 이너 클래스)를 내려받아 자식 클래스 내부에 포함시키는 자바의 문법 요소 

 

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