클래스 상속해서 자식 클래스 선언하기
자동 타입 변환, 강제 타입 변환, 다형성 이해하기
클래스의 공통적 특성을 추출해서 추상 클래스로 선언하기
챕터7에서는 뭔가 클래스 관련한게 많다!!!>_<
오늘은 챕터7 전체 공부하기가 목표
자식은 상속을 통해 부모가 물려준 것을 자연스럽게 이용할 수 있다.
객체 지향 프로그래밍에서도
부모 클래스의 멤버를 자식 클래스에게 물려줄 수 있다!!
(부모 - 상위 클래스 / 자식 - 하위 or 파생 클래스)
상속
ㅇ이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만드는 것!! 중복되는 코드를 줄일 수 있다.
ㅇ부모클래스 수정으로 모든 자식 클래스들도 수정되는 효과 ->유지보수 용이
ㅇ어떤 클래스를 상속받을지는 자식 클래스 선언할 때 선택한다.
class 자식클래스 extends 부모클래스 { //필드 //생성자 //메소드 } |
예시 |
class SportsCar extends Car { } |
ㅇ단 하나의 부모 클래스만 상속받을 수 있다!
ㅇ부모 클래스에서 private 접근 제한을 갖는 필드, 메소드는 상속받지 못한다.
또, 부모와 자식 클래스가 다른 패키지에 존재한다? 이에 따라 default 접근 제한 갖는 필드, 메소드도
상속받지 못한다.
<<상속 예제>>
핸드폰 클래스를 상속해서 DMB 클래스를 작성한 예제를 보자
음 상속받으면 자식 클래스에서 부모 클래스의 필드, 메소드를 마치 자기 것처럼 사용할 수 있구나
++자식 객체를 생성하면, 내부적으로 부모 객체도 생성된다.
즉 DmbCellPhone객체를 생성하면, 내부적으로 부모인 CellPhone 객체가 먼저 생성된 후 자식 객체가 생성된다.
++부모 객체도 사실.. 생성을 해야 한다. (모든 객체는 클래스의 생성자를 호출해야 생성이 된다.)
부모 객체는 그럼 어디서 생성이 된 걸까?? --> 사실은 자식 생성자의 맨 첫줄에서 호출된다.
자식 클래스(DmbCellPhone의 생성자 선언을 따로 안 해줬다면
컴파일러는 다음과 같은 기본 생성자를 생성한다.
자식클래스의 기본 생성자는 부모의 기본 생성자를 호출하는 생성자를 포함한다!!
public DmbCellPhone() {
super();
}
super()은 부모의 기본 생성자를 호출한다.
부모의 기본 생성자도 마찬가지로 따로 선언하지 않았다면 컴파일러에 의해 기본 생성자가 만들어진다.
public CellPhone() {
}
++만약 직접 자식 생성자를 선언하고 싶다면 다음처럼.. super() 넣어준다.
부모를 불러야 하니까!!!
자식클래스( 매개변수선언, ... ) {
super( 매개값, ... );
...
}
>>super(매개값, ...) 이면, 매개값 타입과 일치하는 부모 생성자를 호출한다. 매개값 타입이랑 부모 생성자 타입이랑 일치하지 않으면 컴파일 에러.
만약 자식클래스에서 super(~~)를 선언하지 않아서 컴파일러가 super()을 자동적으로 추가했다면, 부모 클래스에는 기본 생성자가 존재해야 한다. 이 때 부모 클래스의 생성자가 매개변수가 사용되는 생성자라면.. 컴파일 에러.
>>예제로 확인하자.
>>부모 생성자에는 매개변수가 있는데, 만약 super에 매개변수를 써주지 않았다면..?
Implicit super constructor People() is undefined. Must explicitly invoke another constructor!!!
그러니까 매개변수가 부모 클래스 생성자에 들어가 있으면 super에서 명시적으로 적어줘야 한다.
메소드 재정의 (Overriding)
부모 클래스의 메소드가 자식 클래스에서 사용하기 부적합할 수도 있다.
이럴 때 상속된 일부 메소들을 자식 클래스에서 수정해서 사용해야 한다.
이렇게 메소드를 재정의 하는것을 '메소드 재정의 (오버라이딩)'이라고 한다.
ㄴ접근 제한을 더 강하게 재정의할 수 없다. (ex: public을 private로)
ㄴ부모 메소드와 동일한 시그니처(리턴타입, 메소드이름, 매개변수 목록) 가져야 한다.
ㄴ새로운 예외를 throws 할 수 없다 --> 나중에..
ㄴ메소드가 재정의 하면 그 메소드 호출할 때 재정의된 자식 메소드가 호출된다.
<<재정의 예시>>
원 넓이를 더 정확히 구하기 위해, 부모 클래스에서 넓이 구하는 메소드에서 사용된 부모 클래스의 파이 값 대신 자식 클래스에서는 Math.PI를 사용하도록 재정의하는 코드이다.
메소드 재정의하면 부모 메소드는 숨겨지고, 오버라이딩된 자식 메소드를 사용한다고 했는데!
만약에! 이미 재정의된 부모 클래스의 메소드를 호출해야 한다면??
super 키워드를 붙여서 부모 메소드를 호출 가능!!
super.부모메소드();
ex)
method2(); -->재정의된 메소드 호출
super.method2(); -->부모 메소드 호출
super는 부모 객체를 참조하고 있기 때문에 부모 메소드에 직접 접근할 수 있다.
<<재정의된 메소드 말고 부모 메소드를 호출해보기 연습>>
final 키워드로 클래스, 필드, 메소드를 선언할 수 있었다.
하지만 클래스, 필드, 메소드에 사용할 때 각각 해석이 조금씩 달라진다!!
저번에 봤듯이 필드에 final 키워드를 사용하면.. 초기값이 정해지면 더이상 바꿀 수 없는 최종값의 의미가 있었는데,
클래스나 메소드에 final 키워드를 사용한다면 '상속'과 연관이 있다.
1. 상속할 수 없는 'final 클래스'
>>public final class 클래스 {...}
>>최종적인 클래스이므로 상속할 수 없는 클래스가 된다.
>>final 클래스 대표적 예: String 클래스 (자바 표준 API에서 제공)
ㄴ>public final class String {...} --> extends String이 불가!!!
2. 재정의할 수 없는 'final 클래스'
>>최종적인 메소드이므로 재정의 불가하다.
>>public final 리턴타입 메소드( 매개변수, ... ) {...}
상속과 관련있는 접근 제한자 protected
같은패키지에는 defalut처럼 접근제한이 없지만,
다른패키지에서도 '자식 클래스에 한하여' 접근제한이 없다.
자식클래스는 접근 허용!
필드, 생성자, 메소드에 사용될 수 있다.
확인문제
+++this()는 같은 클래스의 다른 생성자를 호출할 때 사용한다.+++
괄호 안에 매개변수를 통해 호출할 생성자가 결정된다.
05.
답:
자식클래스의 기본 생성자는 부모의 기본 생성자를 호출하는 생성자를 포함한다
자식생성자가 호출되면 곧이어 먼저 super키워드를 통해 부모생성자가 호출되기 때문에 결과가 저렇게 나온다.
<과정>
Chlld() 호출. --> 부모기본생성자 Parent()호출, 가장 먼저 이 생성자 블록에 있는 this("대한민국")을 통해 괄호 안 매개변수 형식에 맞는 같은클래스 내 다른 생성자를 호출한다. 즉 Parent(String nation) 생성자를 호출한다. 그리고 이 생성자 블록을 쭉 실행해서 문자열 "Parent(String nation) call" 출력 --> 다시 Parent() 생성자 블록으로 돌아가서.. 아까 실행 못한 나머지 코드를 실행한다. 문자열 "Parent() call"을 출력 --> 다시 Child() 생성자 블록으로 돌아가서.. 아까 실행 못한 나머지 코드 실행한다. 즉, 이어서 생성자 블록 내부의 this("홍길동")을 통해 해당 매개변수 형식에 맞는 같은클래스 내 다른 생성자를 호출한다. 그래서 Child(String name)이 호출된다. 그러므로 문자열 "Child(String name) call"이 출력된다. --> 다시 Child() 생성자블록으로 돌아가서 아까 실행 못한 나머지 코드를 순서대로 실행한다. 따라서 문자열 "Child() call"이 출력된다.
'JAVA' 카테고리의 다른 글
[혼자 공부하는 자바] 7/11 07-3 [추상 클래스] [실체 클래스] [메소드 재정의] (0) | 2020.07.11 |
---|---|
[혼자 공부하는 자바] 7/10 07-2 [타입 변환과 다형성] [자동 타입 변환] [강제 타입 변환] (0) | 2020.07.11 |
[혼자 공부하는 자바] 7/08 06-6 [패키지와 접근 제한자] (0) | 2020.07.08 |
[혼자 공부하는 자바] 7/08 06-5 [인스턴스 멤버와 정적 멤버] [static] / [private] [접근제한자] / [final 필드] [상수] (0) | 2020.07.07 |
[혼자 공부하는 자바] 7/07 06-4 [메소드] (0) | 2020.07.07 |