자바의 상속
■ 상속(Inheritance)
상속의 개요
- 부모 클래스의 모든 것을 자식 클래스가 물려받는 것
- extends 예약어 사용 ( 상속은 부모의 기능에서 추가적인 것들을 확장한다는 의미 )
- 상속을 통해 소스코드의 재사용성이 보장되며, 가독성이 높아짐
- 부모 / 자식 간 is a~ 관계에 존재해야함
- 부적절한 상속은 소스코드에 대한 분석과 개발을 어렵게 만듦
- 자바에서는 단일 상속만 허용
상속과 생성자
- 자식클래스는 부모 클래스들이 가지고 있는 모든 멤버와 자기 클래스가 갖는 모든 멤버를 가짐
- 초기화를 위해 자식 클래스가 호출되면 부모 클래스의 생성자가 먼저 초기화하고 자식 클래스의 생성자를 통해 초기화됨.
class SuperClass{
int n1;
public SuperClass(){
System.out.println("SuperClass 생성");
n1 = 100;
}
}
class SubClass extends SuperClass{
int n2;
public SubClass(){
System.out.println("SubClass 생성");
n2 = 10000;
}
}
public class ConstructorTest{
public static void main(String[] args){
subClass sub = new SubClass(); // 부모 클래스의 생성자 호출 뒤 자식 클래스의 생성자 호출
System.out.println(sub.n1); // 100이 출력됨
System.out.println(sub.n2); // 10000이 출력됨.
}
}
자식클래스를 생성할 때 부모클래스에 기본 생성자가 없다면 오류 발생
class SuperClass{
int n1;
public SuperClass(int n1){ // 매개변수가 있는 생성자를 정의했기 떄문에
System.out.println("SuperClass 생성"); // 기본 생성자가 자동으로 제공되지 않음
this.n1 = n1
}
}
class SubClass extends SuperClass{
int n2;
public SubClass(){ //부모 클래스의 기본생성자가 없기 때문에
System.out.println("SubClass 생성"); // 컴파일이 되지 않음
n2 = 10000;
}
}
public class ConstructorTest{
public static void main(String[] args){
subClass sub = new SubClass();
}
}
this()
- 클래스 안에서 Overloading된 또 다른 생성자를 호출하기 위해 사용
부모 생성자 super()
- 부모 클래스의 생성자를 명시적으로 호출할 때 사용
- 부모 클레스의 생성자가 Overloading되어 여러개 존재하는 경우 특정 생성자를 호출하기 위해 사용
- super()는 반드시 생성자의 첫 번째 라인에 위치해야 함.
■ 상속과 멤버
변수의 상속
- 상속 시 부모 클래스들이 가지고 있는 모든 멤버를 가져오지만 private로 정의된 변수는 상속되지 않음
- 동일한 이름으로 자식 클래스에 정의된 변수는 상속에서 제외됨
this 예약어
- 생성된 객체 자신에 대한 참조를 의미.
- 멤버 변수와 메서드 매개변수의 이름이 같을 경우 이를 구분하기 위해 사용함.
super 예약어
- 부모 객체에 접근할 수 있는 참조변수로 사용함
- 부모 클래스와 자식 클래스에 자료형이 다르고 같은 이름을 가진 변수가 있을 때 this/super 예약어를 사용하여 호출할 수 있음
메서드의 상속
- 부모 클래스가 가지고 있는 메서드가 자식 클래스로 상속되어 자식 클래스에서 사용 가능함
- 재정의 하지 않으면 부모 클래스의 메서드와 동일한 기능의 메서드를 재사용함
메서드 Overriding
- 부모 클래스의 메서드를 재사용하지 않고 새롭게 정의하여 사용하는 것
- 부모 클래스의 메서드 이름, 매개변수의 유형과 개수가 동일해야 함
class SuperClass{
void print(String str){
System.out.println("SuperClass 의 print호출");
}
}
class SubClass extends SuperClass{
void print(){ // 매개변수가 다르므로 Overlodaing
System.out.println("SubClass의 print()호출");
}
void print(String str){ //overriding
System.out.println("SubClass의 print(String str)호출")
}
}
SubClass 클래스에는 print(String str)과 print() 두개의 메서드가 Overloading 되어 있음
부모 클래스의 메서드를 그대로 사용하고 overriding하고 싶다면 super()예약어를 이용하면 됨.
[참고] : SWExpertAcademy
'Etc.. > SWExpertAcademy' 카테고리의 다른 글
[Java Programming] 객체지향 핵심 원리(7) (0) | 2021.07.22 |
---|---|
[Java Programming] 객체지향 핵심 원리(6) (0) | 2021.07.18 |
[Java Programming] 객체지향 핵심 원리(4) (0) | 2021.07.17 |
[Java Programming] 객체지향 핵심 원리(3) (0) | 2021.07.17 |
[Java Programming] 객체지향 핵심 원리(2) (0) | 2021.07.13 |