본문 바로가기

# 02/Java

[윤성우 열혈자바] 14-1. 상속의 기본 문법 이해

반응형

상속은 코드의 재활용을 위한 문법이 아닌 연관된 일련의 클래스들에 대해 공통적인 규약을 정의하는 것 입니다.



상속과 생성자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 { ... }


자바는 다중 상속을 지원하지 않는다.


한 클래스에서 상속할 수 있는 최대 클래스의 수는 한 개이다.


반응형