Java/혼공자

Chapter 07 상속

yeooniyeoon 2023. 1. 16. 20:01
728x90
SMALL

07-1 상속

상속은 중복되는 코드를 줄여준다.

부모 클래스 수정 시 자식 클래스에도 적용되어 유지 보수 시간을 최소화해준다.

 

클래스 상속

자식 클래스 선언 시 extends 뒤에 상속받을 부모 클래스를 작성한다.

class SportCar extends Car {}

 

상속 특

- 여러 개의 부모 클래스를 상속할 수 없으며, 단일 상속만 가능하다.

- 부모 클래스에서 private 접근 제한을 갖는 필드/메소드는 상속되지 않는다.

부모, 자식 클래스가 다른 패키지에 존재 시 default 접근 제한을 갖는 필드/메소드는 상속되지 않는다.

 

 

부모 생성자 호출

자식 객체 생성 시 부모 객체가 먼저 생성된 후 부모 객체를 자식 객체가 상속하게 된다.

부모 생성자는 자식 생성자의 맨 첫줄에서 호출된다.

컴파일러가 생성한 기본 생성자의 첫줄에는 super(); 코드가 추가되는데 이는 부모의 기본 생성자를 호출한다.

public DmbCellPhone {
	super();	// 부모 클래스의 기본 생성자 호출.
}

 

명시적으로 생성자 선언 시 super() 생략되어도 컴파일러에 의해 자동으로 추가되므로 부모에 기본 생성자가 존재해야 한다.

부모클래스에 기본 생성자가 없고 매개변수가 있는 생성자만 있을 경우,

자식 생성자에서 반드시 super(매개값); 을 명시적으로 호출해야 한다.

 

public class People {
	public String name;
    
    public People(String name) {
    	this.name = name;
    }
}
public class Student extends People {
	public int studentNo;
    
    public Student(String name, int studentNo) {
    	super(name);	// 명시적으로 매개값있는 생성자 호출
        this.studentNo = studentNo;
    }
}

 

 

메소드 재정의

부모 메소드가 자식 메소드에 적합하지 않은 경우, 자식 클래스에서 다시 수정하여 사용해야 한다.

이런 경우를 위해 자바에선 메소드 재정의를 제공한다.

 

메소드 재정의 방법

메소드 재정의란 자식 클래스에서 부모 클래스의 메소드를 재정의하는 것을 말하며 다음 규칙을 따라야 한다.

- 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 함.

- 접근 제한을 더 강하게 재정의할 수 없음. (더 느슨하게는 가능)

- 새로운 예외를 throws 할 수 없음.

 

메소드 재정의 시 부모 객체의 메소드는 숨겨지기 때문에,

자식 객체에서 메소드 호출 시 재정의된 자식 메소드가 호출됨.

 

부모 메소드 호출

자식 클래스에서 부모 클래스의 메소드 재정의 시, 부모 클래스의 메소드는 숨겨지게 되는데

자식 클래스 내부에서 부모 클래스의 메소드를 호출해야 할 경우 명시적으로 super 키워드를 붙여 호출이 가능하다.

super.부모메소드();

 

 

final 클래스와 final 메소드

final 키워드는 해당 선언이 최종 상태이고 수정될 수 없음을 뜻한다.

클래스와 메소드 선언 시 final 키워드가 지정되면 상속과 관련있음을 의미한다.

 

상속할 수 없는 final 클래스

final 클래스 : 최종적인 클래스. 상속이 불가하며 자식 클래스를 만들 수 없다.

 

재정의할 수 없는 final 메소드

final 메소드 : 최종적인 메소드. 재정의 불가. 자식클래스에서 부모 클래스의 final 메소드는 재정의 할 수 없다.

 

 

07-2 타입 변환과 다형성

다형성이란 사용방법은 동일하지만 다양한 객체를 이용해 다양한 실행결과가 나오도록 하는 성질이다.

다형성 = 메소드 재정의 + 타입 변환

 

자동 타입 변환

타입 변환이란 타입을 다른 타입으로 변환하는 행위를 말한다.

클래스의 변환은 상속관계에 있는 클래스 사이에서 발생하는데 자식은 부모 타입으로 자동 타입 변환이 가능하다.

-> 자식은 부모의 특징과 기능을 상속받기 때문에 동일하게 취급이 가능하다는 개념

 

자동 타입 변환 : 프로그램 실행 도중 자동으로 타입 변환이 일어나는 것.

 

자식 객체 생성 후 부모타입 변수에 대입 시 자동 타입 변환이 일어난다.

이런 경우 자식 타입 변수와 부모 타입 변수는 타입만 다를 뿐 같은 객체를 참조하게 된다.

따라서 자식 타입 변수와 부모 타입 변수를 == 연산 시 true를 반환한다.

Cat cat = new Cat();
Animal animal = cat;
cat == animal;	//두 변수는 같은 객체를 참조함.

바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이면 자동 타입 변환이 일어날 수 있음.

 

부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드, 메소드만 접근이 가능하다.

그러나 자식 클래스에서 메소드 재정의 시 자식 클래스의 메소드가 호출된다.

 

 

필드의 다형성

자동 타입 변환은 다형성을 구현하기 위해 필요하다.

필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다.

이것이 필드의 다형성이다.

 

프로그램은 수많은 객체들이 서로 연결되고 각자의 역할을 하게 되는데, 이 객체들은 다른 객체로 교체될 수 있어야 한다.

 

다형성을 구현할 수 있는 조건에는 상속, 재정의, 타입 변환이 있다.

 

 

매개 변수의 다형성

메소드를

728x90
반응형
SMALL

'Java > 혼공자' 카테고리의 다른 글

Chapter 09 중첩 클래스와 중첩 인터페이스  (2) 2023.01.20
Chapter 08 인터페이스  (1) 2023.01.18
[혼공학습단 9기] 혼공자 2주차  (0) 2023.01.15
Chapter 06 클래스  (0) 2023.01.10
[혼공학습단 9기] 혼공자 1주차  (0) 2023.01.08