상속
: 객체지향 프로그래밍의 특성 중 하나
: 원래 존재하던 클래스를 확장하여 재사용할 수 있도록 하는 것
: 코드 중복을 제거하고 확장성을 높일 수 있음
: extends 키워드를 사용하여 확장
class SuperClass {}; // 부모 클래스(ParentBook)
class SubClass extends SuperClass {}; // 자식 클래스(ChildBook)
부모 클래스
class Human {
String name;
int age;
void sleep () {
System.out.println(name + "가 잠을 주무십니다.");
}
}
* 부모 클래스를 바꾸면 상속 받은 자식 클래스도 바꿀 수 있음
자식 클래스
class Teacher extends Human {
String course;
void teach () {
System.out.println(name + "가 " + course + "를 가르칩니다.");
}
}
class Developer extends Human {
String position;
void develop () {
System.out.println(name + "가 " + position + " 개발을 합니다.");
}
}
JAVA에서는 클래스의 단일 상속만 지원함
: 다이아몬드 문제를 방지하기 위함
* 다이아몬드 문제 : 다중 상속을 했을 때 발생하는 메서드 호출의 모호성
부모 클래스2
class Animal {
String species;
void sleep () {
System.out.println("잠을 잡니다.");
}
}
* 자식 클래스는 이미 Human을 받고 있는 상태에서 Animal을 받게 되면 누구의 sleep을 받아야하는지 컴퓨터가 구분하지 못하기 때문에 단일 상속을 함
★ 모든 클래스는 'Object' 라고하는 최상위 클래스를 반드시 상속받고 있음
public class B_inheritance {
public static void main(String[] args) {
Human human1 = new Human();
human1.name = "홍길동";
human1.age = 0;
human1.sleep();
Teacher teacher1 = new Teacher(); // Human의 기능과 teacher 기능을 함께 가지게 됨
teacher1.name = "김철수";
teacher1.age = 10;
teacher1.course = "국어";
teacher1.sleep();
teacher1.teach();
Developer developer1 = new Developer();
developer1.name = "이영희";
developer1.age = 20;
developer1.position = "백엔드";
developer1.sleep();
developer1.develop();
}
}
결과 출력
홍길동가 잠을 주무십니다.
김철수가 잠을 주무십니다.
김철수가 국어를 가르칩니다.
이영희가 잠을 주무십니다.
이영희가 백엔드 개발을 합니다.
오버라이딩
: 하위 클래스에서 상위 클래스의 메서드를 재정의 하는 것
규칙
1. 상위 클래스에서 선언된 메서드와 메서드 이름, 매개변수의 조합이 같아야 함
2. 상위 클래스에서 선언된 메서드가 final로 선언되면 재정의가 불가능
3. 상위 클래스에서 선언된 메서드가 더 좁은 범위의 접근 제어를 할 수 없음
부모 클래스
class SuperClass1 {
int superInstanceVariable;
SuperClass1 (int superInstanceVariable) {
this.superInstanceVariable = superInstanceVariable;
}
void instanceMethod () {
System.out.println("조상 클래스의 메서드입니다."); // 조상 클래스의 메서드입니다.
}
}
* super() : 부모 클래스의 생성자를 호출하는 키워드
: 부모 클래스에서 기본 생성자가 없다면 자식 클래스의 생성자에서
반드시 부모 클래스의 생성자를 호출 해야함
→ 명시적 생성자 선언이 없다면 컴파일러는 알아서 기본 생성자를 생성하여 호출
→ 부모클래스는 명시적 생성자 선언X, 자식 클래스는 명시적 생성자 선언 O
→ 컴파일러가 super();를 알아서 생성하여 super();가 부모 클래스의 기본 생성자를 컴파일러가 호출함
class SubClass1 extends SuperClass1 {
// void instanceMethod () { // 오버라이딩한 것
// System.out.println("SubClass1의 인스턴스 메서드입니다.");
// }
// SuperClass1을 상속된 상태에서는 아래 메서드(1)를 가지고 있음
//(1) void instanceMathod () {...} 가지고 있는 상태에서
// 'void instanceMethod ()' 메서드를 이미 가지고 있기 때문에
// 아래 메서드는 'void instanceMethod ()' 메서드를 오버로드 한것
void instanceMethod (String string) {
System.out.println(string);
}
// void instanceMathod (String string) {
// System.out.println(string);
// }
SubClass1() {
// : 부모 클래스의 생성자 호출
super(10);
}
}
@Override
: 컴파일러에게 아래에 오는 메서드가 오버라이드 메서드라는 것을 알려주는 것
: 가독성 향상과 개발자의 실수를 방지할 수 있음
class SubClass2 extends SuperClass1 {
SubClass2 (int superInstanceVariable) {
super(superInstanceVariable);
}
@Override // 오버라이딩
void instanceMethod () {
// super 키워드 : 자손 클래스에서 조상클래스의 필드 혹은 메서드에 접근할 때 사용
super.instanceMethod();
System.out.println("SubClass2의 인스턴스 메서드입니다.");
}
}
public class B_Overriding {
public static void main(String[] args) {
SuperClass1 instance1 = new SuperClass1(0);
SubClass1 instance2 = new SubClass1(); // SubClass1()에서 super(10)을 가져옴
SubClass2 instance3 = new SubClass2(50);
System.out.println(instance1.superInstanceVariable); // 0
System.out.println(instance2.superInstanceVariable); // 10
System.out.println(instance3.superInstanceVariable); // 50
}
}
'AWS(산대특)' 카테고리의 다른 글
DAY 8 - JAVA (0) | 2024.01.29 |
---|---|
DAY 7 - JAVA (0) | 2024.01.28 |
객체지향 프로그래밍 보충 (0) | 2024.01.25 |
DAY 5 -JAVA (0) | 2024.01.24 |
JAVA class 만들기 (0) | 2024.01.23 |