수업 중 필기-상속
상속
- 부모 클래스의 필드와 메소드를 자식 클래스에게 물려줄 수 있음
- 상속의 이점 : 중복 코드 줄임 / 클래스 수정 최소화 / 기존 코드 재사용 가능
클래스 상속
- 자식 클래스를 선언할 때 어떤 부모로부터 상속받을 것인지를 결정하고, 부모 클래스를 다음과 같이 extends 뒤에 기술
public class 자식클래스 extends 부모클래스 {
}
- 다중 상속 허용하지 않음. extends 뒤에 하나의 부모 클래스만 상속
부모 생성자 호출
- 모든 객체는 생성자를 호출해야만 생성된다.
- 부모 생성자는 자식 생성자의 맨 첫 줄에 숨겨져 있는 super()에 의해 호출된다.
- 부모생성자
- 기본생성자 : 컴파일 과정에서 자동으로 추가된다. 부모의 기본 생성자를 호출한다.
- 매개변수를 갖는 생성자 : 직접 매개변수를 입력해줘야 한다. 매개값의 타입과 개수가 일치하는 부모 생성자를 호출하다.
public 자식클래스(...) {
super();
...
}
public 자식클래스(...) {
super(매개값, ...);
...
}
메소드 재정의(Method Overriding)
- 상속된 메소드를 자식 클래스에서 재정의해서 사용하는 것
- 메소드가 오버라이딩되었다면 자식 메소드가 우선적으로 사용된다.
- 오버라이딩 규칙
- 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 한다.
- 접근 제한을 더 강하게 오버라이딩할 수 없다.(public -> private으로 변경 불가)
- 새로운 예외를 throws할 수 없다.
- @Override : 컴파일 시 정확히 오버라이딩이 되었는지 체크해 줌 (생략 가능), 문제가 있다면 컴파일 에러 출력 / annotation
- 부모 메소드 호출 (공동 작업 처리 기법)
- 상속한 부모 메소드가 재정의된 경우 사용
- 자식 메소드 내에서 부모 메소드를 호출하는 것
- super() 키워드와 도트(.) 연산자를 사용하면 숨겨진 메소드를 호출할 수 있다.
final 클래스와 final 메소드
- final 클래스
- final 클래스는 최종적인 클래스이므로 더 이상 상속할 수 없다.
- 부모클래스가 될 수 없어 자식클래스가 만들 수 없다.
public final class Member {
}
- final 메소드
- final 메소드는 최종적인 메소드이므로 오버라이딩 할 수 없는 메소드가 된다.
- 부모클래스를 상속해서 자식클래스를 선언할 때, 부모클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 없다.
public final 리턴타입 메소드(매개변수) {
}
protected 접근 제한자
- 필드와 생성자 그리고 메소드 선언에 사용될 수 있다.
- 같은 패키지에서는 default처럼 접근이 가능하나, 다른 패키지에서는 자식 클래스만 접근을 허용한다.
- 동일한 패키지 : protected 필드, 생성자, 메소드 접근 가능
- 다른 패키지 : 상속받은 자식클래스만 protected 필드, 생성자, 메소드 접근 가능
- new 연산자로 생성자 직접 호출 불가
- 자식 생성자에서 super()로 생성자 호출 가능
- default는 접근 제한자가 아니라 접근 제한자가 붙지 않은 상태를 말한다.
타입 변환
- 타입을 다른 타입으로 변환하는 것
- 자동 타입 변환(Promotion) : 자동적으로 타입 변환이 일어나는 것을 말한다.
- 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
- 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.
부모타입 변수 = 자식타입객체;
- ❓부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
- ❓변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정된다.
- 강제 타입 변환(Casting) : 캐스팅 연산자로 강제 타입 변환시키는 것을 말한다.
- 부모 타입은 자식 타입으로 자동 변환되지 않는다.
- ❓자식객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.
- 자동변환하면 부모타입에 선언된 필드와 메소드만 사용가능하므로, 자식타입에 선언된 필드와 메소드를 사용해야 한다면 강제 타입 변환을 해서 다시 자식 타입으로 변환해야 한다.
자식타입 변수 = (자식타입) 부모타입객체;
다형성
- 사용방법은 동일하지만 실행 결과가 다양하게 나오는 성질을 말한다.
- 예시) 자동차의 부품을 교환하면 성능이 다르게 나오듯이 객체는 부품과 같아서,
프로그램을 구성하는 객체를 바꾸면 프로그램의 실행 성능이 다르게 나올 수 있다.
- 객체 사용방법이 동일하다는 것은 동일한 메소드를 가지고 있다는 뜻이다.
- 다형성 구현 방법 : 자동 타입 변환 + 메소드 재정의(오버라이딩)
- 필드 다형성 : 필드 타입은 동일하지만, 대입되는 객체가 달라져서 실행결과가 다양하게 나올 수 있는 것을 말한다.
- 매개변수 다형성 : 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 객체를 제공하는 것이 정석이지만 자식 객체를 제공할 수도 있다.
객체 타입 확인
- instanceof 연산자
- 어떤 객체가 매개값으로 제공되었는지 확인하고자 할 때 사용
- 변수가 참조하는 객체의 타입을 확인하고자 할 때 사용
boolean result = 객체 instaceof 타입;
추상 클래스
- 추상 클래스 : 공통적인 필드나 메소드를 추출해서 선언한 클래스
- new 연산자를 사용해서 객체를 직접 생성할 수 없다.
- 상속을 통해 자식 클래스만 만들 수 있다.
- 추상 클래스는 새로운 실체 클래스를 만들기 위한 부모 클래스로만 사용된다.
- 추상 클래스는 extends 뒤에만 올 수 있다.
- 실체 클래스는 추상 클래스를 상속해서 공통적인 필드나 메소드를 물려받을 수 있다.
- 추상클래스도 필드, 메소드를 선언할 수 있다.
- 자식 객체가 생성될 때 super()로 추상 클래스의 생성자가 호출되기 때문에 생성자도 반드시 있어야 한다.
public abstract class 클래스명 {
}
- 추상 메소드 : 메소드 선언부(리턴타입, 메소드명, 매개변수)만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우가 많다.
- 추상 메소드는 자식 클래스의 공통 메소드라는 것만 정의할 뿐, 실행 내용을 가지지 않는다.
- 추상 메소드는 자식 클래스에서 반드시 재정의(오버라이딩)해서 실행 내용을 채워야 한다.
abstract 리턴타입 메소드명(매개변수, ... );
봉인된 클래스
- sealed : 무분별한 자식 클래스 생성을 방지하기 위해 봉인된 클래스가 도입되었다.
- final은 더 이상