본문 바로가기
Java

[Java] 상속 관계와 메서드 오버라이드

by 스응 2023. 2. 9.
728x90
728x90

클래스 상속 (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();

 

 

 

반응형
728x90

메서드 오버라이드 (Method override)

  - 부모 클래스에 정의된 메서드의 내용이 자식 클래스에 적합하지 않을 경우,

    자식 클래스에서 동일한 이름으로 부모 클래스의 메서드를 재정의할 수 있음

  - 선언부가 기존의 메서드와 다른 경우 에러

      : 메서드의 이름, 파라미터 타입 및 개수, 반환 타입

  - 메서드의 동작을 변경/확장하기 위해 사용됨

  - 상속 관계에서 발생함

 

// 예시 //

// 부모 클래스의 메서드
public void move() {
    System.out.println("동물이 움직입니다.");
}

-------------------------------

// 자식 클래스의 메서드
@Override
public void move() {
    System.out.println("사람이 두 발로 걷습니다.");
}

// 결과
// 자식 클래스에서 move() 메서드를 호출하면 "사람이 두 발로 걷습니다" 출력

 

메서드 오버로딩 (Method overloading)

  - 매개변수의 조합이 다른, 같은 이름의 메서드를 여러 개 구현하는 것

  - 매개변수로 다양한 자료형의 값을 받을 수 있음

  - 같은 클래스 내에서 발생함

  - 같은 이름의 메서드가 다른 입력에 대해 다르게 동작하게 하기 위해 사용됨

 

 


기타 메모

- 어노테이션 (Annotation)
    : 주석 + 힌트 ⇒ 컴파일러에게 특별한 정보를 제공하는 역할
- 상속 관계와 포함 관계를 혼동하지 않도록 주의
- 추상화 : 객체에 필요한 상태와 속성을 추출해서 클래스를 설계하는 것
- 코드 설계 Tip
    : 처음부터 상속해서 설계하는 게 아니라, Bottom-up 방식으로 하위 요소들부터 만든 후
      공통적인 부분이 보인다면 가독성을 높이기 위해 상속을 사용하기
      (예외 : UML 클래스 다이어그램에서 상속을 사용하라고 제시된 경우)

 

320x100
반응형

'Java' 카테고리의 다른 글

[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

댓글