[Java] 상속(1)

상속의 필요성

  • 클래스의 간결화 - 멤버의 중복 작성 불필요
  • 클래스 관리 용이 - 클래스들의 계층적 분류
  • 소프트웨어의 생산성 향상 - 클래스 재사용과 확장 용이

 

상속 선언

extends 키워드 사용

public class Person{	//슈퍼클래스
	...
}
public class Student extends Person{	//서브 클래스(Person을 상속받는 Student 선언)
	...
}

 

상속과 객체

상속 선언

: extends 키워드를 사용하여 상속을 선언한다.

 

서브 클래스 객체 생성

상속받는 클래스의 객체는 슈퍼 클래스의 멤버와 서브 클래스의 멤버를 모두 갖는다.

 

서브 클래스 객체 활용

서브 클래스의 public 멤버, 슈퍼 클래스의 public 멤버 모두 접근 가능.

but, private으로 선언된 멤버는 접근 불가.

 

서브 클래스에서 슈퍼 클래스 멤버 접근

서브 클래스는 슈퍼 클래스의 private 멤버를 제외하고 모든 멤버 접근 가능.

만약, 슈퍼 클래스의 멤버가 private 멤버로 선언되었다면, 슈퍼 클래스 내 메소드에만 접근이 허용되고 서브 클래스의 메소드에서는 접근할 수 없다.

 

자바 상속 특징

  • 클래스의 다중 상속을 지원하지 않는다.

     : 여러개를 상속받는 다중 상속을 지원하지 않는다. extends 다음에는 클래스 이름을 하나만 지정 가능.

 

  • 상속의 횟수에 제한이 없다.
  • 자바의 계층 구조의 최상위에 java.lang.Object 클래스가 있다.

     : 모든 클래스는 Object 클래스를 자동으로 상속받도록 컴파일된다. Object 클래스는 슈퍼 클래스를 가지지 않은 유일한 자바 클래스이다.

 

상속과 protected 접근 지정자

슈퍼 클래스의 private 멤버

서브 클래스를 포함하여 다른 어떤 클래스에서도 접근 불가.

오직 현재 클래스의 멤버에게만 접근 허용.

 

슈퍼 클래스의 디폴트 멤버

패키지에 있는 모든 클래스가 접근 가능.

서브 클래스여도 다른 패키지에 있다면 접근 불가.

 

슈퍼 클래스의 public 멤버

모든 클래스에서 접근 가능.

 

슈퍼 클래스의 protected 멤버

같은 패키지에 속한 모든 클래스들 접근 가능

 

상속받는 서브 클래스(같은 패키지, 다른 패키지 모두 포함) 접근 가능

 

슈퍼 클래스 멤버에 접근하는 클래스 종류 슈퍼 클래스 멤버의 접근 지정자
private 디폴트 protected public
같은 패키지에 있는 클래스 X O O O
다른 패키지에 있는 클래스 X X X O
같은 패키지에 있는 서브 클래스 X O O O
다른 패키지에 있는 서브 클래스 X X O O

 

상속과 생성자

서브 클래스와 슈퍼 클래스의 생성자 호출 및 실행

: 서브 클래스 객체가 생성될 때, 서브 클래스의 생성자와 슈퍼 클래스의 생성자가 모두 실행

: 슈퍼 클래스의 생성자 먼저 실행 후 서브 클래스의 생성자 실행

  서브 클래스의 생성자가 먼저 호출되어도 슈퍼 클래스의 생성자가 먼저 실행.

 

서브 클래스에서 슈퍼 클래스 생성자 선택

: 서브 클래스의 각 생성자에 대해 함께 실행될 슈퍼 클래스의 생성자를 지정.

 but, 슈퍼 클래스의 생성자를 지정하지 않은 경우, 컴파일러는 자동으로 슈퍼 클래스의 기본 생성자를 호출.

 

슈퍼 클래스의 기본 생성자가 자동 선택되는 경우

개발자의 지시가 없으면, 서브 클래스의 생성자가 기본 생성자이든 매개변수를 가지는 생성자 상관없이 슈퍼 클래스에 만들어진 기본 생성자가 선택.

 

※ 슈퍼 클래스에 기본 생성자가 없으면 컴파일 오류 발생.

클래스에 아무 생성자도 선언되어 있지 않은 경우에만 컴파일러가 기본 생성자 강제 삽입.

 

super()를 이용하여 명시적으로 슈퍼 클래스의 생성자 선택

super() 괄호 안에 인자를 전달하여 슈퍼 클래스의 생성자 호출.

(기본 생성자가 아닌 매개변수를 가지는 생성자 호출 가능)

 

※ super()는 반드시 생성자의 첫 라인에 사용되어야 한다.

반응형

'Back-End > Java' 카테고리의 다른 글

[Java] 주요 패키지 내 클래스  (0) 2022.03.17
[Java] 상속(2)  (2) 2022.03.02
[Java] static 멤버와 final  (1) 2022.02.18
[Java] 접근 지정자  (0) 2022.02.18
[Java] 객체  (1) 2022.02.18