상속과 다형성 - 1. 클래스의 상속

Ⅰ. 클래스의 상속

1. 상속의 개념

 - 상속 : 기존의 클래스로부터 자원을 물려받아 재사용하는 것 (상속은 확장의 개념)

    ※ 자바에서 만드는 모든 클래스는 자바 기본 클래스인 Object의 자식임

 - 부모클래스의 멤버(필드, 메소드, 이너클래스)를 자식클래스가 내려받아(상속) 클래스 내부에 포함

 - 자바의 상속은 오로지 위에서 아래로만 진행

    - 물려주는 클래스 : 부모클래스, 상위클래스, 슈퍼클래스, 기초클래스

    - 물려받는 클래스 : 자식클래스, 하위클래스, 서브클래스, 유도클래스

// Example
package Sample;

// class : 참조자료형(객체를 만드는 자료형)을 설계한 것
// 접근 제어 지시자 : 사용 가능 범위를 선언함
class Human {
	String name;
	int age;
	// 위에 2개는 필드
	void eat(String food) {
		System.out.printf("%s를 먹는다\n", food);
	}
	void eat() {					// 메소드 오버로딩
		System.out.println("음식을 먹는다");
	}
	static void sleep() {} 				// 이렇게 하면 Human없이도 sleep을 사용가능
	// 위에 3개는 메소드
}

public class Main {					// public을 사용한 클래스는 파일에 1개만 존재
	public static void main(String[] args) {
		Human person = new Human();
		person.name = "뽀로로";
		person.age = 10;
		person.eat("아보카도");
		person.eat();				// 메소드 오버로딩
		person.sleep();
		Human.sleep();
	}
}

 

2. 상속의 장점

- 코드의 중복성 제거
- 다형적 표현 가능 (가장 중요한 장점)

    - 코드에 간결함에 크게 이바지함
    ※ 다형성 : 부모클래스 또는 부모 인터페이스로 선언한 참조변수자식클래스로 만든 객체를 참조 가능
        따라서 상속을 할 때는 클래스 간의 관계를 다음과 같음

        => A is a B (ex: 학생 is a 사람)
    ※ is a 관계를 적절하게 형성해야 재사용성, 확장성이 향상됨

// Example
package Sample;

class Human {					// 부모클래스
	String name;
	int age;
	void eat() {};
	void sleep() {}
}

// Human을 상속해 만드는 Student 클래스 (extends는 확장할 때 사용)
class Student extends Human {			// 자식클래스
	// 이 안에 있는것은 Human과 아무 관계 없음, Student만 관계있음(올라가기 불가능)
	String StudentId;
	void gotoSchool() {};
}

// Human을 상속해 만드는 Worker 클래스
class Worker extends Human {			// 자식클래스
	String WorkId;
	void gotoWork() {}
}

public class Main {
	public static void main(String[] args) {
		// 부모 클래스 타입은 자식 클래스 객체를 참조할 수 있다 (다형적 특성)
		Human aaa = new Human();
		Human bbb = new Student();		// 부모의 자원만 호출 가능
		Human ccc = new Worker();		// 부모의 자원만 호출 가능
		Student ddd = new Student();
		Worker eee = new Worker();
		
		bbb.eat();
		bbb.sleep();
		// bbb.gotoSchool(); → 이건 할 수 없음
	}
}

 

3. 상속 문법

 - extends 키워드 사용

 - 다중 상속 불가

 

부모클래스가 둘이 될 수는 없지만 자식클래스는 여러 개 가능

 

4. 상속시, 메모리의 구조

-  상속을 받으면 부모클래스의 멤버를 가질 수 있는 이유

    - 객체 속에 부모클래스의 객체를 먼저 생성하여 포함하기 때문

 

// Example
package sample;

// 클래스의 업캐스팅 및 다운캐스팅

// 클래스의 상속관계
class A {
	int m = 3;
	void abc() {
		System.out.println("A 클래스");
	}
}

class B extends A {
	int n = 4;
	void bcd() {
		System.out.println("B 클래스");
	}
}

public class Main {
	public static void main(String[] args) {		
		// 1. A 타입   / A 생성자
		A aa = new A();
		System.out.println(aa.m);	// 3
		aa.abc();			// A 클래스
		
		// 2. B 타입 / B 생성자
		B bb = new B();
		System.out.println(bb.m);	// 3
		System.out.println(bb.n);	// 4
		bb.abc();			// A 클래스
		bb.bcd();			// B 클래스
		
		// 3. A 타입 / B 생성자 : 다형적 표현
		A ab = new B();
		System.out.println(ab.m);	// 3
		ab.abc();			// A 클래스
	}
}

 

5. 생성자의 상속 여부

 

6. 객체의 다형적 표현