OOP(객체 지향 프로그램)에서 부모 클래스의 멤버를 자식 클래스에게 상속해줄 수 있다.
상속
- 재사용 : 이미 개발된 클래스를 재사용하여 새로운 클래스를 만들기 때문에, 중복코드가 줄어든다.
- 유지보수 : 부모클래스를 수정하면, 상속받고 있는 모든 자식 클래스가 수정되므로 유지보수 시간이 줄어든다.
클래스 상속
- 자식 클래스를 선언할 때 뒤에 부모 클래스를 명시
class 자식클래스 extends 부모클래스 {
// 필드
// 생성자
// 메소드
}
- 부모 클래스는 하나만 정할 수 있다.
- 부모클래스의 private 필드와 메소드는 상속받을 수 없다.
- 부모와 자식이 다른 package에 존재하면, default 접근 제한자를 가진 필드와 메소드도 상속받을 수 없다.
- 자식클래스의 객체를 생성할 때, 부모 객체가 먼저 생성되고, 그 후에 자식 객체가 생성된다.
- 자식 생성자의 제일 첫줄에서 부모 생성자가 호출된다.
이것을 명시적으로 호출하고 싶다면 super를 사용
자식클래스( 매개변수 선언, ... ) {
super( 매개값, ... );
...
}
오버라이딩(Overriding, 메소드 재정의)
- 자식클래스에서 부모클래스의 메소드를 수정해서 사용하는 것.
- 부모 클래스의 메소드가 자식 클래스에서 사용하기 적절하지 않은 경우
- 메소드 재정의
1. 부모 메소드와 동일한 시그니처
2. 접근 제한을 더 강하게 할 수 없음
3. 새로운 예외를 throws 불가능
- 오버라이딩이 일어나면, 부모객체 메소드는 숨겨지고/ 자식객체에서 메소드를 호출하면 재정의된 자식 메소드가 호출됨
- 부모 메소드 호출 : 자식 클래스 내부에서 재정의된 부모 클래스 메소드를 호출해야 하는 경우
명시적으로 super 키워드를 사용하여 부모 메소드를 호출한다.
super.부모메소드();
final 키워드
- 해당 선언이 최종 상태라는 의미
- 수정될 수 없음
- 클래스와 메소드를 선언할 때 final 키워드를 사용한다면, 상속과 관련되어 있다는 뜻! ???
- final 클래스는 상속할 수 없다. 부모클래스가 될 수 없기 때문!!에 자식 클래스를 만들 수 없다.
- 수정될 수 없기 때문에, final 메소드는 재정의할 수 없다.
다형성
매소드 재정의와 타입변환으로 다형성 구현
다양한 객체를 활용하여 여러 실행결과가 나오도록 하는 성질을 말한다.
자동타입변환(promotion)
- 프로그램 실행 중 자동으로 타입변환이 일어나는 것
Cat cat = new Cat(); // 자식 클래스 객체 생성
Animal animal = cat; // 부모타입 변수 = 자식타입; (자동 타입 변환)
- 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면, 자동 타입 변환이 일어날 수 있다.
- 부모 타입으로 자동 타입 변환이된 후에는, 부모 클래스에 선언된 필드 및 메소드만 접근이 가능하다.
- 예외 : 메소드가 자식 클래스에서 재정의되면, 자식 클래스의 메소드가 대신 호출
필드의 다형성
- 필드 타입을 부모 타입으로 선언하면,
다양한 자식 객체가 저장되어 필드 사용 결과가 달라진다. -> 다형성
매개변수의 다형성
매개변수를 부모 타입으로 선언
- 메소드를 호출할 때 매개값으로 부모객체와 자식객체 모두 사용할 수 있다.
- 자식의 재정의된 메소드가 호출 -> 다형성
강제 타입 변환 (casting)
- 부모타입을 자식 타입으로 변환시키는 것.
- (자식타입이 부모타입으로 자동 타입 변환한 후, 다시 변환할 때 사용됨)
Parent parent = new Child(); // 자동 타입 변환
Child child = (Child) parent; // 강제 타입 변환
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 |
댓글