-> 블로그 이전

[Java] 상속

2021. 11. 24. 15:39Language`/Java

상속 (Inheritance)

- 클래스 사이의 상속

- 코드 중복을 제거하여 클래스를 간결하게 구현

- 부모 클래스 = 슈퍼 클래스(Super Class) / 상속받는 자식 클래스 = 서브 클래스(Sub Class) 

 

서브 클래스

- 슈퍼 클래스의 private 멤버를 제외한 모든 멤버에 접근 가능

 

※ Example

class Point{
private int x, y;
public void set(int x, int y){ // private로 선언된 x, y에 접근을 위한 메소드
this.x = x;
this.y = y;
}
public void showPoint(){
System.out.println("(" + x + "," + y + ")");
}
}
class ColorPoint extends Point{
/*
Point(부모 클래스)를 상속받는 ColorPoint(자식 클래스)
Point 클래스의 멤버 set(int x, int y), showPoint() 호출 가능
*/
private String color;
public void setColor(String color){ // private로 선언된 color에 접근을 위한 메소드
this.color = color;
}
public void showColorPoint(){
System.out.print(color);
showPoint(); // Point 클래스의 showPoint() 호출
}
}
public class test {
public static void main(String[] args) {
Point p = new Point();
ColorPoint cp = new ColorPoint();
p.set(1, 2);
p.showPoint();
cp.set(3, 4); // 부모 클래스 Point에서 set() 호출
cp.setColor("red");
cp.showColorPoint();
}
}
-------------------------------
(1,2)
red(3,4)

 

 

슈퍼 클래스에 대한 접근 지정

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

 

 

생성자 (서브 클래스/슈퍼 클래스)

Question 1) 서브 클래스 객체가 생성될 때, 서브 클래스의 생성자 + 슈퍼 클래스의 생성자는 모두 실행되는가?

- Answer) 둘다 실행된다. 서브 클래스 객체가 생성되면 이 객체 안에는 서브 클래스의 멤버, 슈퍼 클래스의 멤버가 모두 들어있다. 생성자의 목적은 객체 초기화 

 

Question 2) 서브 클래스의 생성자, 슈퍼 클래스의 생성자 -> 둘 중 누가 먼저 실행되는가?

- Answer) 슈퍼 클래스의 생성자가 먼저 실행된다.

 

 

※ Example

class A{
public A(){
System.out.println("A!!");
}
}
class B extends A{
public B(){
System.out.println("B!!");
}
}
class C extends B{
public C(){
System.out.println("C!!");
}
}
public class test {
public static void main(String[] args) {
C c = new C();
/*
A -> B -> C 순으로 상속
따라서, A B C순으로 생성자가 실행
*/
}
}
---------------------
A!!
B!!
C!!

 

 

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

1. 슈퍼 클래스의 기본 생성자가 자동 선택

- 명시적 지시가 없으면, 자바 컴파일러에 의해 강제적으로 무조건 슈퍼 클래스의 기본 생성자를 선택한다

- 단, 짝을 이룰 기본 생성자는 무조건 존재해야 한다

 

※ Example

class A{
public A(){
System.out.println("생성자 A");
}
}
class B extends A{
public B(){
System.out.println("생성자 B");
}
}
class C{
public C(){
System.out.println("생성자 C");
}
public C(int x){
System.out.println("매개변수 생성자 C");
}
}
class D extends C{
public D(){
System.out.println("생성자 D");
}
public D(int x){
System.out.println("매개변수생성자 D");
}
}
public class test {
public static void main(String[] args) {
B b = new B();
/*
서브 클래스 B의 기본 생성자 B() -> 슈퍼 클래스 A의 기본 생성자 A() 실행
*/
D d = new D(10);
/*
서브 클래스 D의 매개변수를 가진 생성자 D() -> 슈퍼 클래스 C의 기본 생성자 C() 실행
*/
}
}
----------------------------
생성자 A
생성자 B
생성자 C
매개변수생성자 D

 

 

2. super()를 이용해서 명시적으로 슈퍼 클래스의 생성자 선택

- super() : 슈퍼 클래스의 생성자를 호출하는 코드

- super()는 반드시 생성자의 첫 라인에 사용해야 한다

 

※ Example

class A{
public A(){
System.out.println("생성자 A");
}
}
class B extends A{
public B(){
System.out.println("생성자 B");
}
}
class C{
public C(){
System.out.println("생성자 C");
}
public C(int x){
System.out.println("매개변수생성자 C");
}
}
class D extends C{
public D(){
System.out.println("생성자 D");
}
public D(int x){
super(x); // C(int x)를 명시적으로 호출
System.out.println("매개변수생성자 D");
}
}
public class test {
public static void main(String[] args) {
B b = new B();
D d = new D(10);
}
}
----------------------------------
생성자 A
생성자 B
매개변수생성자 C
매개변수생성자 D