Ⅰ. 클래스의 상속
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. 객체의 다형적 표현
'Programming Language > Java' 카테고리의 다른 글
상속과 다형성 - 3. 메소드 오버라이딩(Overriding) (0) | 2022.07.12 |
---|---|
상속과 다형성 - 2. 객체의 타입변환 (0) | 2022.07.12 |
자바 제어자1 (modifier) - 2. Static (0) | 2022.07.12 |
자바 제어자1 (modifier) - 1. 접근지정자 (0) | 2022.07.11 |
클래스 외부 구성요소 - 2. 외부클래스(external class) (0) | 2022.07.11 |