클래스 상속 (Inheritance)
// 상속
class 자식클래스 extends 부모클래스 {
코드;
}
- 자식 클래스가 부모 클래스의 멤버변수/메서드를 물려 받음
- 새로운 클래스를 정의할 때, 이미 구현된 다른 클래스를 상속받아서 속성/기능을 확장시켜 클래스를 구현함
→ 상속을 하는 부모 클래스보다 상속을 받는 자식 클래스의 데이터가 더 크고 구체적임
( == 부모 클래스는 자식 클래스보다 더 일반적임)
- 상속받는 클래스끼리 멤버변수/메서드가 동일하면, 자식 클래스 파일에서는 코드를 제거하고
부모 클래스에만 입력해도 상속받아서 사용할 수 있음
- 자식 클래스 객체로 어떤 메서드를 실행하면, 우선 자식 클래스 자신에게 그 메서드가 있는지 확인함
→ 자신에게 해당 메서드가 없다면 부모 클래스에 있는 메서드를 확인해서 사용함
→ '메서드 오버라이드' : 부모 클래스의 메서드를 자식 클래스가 재정의함
- 상속하는 클래스 명칭
→ 상위 클래스, 부모 클래스(parent class), 슈퍼 클래스(super class)
- 상속받는 클래스 명칭
→ 하위 클래스, 자식 클래스(child class), 서브 클래스(sub class)
// 예시 //
// 부모 클래스
public class Fruit {
// 자식 클래스들의 공통된 멤버변수
String name;
int price;
}
--------------------------------
// 자식 클래스
public class Banana extends Fruit {
// Banana 클래스에 필요한 멤버변수 추가
String origin;
public Banana() {
name = "바나나";
price = 5000;
origin = "필리핀";
}
}
# 상속 시 접근 제어자
- 기존에 멤버변수처럼 'private'를 사용하면, 타 패키지의 하위 클래스에서 접근할 수 없음
→ 패키지 외부 클래스는 접근할 수 없지만, 하위 클래스인 경우 접근 가능한 'protected' 사용
- 접근 제어자 관련 설명 : https://young0105.tistory.com/34
# 다중 상속 불가능
- 예외 사례 단 한 가지가 있음 (Object 클래스)
하위 클래스의 생성
- 하위 클래스의 생성자에서는 반드시 상위 클래스의 생성자를 호출함 (자동으로 메모리에 로드됨)
→ 명시하지 않으면 기본 생성자가 호출됨
- 항상 상위 클래스의 인스턴스가 먼저 생성되고, 그 다음에 하위 클래스의 인스턴스가 생성됨
# 부모 클래스에 사용자 정의 생성자가 있는 경우
- 자식 클래스의 생성자에서 반드시 부모 클래스의 생성자를 가장 먼저 호출해야 함 ★
(부모 클래스에 기본 생성자가 없어서 오류가 발생하기 때문임)
// 예시 //
// 부모 클래스 생성자
public 부모클래스(String name, int hp) {
this.name = name;
this.hp = hp;
}
// 자식 클래스 생성자
public 자식클래스(String name, int hp) {
super(name, hp); // 부모 생성자 호출
코드 ; // <- 부모 생성자 호출 이후 코드는 오류 X
}
# super 키워드
- 하위 클래스가 가지는 상위 클래스에 대한 참조 값 : super.메서드명
- 상위 클래스의 생성자를 호출함 : super();
메서드 오버라이드 (Method override)
- 부모 클래스에 정의된 메서드의 내용이 자식 클래스에 적합하지 않을 경우,
자식 클래스에서 동일한 이름으로 부모 클래스의 메서드를 재정의할 수 있음
- 선언부가 기존의 메서드와 다른 경우 에러
: 메서드의 이름, 파라미터 타입 및 개수, 반환 타입
- 메서드의 동작을 변경/확장하기 위해 사용됨
- 상속 관계에서 발생함
// 예시 //
// 부모 클래스의 메서드
public void move() {
System.out.println("동물이 움직입니다.");
}
-------------------------------
// 자식 클래스의 메서드
@Override
public void move() {
System.out.println("사람이 두 발로 걷습니다.");
}
// 결과
// 자식 클래스에서 move() 메서드를 호출하면 "사람이 두 발로 걷습니다" 출력
메서드 오버로딩 (Method overloading)
- 매개변수의 조합이 다른, 같은 이름의 메서드를 여러 개 구현하는 것
- 매개변수로 다양한 자료형의 값을 받을 수 있음
- 같은 클래스 내에서 발생함
- 같은 이름의 메서드가 다른 입력에 대해 다르게 동작하게 하기 위해 사용됨
기타 메모
- 어노테이션 (Annotation)
: 주석 + 힌트 ⇒ 컴파일러에게 특별한 정보를 제공하는 역할
- 상속 관계와 포함 관계를 혼동하지 않도록 주의
- 추상화 : 객체에 필요한 상태와 속성을 추출해서 클래스를 설계하는 것
- 코드 설계 Tip
: 처음부터 상속해서 설계하는 게 아니라, Bottom-up 방식으로 하위 요소들부터 만든 후
공통적인 부분이 보인다면 가독성을 높이기 위해 상속을 사용하기
(예외 : UML 클래스 다이어그램에서 상속을 사용하라고 제시된 경우)
'Java > Base' 카테고리의 다른 글
[Java] 문자열 자료형 (String) (0) | 2023.02.10 |
---|---|
[Java] 상속 관계의 다형성과 참조형 형 변환 (0) | 2023.02.09 |
[Java] 배열 (0) | 2023.02.09 |
[Java] static 키워드 (0) | 2023.02.09 |
[Java] this 키워드와 super 키워드 (0) | 2023.02.08 |