상속은 코드의 재활용을 위한 문법이 아닌 연관된 일련의 클래스들에 대해 공통적인 규약을 정의하는 것 입니다.
상속과 생성자1
class Man {
String name;
public Man( String name ) {
this.name = name;
}
public void tellYourName() {
System.out.println( "My name is " + name );
}
}
class BusinessMan extends Man {
String company;
String position;
public BusinessMan( String company, String position ) {
this.company = company;
this.position = position;
}
public void tellYourInfo() {
System.out.println( "My company is " + company );
System.out.println( "My position is " + position );
tellYourName();
}
)
BusinessMan 인스턴스 생성시 문제점은?
생성자는 인스턴스를 초기화하기 위한 것 , BusinessMan이 Man에게 상속받은 name 속성은 초기화하지 못함!!
상속과 생성자2
class BusinessMan extends Man {
String company;
String position;
public BusinessMan ( String name, String company, String position ) {
// 상위 클래스 Man의 멤버 초기화
this.name = name;
// 클래스 BusinessMan의 멤버 초기와
this.company = company;
this.position = position;
}
public void tellYourInfo() { . . . }
}
class Man {
String name;
public Man( String name ) {
this.name = name;
}
. . .
}
모든 멤버의 초기화는 이루어진다. 그러나 생성자를 통한 초기화 원칙에는 어긋남!!
BusinessMan man = new BusinessMan ( "Yoon", "Hybrid ELD", "Staff Eng.");
상속과 생성자3 : 생성자 호출 관계 파악하기
class SuperCLS {
public SuperCLS() {
System.out.println( "I'm Super Class" );
}
}
class SubCLS extends SuperCLS {
public SubCLS() {
System.out.println( "I'm Sub Class" );
}
}
호출할 상위 클래스의 생성자 명시하지 않으면 void 생성자 호출 됨
class SuperSubCon {
public static void main(String[] args) {
new SubCLS();
}
}
I'm Super Class
I'm Sub Class
상위 클래스의 생성자 실행 후
하위 클래스의 생성자 실행 됨
상속과 생성자4 : 상위 클래스의 생성자 호출 지정
class SuperCLS {
public SuperCLS() {
System.out.println( " . . . " );
}
public SuperCLS ( int i ) {
System.out.println( " . . . " );
}
public SuperCLS ( int i, int j ) {
System.out.println( " . . . " );
}
}
class SubCLS extends SuperCLS {
public SubCLS() {
System.out.println( " . . . " );
}
public SubCLS ( int i ) {
super( i );
System.out.println( " . . . " );
}
public SubCLS ( int i, int j ) {
super ( i, j ) ;
System.out.println( " . . . " );
}
}
키워드 super를 통해 상위 클래스의 생성자 호출을 명시할 수 있음
명시적으로 상위 클래스의 생성자 호출을 하지 않으면 컴파일러는 자동으로 super(); 호출함!!
적절한 생성자 정의의 예
class BusinessMan extends Man {
String company;
String position;
public BusinessMan ( String name, String company, String position ) {
super(name);
this.company = company;
this.position = position;
}
public void tellYourInfo() {
System.out.println( "My company is " + company );
System.out.println( "My position is " + position );
tellYourName();
}
}
class Man {
String name;
public Man( String name ) {
this.name = name;
}
public void tellYourName() {
System.out.println( "My name is " + name );
}
}
단일 상속만 지원하는 자바
class AAA { ... }
class MMM extends AAA { ... }
class ZZZ extends MMM { ... }
자바는 다중 상속을 지원하지 않는다.
한 클래스에서 상속할 수 있는 최대 클래스의 수는 한 개이다.
'# 02 > Java' 카테고리의 다른 글
[윤성우 열혈자바] 15-1. 상속을 위한 두 클래스의 관계 (0) | 2019.10.22 |
---|---|
[윤성우 열혈자바] 14-2. 클래스 변수, 클래스 메소드와 상속 (0) | 2019.10.22 |
[윤성우 열혈자바] 13-2. enhanced for문 (0) | 2019.10.22 |
[윤성우 열혈자바] 13-1. 1차원 배열의 이해와 활용 (0) | 2019.10.21 |
[윤성우 열혈자바] 12-2. 콘솔 입력 (0) | 2019.10.21 |