한 클래스가 다른 클래스의 특성과 동작(메서드)을 물려받을 수 있게 함
▶ 주요 개념
- 상속 (Inheritance): 한 클래스가 다른 클래스의 특성과 동작을 물려받는 것
- 부모 클래스 (Super/Parent/Base Class): 특성과 동작을 물려주는 클래스
- 자식 클래스 (Sub/Child/Derived Class): 특성과 동작을 물려받는 클래스
- super 키워드: 부모 클래스의 생성자나 메서드를 호출할 때 사용
- 오버라이드 (Override): 자식 클래스에서 부모 클래스의 메서드를 재정의하는 것
▶ 예제와 함께 보기
// 상위 클래스 (부모 클래스)
public class Parents {
// 멤버 변수
String familyName;
// 생성자
public Parents(String familyName) {
this.familyName = familyName;
}
// 메서드
public void showFamilyName() {
System.out.println("Family name is " + familyName);
}
}
// 하위 클래스 (자식 클래스)
public class Child extends Parents {
// 추가 멤버 변수
String firstName;
// 생성자
public Child(String familyName, String firstName) {
super(familyName); // 부모 클래스의 생성자 호출
this.firstName = firstName;
}
// 메서드 오버라이드 (부모 클래스의 메서드를 재정의)
@Override
public void showFamilyName() {
System.out.println("Child's full name is " + firstName + " " + familyName);
}
}
// 메인 클래스
public class Main {
public static void main(String[] args) {
// Parents 객체 생성
Parents parent = new Parents("Smith");
parent.showFamilyName(); // "Family name is Smith" 출력
// Child 객체 생성
Child child = new Child("Smith", "John");
child.showFamilyName(); // "Child's full name is John Smith" 출력
}
}
상속을 사용하여 자식 클래스가 부모 클래스의 멤버를 물려받고, 이를 확장하거나 변경할 수 있음을 알 수 있음
▶ 다형성과 캐스팅
다형성(Polymorphism) : 상속 관계에 있는 클래스들 간의 상호 작용을 통해 다양한 형태를 갖도록 하는 것
다형성에서 부모-자식 관계에서 캐스팅을 사용할 수 있음
이 때, 참조 변수가 사용할 수 있는 멤버의 개수가, 실제 인스턴스의 멤버의 변수보다 작아야 함
부모 ← 자식 (화살표 방향에 유의하기!)
▷ 예제와 함께 보기
class Parent{}
class Child extends Parent{}
class Person{}
라는 클래스 3개가 있다고 가정해보자!
Parent p1 = new Parent();
Child c1 = new Child();
Person pp = new Person();
각각의 객체를 생성해주자!
이때
Parent p2 = new Child(); // 가능
Child c2 = new Parent(); // 불가능
→ 참조 변수가 사용할 수 있는 멤버의 개수가, 실제 인스턴스의 멤버의 변수보다 작아야 함
이렇게 하면 p2는 Parent 타입이지만, 실제로는 Child 객체를 참조하게 됨
이 경우, p2는 Parent 클래스에 정의된 멤버들만 사용할 수 있음
▷ 참조변수 : 객체를 참조(포인팅)하는 변수. 참조 변수를 통해 객체의 메서드와 속성에 접근할 수 있음
// 부모 클래스
class Parent {
void parentMethod() {
System.out.println("Parent method");
}
}
// 자식 클래스
class Child extends Parent {
void childMethod() {
System.out.println("Child method");
}
}
// 메인 클래스
public class Main {
public static void main(String[] args) {
// 참조 변수 p1, c1, p2, c2 선언
Parent p1 = new Parent(); // p1은 Parent 객체를 참조
Child c1 = new Child(); // c1은 Child 객체를 참조
Parent p2 = new Child(); // p2는 Child 객체를 참조 (부모 타입의 참조 변수)
p1.parentMethod(); // 가능
c1.parentMethod(); // 가능 (상속받았으므로)
c1.childMethod(); // 가능
p2.parentMethod(); // 가능
// p2.childMethod(); // 불가능, p2는 Parent 타입이므로 Child의 메서드를 사용할 수 없음
// 강제 캐스팅
Child c2 = (Child) p2;
c2.childMethod(); // 가능, 이제 p2는 Child 타입으로 캐스팅 되었으므로 Child의 메서드를 사용할 수 있음
}
}
'Language > Studying' 카테고리의 다른 글
[Java] Java API (0) | 2024.07.17 |
---|---|
[Java] Heap 영역과 Stack 영역 (feat. 동적할당, 정적할당) (0) | 2024.07.16 |
[Java] ArrayList와 HashMap (0) | 2024.07.08 |
[Java] this와 super (0) | 2024.07.04 |
## 코딩테스트 연습문제 (0) | 2023.08.09 |