오늘은 자바의 상속(extends)에 대해 공부해보았습니다. 다른 사람에게도 어려웠는지는 모르겠지만
저는 공부하면서 조금 어려웠습니다...
하지만 대부분 상속은 어려워하는거 같아서 위안이 조금 되었네요. 상속 부분은 중요한 부분이기도 하니
이 포스팅을 통해서 잘이해되었으면 합니다.
상속(Inheritance)이란? |
우리가 생각하는 상속이라는 단어이며 자바가 아닌 일상에서는 부모님이 자식에게 물려주는 것과 비슷한 의미입니다. 차이점을 생각한다면 자식(클래스)이 상속받고 싶은 부모(클래스)를 선택해서 물려받는 것이라는 차이점이 있습니다. 이때 상속받는 클래스를 자식 클래스, 하위 또는 서브 클래스라고 합니다. 상속을 해주는 클래스를 부모 클래스, 상위 또는 슈퍼 클래스라고 합니다. |
JAVA의 상속(extends)에 대하여 |
자식 클래스가 부모 클래스로부터 상속을 받으면 부모 클래스의 필드와 메서드를 물려받게 됩니다. 단, 접근제어자가 private를 갖거나 패키지가 다를 경우, 접근제어자가 default인 경우 상속이 불가능합니다. 부모 클래스로부터 상속받은 자식 클래스는 부모클래스의 자원(source)을 모두 사용할 수 있습니다. 부모 클래스가 상속받은 자원도 자식클래스가 사용 가능하지만 반대로 부모 클래스는 자식 클래스의 자원을 가져다 쓸 수 없습니다. 그리고 자식 클래스는 또다른 클래스의 부모 클래스가 될 수 있습니다. |
▶ JAVA의 상속을 사용한 예시로 쉽게 알아봅시다.(클릭하면 코드를 볼 수 있습니다.)
- Animals.java
- Checking.java
- Feed.java
예시 프로그램은 육식동물의 이름을 확인하는 프로그램이고,육식동물의 이름을 입력하면 육식동물의 먹이가 출력되며 출력된 먹이에 해당하는 육식동물들까지 출력된다.
▶ 프로그램에 사용된 클래스(Class)는 3개로 Animals, Checking, Feed 입니다.
Animals
- 육식동물을 의미하는 클래스이며 육식동물의 이름과 먹이들을 멤버필드 자원을 갖고 있습니다.
- 육식동물의 이름으로 그 육식동물이 먹는 먹이를 return 하는 기능을 가진 메서드를 갖고 있습니다.
Checking
- 프로그램을 확인하는 것을 의미하는 클래스이며 Animals 클래스를 상속받는 자식 클래스입니다.
- 또한 Feed 클래스에 상속하는 부모 클래스입니다.
Feed
- 먹이를 의미하는 클래스입니다.
- Checking 클래스를 상속받는 자식 클래스이고 메인메서드가 있습니다.
- 프로그램의 시작은 Feed 클래스입니다.
- 육식동물의 이름을 입력받아 Console 화면에 결과를 출력합니다.
상속을 주고 받는 순서는 Animals----->Checking----->----->Feed 입니다.
이제 상속의 순서를 생각해보며 예시의 코드를 천천히 분석해봅시다.
1
2
3
4
5
6
7
|
public class Feed extends Checking {
private String name;
public Feed() {
super();
feed();
}
|
cs |
Feed 클래스를 먼저 보면 처음 메인 메서드로부터 호출된 생성자에서 super()가 보입니다.
▶ super()
super() 는 자신의 부모 클래스의 생성자를 호출하는 역할을 합니다. 바로 위의 부모 클래스만이
아니라 부모의 부모나 그 부모의 부모 클래스의 생성자까지 모두 호출합니다.
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
|
package Extends_Example;
public class Checking extends Animals {
public Checking() {
System.out.println("육식동물 확인 프로그램");
}
/*보기 쉽게 하려고 Checking 클래스의 생성자 아래에 표시 해놓았습니다.
public Animals() {
System.out.println(animals_name + " " + predators);
}
*/
@Override
public String getPredators(String name) {
return super.getPredators(name);
}
}
|
cs |
super() 가 Feed의 부모 클래스의 생성자인 Checking 클래스의 생성자가 호출됩니다.
그 다음 Checking 클래스가 Animals 클래스를 상속받고 있으므로 Animals 클래스로 가서 확인해봅시다.
[보기 쉽게 하려고 Checking 클래스의 생성자 아래에 표시 해놓았습니다. (전체코드를 보시려면 여기를 클릭하세요.)]
그리고 @Override란 한글로는 '보수'라는 의미를 가지고 있는데 부모에게 물려받는 자원을 그대로 사용하거나 약간의 변형을 주어 사용하고 싶을 때 쓸 수 있습니다.
이제 다시 Feed 클래스의 Feed() 메서드를 살펴보면
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
|
public void feed() {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("동물의 이름을 쓰세요 --> ");
try {
name = in.readLine();
if (super.getPredators(name) == null) {
System.out.println("육식동물이 아닙니다.");
return;
}
System.out.println("육식동물의 먹이: " + super.getFeed(name));
String[] preds = super.getPredlist(name);
System.out.print("육식동물들 : [ ");
for (int i = 0; i < preds.length; i++) {
System.out.print(preds[i] + " ");
}
System.out.println("] ");
} catch (IOException e) {
System.out.print("----error----");
}
}
public static void main(String[] ar) {
new Feed();
}
|
cs |
동물의 이름을 입력한 것을 받아서 super.getFeed(name), super.getPredlist(name) 메서드를 호출합니다.
Feed 클래스의 전체 코드를 살펴보면 get메서드가 존재합니다. 이렇게 상속으로 Animals 클래스에 정의 되어 있는 메서드 전부 사용 할 수 있습니다.
super.get 메서드에서 super는 자신의 멤버필드를 사용할 때 객체를 생성하지 않고
접근 할 수 있는(자신의 부모의 멤버필드에 접근한다는 의미와 같습니다.) 지정어라고 이해하시면됩니다.
이렇게 상속을 사용한 프로그램 예시로 상속에 대해 공부해보았습니다.
▶ 아래는 코드 실행 결과입니다.
최근댓글