본문으로 바로가기

1. 상속(inheritance) 이란?

 

부모클래스의 모든 자원을 자식클래스에게 물려주는 것을 상속이라 한다. 자식클래스는 상속받은 부모클래스의 모든 자원을 사용할 있다. (접근제어자 특징에 따라 달라 있다.)

상속은 다음과 같은 특징이 있다.

  • 부모, 자식클래스는 예약어 extends 키워드로 정의된다.
  • 하나의 부모클래스는 여러개의 자식클래스를 가질 있지만, 자식클래스는 다수의 부모클래스를 가질 없다.
  • 자식클래스는 다른 클래스의 부모 클래스가 있다.
  • 부모클래스의 자원은 오버라이딩 하여 재정의를 통해 사용할 있다.
  • 부모클래스가 상속받은 자원은 자식 클래스에서도 사용가능 하다.
  • private 제외한 상위클래스의 자원은 상속된다.
  • 동일한 이름의 변수가 사용된다면 부모클래스의 변수는 숨겨진다.

 

특징과 같이 상속은 궁극적으로 소스의 중복을 제거하고, 확장하여 유지보수 재사용성에서 이익을 보기위함이다.

상속받은 클래스를 객체로 생성하여 사용하는 것이 효율적이라 있다. 다음 소스를 통해 확인해 보도록 하자.

 

 

galaxy.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package Inheritance;
 
public class galaxy {
    protected int width;
    protected int height;
 
    public galaxy() {
        this.width = 7;
        this.height = 13;
    }
    
    public galaxy(int width, int heigth) {
        this.width = width;
        this.height = heigth;
    }
 
    public void display() {
        System.out.println("가로 : " + width + ", 세로 : " + height);
    }
    
    public void call() {
        System.out.println("전화 기능");
    }
    
    public void message() {
        System.out.println("문자 기능");
    }
}
 
 

 

 

galaxyNote.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package Inheritance;
 
public class galaxyNote extends galaxy{
    private String display = "";
    
    public galaxyNote(int width, int height, String edge) {
        super(width, height);
        this.display = edge;
    }
    
    public void plusDisplayFunction() {
        System.out.println(this.display + " 기능 추가됨");
    }
    
    public void addPen() {
        System.out.println("펜 기능 추가");
    }
}
 
 

 

 

samsung.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package Inheritance;
 
public class samsung {
 
    public static void main(String[] args) {
        galaxyNote note = new galaxyNote(1015"엣지 디스플레이");
        
        //부모클래스에게서 상속받은 메소드
        note.display();
        note.call();
        note.message();
        
        System.out.println();
 
        //자식클래스에서 추가된 메소드
        note.plusDisplayFunction();
        note.addPen();
    }
}
 
 

 

결과)

    가로 : 10, 세로 : 15
    전화 기능
    문자 기능

    엣지 디스플레이 기능 추가됨
    펜 기능 추가

 

위소스의 클래스 다이어그램은 다음과 같다.

 

 

 

부모클래스인 galaxy galaxy클래스를 상속받아 추가 기능을 구현한 galaxyNote 자식클래스로 구분된다.

galaxyNote 기본적인 전화걸기와 문자보내기, 디스플레이의 가로세로 셋팅은 galaxy클래스에 정의가 되어 있으니 해당 자원을 모두 상속받고 galaxyNote에서 추가되는 기능만 구현을 하였다. galaxyNote에는 pen기능과 edge디스플레이가 추가되었음을 확인 있다.

 

만약 galaxyNote클래스가 상속을 받지 않고 구현되었다면 galaxy 있는 모든 자원들이 galaxyNote클래스에 구현이 되었어야 한다. 하지만 이는 중복된 코드가 다시 들어가게 되며, 공통된 기능이 수정된다면 galaxy, galaxNote클래스에서 모두 수정이 이루어져야 한다. 하지만 상속을 이용한다면 수정, 중복코드를 최소화 있다.

 

 

 

2. super

 

소스 galaxyNote클래스 생성자에서 super(int width, int height) 사용하였다. 이는 부모클래스의 생성자를 호출 하는것으로 super 다음과 같은 특징이 있다.

  • this 객제 자신을 가리키는 포인터라면, super 부모클래스의 객체를 가리키는 포인터 이다.
  • super.멤버변수, super.메소드(매개변수) 부모클래스의 자원에 접근 있다.
  • 부모클래스 생성자에 접근하는 방법은 super(매개변수) 이다.

 

 

3. 추상클래스(Abstract class)

 

상속에서 빠지지 않는 개념이 추상클래스인데, 다음과 같은 특징이 있다.

  • 클래스 메소드 앞에 abstract 예약어를 사용한다.
  • 추상메소드는 선언만 되어있고 구현부분이 없다.
  • 자식클래스는 반드시 추상클래스에 선언된 모든메소드를 재정의 하여 사용하여야 한다.
  • 추상클래스 자체는 객체로 선언할 없으며, 상속의 기능으로만 사용하여야 한다.

그렇다면 추상 클래스는 사용할까?? 부분은 추후에 별도 글을 통해 확인하도록 한다. 우선 다음 예제소스를 통해 기본적인 골격을 확인하도록 하자.

 

nation.java

1
2
3
4
5
package abstraction;
 
public abstract class nation {
    public abstract void show();
}
 

 

 

korea.java

1
2
3
4
5
6
7
package abstraction;
 
public class korea extends nation {
    public void show() {
        System.out.println("한국");
    }
}
 
 

 

america.java

1
2
3
4
5
6
7
package abstraction;
 
public class america extends nation{
    public void show() {
        System.out.println("미국");
    }
}
 
 

 

 

unitedkingdom.java

1
2
3
4
5
6
7
package abstraction;
 
public class unitedkingdom extends nation {
    public void show() {
        System.out.println("영국");
    }
}
 
 

 

 

main.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package abstraction;
 
public class main {
 
    public static void main(String[] args) {
        nation korea = new korea();
        nation america = new america();
        nation uk = new unitedkingdom();
        
        korea.show();
        america.show();
        uk.show();
    }
}
 
 

 

 

nation추상클래스를 상속받은 korea, america, uk 모두 show메소드를 재정의 하여 사용한 것을 확인 있다. 특이점은 추상클래스인 nation타입으로 변수를 지정하고 자식클래스 중 어느 클래스를 객체로 생성해도 사용할 있다는 점이다.

 

결과)

    한국
    미국
    영국

 

 

4. final

 

final 다음과 같은 특징이 있다.

  • final 최초 초기화된 값으로만 사용할 있도록 정의된 예약어 이다.
  • final 붙은 클래스는 상속할 없다.
  • final 붙은 메소드는 오버라이딩(재정의) 없다.
  • final 붙은 변수는 값을 변경할 없다.

일반적으로 최초 속성 이후에 절대 변경하지 말아야 하는 자원들은 final 붙인다.

 

 

 

5. 인터페이스(Interface)

 

추상클래스와 의미가 비슷하지만 다중상속을 하기 위하여 나온 개념으로서 자세한 설명은 추후 별도 글에서 다루기로 한다.

  • implements 키워드를 사용하여 상속받는다.
  • 인터페이스에서 정의된 모든 메소드는 상속받은 클래스에서 재정의 해야 한다.
  • static final 변수와 추상메소드 만을 사용한다.