quilt code

[Java] 상속 본문

daily/Java

[Java] 상속

김뱅쇼 2023. 1. 16. 21:09

1. 상속

상속 : 부모 클래스의 멤버를 자식 클래스에게 물려 주는 것 -> 이미 개발된 클래스를 사용해서 새로운 클래스를 만들기 때문에 중복되는 코드를 줄여줌

 

1) 클래스 상속

: 자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 결정하고, 선택된 부모 클래스는 extends 뒤에 기술

class 자식클래스  extends 부모클래스 {
   //필드
   //생성자
   //메소드
     }
ex)

class SportsCar extends Car {

}
  • 여러 개의 부모 클래스를 상속할 수 없음. 단 하나의 부모 클래스만 와야함
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외됨
  • 부모 클래스와 자식 클래스가 다른 패키지에 존재하면 default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외됨

부모 클래스)

자식 클래스)

자식 클래스 사용)

 

2) 부모 생성자 호출

 : 부모 객체가 먼저 생성되고 자식 객체 생성. 부모 생성자는 자식 생성자의 맨 첫 줄에서 호출

public DmbCellPhone() {
   super( );
    }

**super( 매개값 ) **

  • 부모의 기본 생성자 호출
  • 매개값의 타입과 일치하는 부모 생성자 호출
  • 생략되면 컴파일러에 의해 super()가 자동적으로 추가되기 때문에 부모의 기본 생성자가 존재해야함 
  • 부모 클래스에 기본 생성자가 없고 매개 변수가 있는 생성자만 있다면 자식 생성자에서 반드시 부모 생성자 호출을 위해 super(매개값)을 명시적으로 호출해야함 
  • super(매개값)은 반드시 자식 생성자 첫 줄에 위치해야함

>>부모의 기본 생성자가 없음 -> 다른 생성자를 명시적으로 호출해야함 

 

3) 메소드 재정의 

 : 상속된 일부 메소드를 자식 클래스에서 다시 수정해서 사용하는 것. 메소드가 재정의 되었으면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출됨

 

 ① 메소드 재정의 방법

  • 부모의 메소드와 동일한 시그너처(리턴 타입, 메소드 이름, 매개 변수 목록)을 가져야함
  • 접근 제한을 더 강하게 재정의할 수 없음(부모 메소드가 public 접근 제한의 경우, 재정의 하는 자식 메소드는 default나 private 접근 제한으로 수정할 수 없음)
  • 새로운 예외(Exception)을 throws할 수 없음

@Override 어노테이션 : 생략가능, 붙여주면 컴파일러가 재정의된 것인지 정확하게 확인 가능

**이클립스 재정의 메소드 자동 생성

1 자식 클래스에서 재정의 메소드를 작성할 위치로 입력 커서 옮김
2 [Source] - [Override/Implement Methods] 메뉴 선택
3 부모 클래스에서 재정의될 메소드 선택하고 [OK]

② 부모 메소드 호출

 : 자식 클래스에서 부모 클래스의 메소드를 재정의하게 되면, 부모 클래스의 메소드는 숨겨지고 재정의된 자식 메소드만 사용됨. 자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야한다면 명시적으로 super 키워드를 붙여서 부모 메소드 호출 가능

 

4) final 클래스와 final 메소드 

 final : 값이 한번 결정되면 변경 불가

 

① 상속할 수 없는 final 클래스 

 : 클래스를 선언할 때 final 키워드를 class 앞에 붙이면 해당 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 됨. final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없음 ex) String 클래스

public final class 클래스 { ... }

 

② 재정의할 수 없는 final 메소드

 : 메소드를 선언할 때 final 키워드를 붙이면 해당 메소드는 최종적인 메소드이므로 재정의할 수 없는 메소드가 됨. 부모 클래스에서 선언된 final 메소드는 자식 클래스에서 재정의할 수 없음

public final 리턴타입 메소드( [매개변수, ...] ) { ... }

 

**protected 접근 제한자

:  public과 default 접근 제한의 중간

 

 

 

2. 타입 변환과 다양성

 

**다형성 : 사용 방법은 동일하지만 다양한 객체를 이용해서 다양한 실행결과가 나오도록 하는 성질. 다형성을 구현하려면 메소드 재정의와 타입 변환이 필요함.

 

1) 자동 타입 변환

  • 상속 관계에 있는 클래스 사이에서 타입 변환 발생. 자식은 부모 타입으로 자동 타입 변환 가능.
  • 자동 타입 변환 : 프로그램 실행 도중 자동적으로 타입 변환이 일어나는 것 
부모타입   변수  =  자식타입;

부모타입과 자식타입이 같아야 자동 타입 변환 발생

 

ex)

class Animal {

  }
class Cat extends Animal {

  }
Cat cat = new Cat();
Animal animal = cat;

2) 필드의 다형성 

'daily > Java' 카테고리의 다른 글

[Java] 클래스 (4)  (0) 2023.01.11
[Java] 클래스 (3)  (0) 2023.01.04
[Java] 클래스 (2)  (0) 2023.01.03
[Java] 클래스(1)  (0) 2023.01.02
[Java] 참조타입 과제  (0) 2023.01.02