본문 바로가기
Java

자바 #007_상속

by haheehee 2023. 1. 16.

OOP(객체 지향 프로그램)에서 부모 클래스의 멤버를 자식 클래스에게 상속해줄 수 있다.

 

상속

- 재사용 : 이미 개발된 클래스를 재사용하여 새로운 클래스를 만들기 때문에, 중복코드가 줄어든다.

- 유지보수 : 부모클래스를 수정하면, 상속받고 있는 모든 자식 클래스가 수정되므로 유지보수 시간이 줄어든다.

 


클래스 상속

- 자식 클래스를 선언할 때 뒤에 부모 클래스를 명시

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

- 부모 클래스는 하나만 정할 수 있다. 

- 부모클래스의 private 필드와 메소드는 상속받을 수 없다.

- 부모와 자식이 다른 package에 존재하면, default 접근 제한자를 가진 필드와 메소드도 상속받을 수 없다.

 

- 자식클래스의 객체를 생성할 때, 부모 객체가 먼저 생성되고, 그 후에 자식 객체가 생성된다. 

- 자식 생성자의 제일 첫줄에서 부모 생성자가 호출된다. 

    이것을 명시적으로 호출하고 싶다면 super를 사용

자식클래스( 매개변수 선언, ... ) {
	super( 매개값, ... );
	...
}

자식클래스에서 부모 생성자 호출(super)

 


오버라이딩(Overriding, 메소드 재정의)

- 자식클래스에서 부모클래스의 메소드를 수정해서 사용하는 것.

- 부모 클래스의 메소드가 자식 클래스에서 사용하기 적절하지 않은 경우 

- 메소드 재정의

     1. 부모 메소드와 동일한 시그니처

     2. 접근 제한을 더 강하게 할 수 없음

     3. 새로운 예외를 throws 불가능

- 오버라이딩이 일어나면, 부모객체 메소드는 숨겨지고/ 자식객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출됨

오버라이딩
오버라이딩 콘솔창

- 부모 메소드 호출 : 자식 클래스 내부에서 재정의된 부모 클래스 메소드를 호출해야 하는 경우

                                 명시적으로 super 키워드를 사용하여 부모 메소드를 호출한다.

super.부모메소드();

 


final 키워드

- 해당 선언이 최종 상태라는 의미

- 수정될 수 없음

- 클래스와 메소드를 선언할 때 final 키워드를 사용한다면, 상속과 관련되어 있다는 뜻!          ???

- final 클래스는 상속할 수 없다. 부모클래스가 될 수 없기 때문!!에 자식 클래스를 만들 수 없다.

 

- 수정될 수 없기 때문에, final 메소드는 재정의할 수 없다.

 


다형성

매소드 재정의와 타입변환으로 다형성 구현

다양한 객체를 활용하여 여러 실행결과가 나오도록 하는 성질을 말한다.

 


자동타입변환(promotion)

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

자동 타입 변환

Cat cat = new Cat();	// 자식 클래스 객체 생성
Animal animal = cat;	// 부모타입 변수 = 자식타입; (자동 타입 변환)

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

 

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

예외 메소드가 자식 클래스에서 재정의되면, 자식 클래스의 메소드가 대신 호출

자동 타입 변환

 


필드의 다형성

- 필드 타입을 부모 타입으로 선언하면,

     다양한 자식 객체가 저장되어 필드 사용 결과가 달라진다.           -> 다형성


매개변수의 다형성

매개변수를 부모 타입으로 선언

- 메소드를 호출할 때 매개값으로 부모객체와 자식객체 모두 사용할 수 있다.

- 자식의 재정의된 메소드가 호출     -> 다형성

매개변수의 다형성


강제 타입 변환 (casting)

- 부모타입을 자식 타입으로 변환시키는 것.

- (자식타입이 부모타입으로 자동 타입 변환한 후, 다시 변환할 때 사용됨)

강제 타입 변환 (casting)

Parent parent = new Child();	// 자동 타입 변환
Child child = (Child) parent; 	// 강제 타입 변환

강제 타입 변환 (casting)
강제 타입 변환 (casting) 결과


instanceof 연산자

- 임의의 객체가 어느 클래스의 인스턴스인지 확인할 때 사용하는 연산자

- 참조 변수의 형변환하기 형변환 가능 여부를 확인할 때 사용한다.

-

자신 객체 혹은 자식의 객체가 instance of 연산자의 앞으로 들어왔을경우 true를 반환

- ​상속관계를 체크해주는 연산자

boolean result = 객체 instance of 타입
Parent parent = new Parent();
// Child child = (Child) parent; 	// 강제 타입 변환 불가능

public void func(Parent parent) {
	if(parent instanceof Child) {	// 상속관계를 확인한 후 (Parent 매개변수가 참조하는 객체가 Child인지 확인한 후)
    	Child child = (Child) parent;	// 강제 타입 변환 수행
    }
}

- 타입을 확인하지 않고 강제타입변환을 한다면, ClassCastException이 발생.


추상클래스

- 객체를 생성해서 사용하는 클래스인 실체클래스의 필드와 메소드를 추출하여 선언한 것.

-  추상클래스가 실체클래스의 부모가 된다. (상속 관계)

- 클래스들의 공통적인 필드와 메소드 추출하여 선언한 클래스

 

- 실체 클래스에 반드시 존재해야할 필드와 메소드의 선언

- 실체 클래스에는 공통된 내용은 빠르게 물려받고, 다른 점만 선언하면 된다 ->시간 절약

 

- abstract 키워드 : 상속 통해 자식 클래스만 만들 수 있도록...(부모로서의 역할만!)

public abstract class 클래스명 {
    // 필드
    // 생성자
    // 메소드
}

- 추상 클래스도 일반클래스와 마찬가지로, 필드/생성자/메소드를 선언 가능

- 직접 객체 생성 불가능!!!! but, 자식 객체 생성될 때 객체화된다. 

      자식 생성자에서 super() 형태로 추상 클래스의 생성자 호출.

 


추상 메소드

- 메소드 선언만 통일, 실행 내용은 실체 클래스마다 달라야하는 경우

- abstract 키워드로 선언, 중괄호가 없는 메소드.

- 하위 클래스는 반드시 재정의해서 실행 내용을 넣어줘야 한다.

 

- 추상 클래스에서만 선언할 수 있고, 메소드의 선언부만 있는 메소드. 자식 클래스에서 재정의되어 실행 내용 결정해야 함

[public | protected] abstract 리턴타입 메소드명 (매개변수1, ...);

 

 

 

 

 

 

출처 : 혼자 공부하는 자바 (신용권)

'Java' 카테고리의 다른 글

자바 #008_인터페이스  (0) 2023.01.17
자바 : 리스트 List list = new ArrayList(); 로 사용하는 이유 (링크)  (0) 2023.01.10
자바 : 피라미드 * 만들어보기  (0) 2022.12.14
자바 #006_클래스  (0) 2022.12.12
자바 #005_참조  (0) 2022.12.12

댓글