자바는 클래스끼리의 상속이 가능하다.
상속이란, 부모 클래스의 속성과 매서드 값, 즉 모든 것을 자식 클래스에게 물려주는 것을 이야기 한다.
이 때, 우리가 알고 있는 상속과 자바의 상속은 다른데, 자바에서는 객체 지향 프로그램 속 상속의 의미를 가지려고 하면 다형성이 있어야 한다.
조금 더 쉽게 말하면, 부모 클래스로 올라갈수록 일반화가 된다.
예를 들어
1. 집은 기와집이나 초가집의 일반화이다. 따라서 집은 기와집이나 초가집의 부모 클래스가 된다. 이 때 기와집은 '기와집', 이라고 불리기도 하고 '집' 이라고도 불리기도 한다. 이렇게 이름에 대해서 다양한 명칭을 가지게 되는 것을 상속이라고 한다.
2. 아빠와 아들의 경우 일반적으로는 아빠<-아들로 상속이 되지만, 아들은 아빠가 아니다. 따라서 이 때는 프로그래밍상으로 상속이 일어나지 않는다.
따라서, 부모 클래스는 자식 클래스와 동일하거나, 자식클래스들이 공통적으로 가지고 있는 값들만 가지고 있어야 한다. 그렇기 때문에 프로그래밍 할 때 자식 클래스에서 공통점을 찾아 부모 클래스에 적용한다.
상속의 예를 보자.
package ch05;
class 사람{
int num=10;
}
class 아시아인 extends 사람{
}
class 한국인 extends 아시아인{
}
class 박서준 extends 한국인{
}
상속은 extends라는 키워드를 붙인다. 따라서 이 클래스는
(부모)사람-> 아시아인 -> 한국인 -> 박서준(자식)의 순서로 상속된다.
public class EveryPerson {
public static void main(String[] args) {
박서준 b1 = new 박서준();
System.out.println(b1.num);
}
다음과 같이 출력해보면,
박서준에게 아무런 값이 없음에도 10이 출력되는 것을 볼 수 있다. 이는, 프로그램이 '박서준' 에 주어진 값과 동일한 값이 클래스 내부에 없을 경우 부모 클래스로 거슬러 올라가며 값을 찾는다.
다음과 같은 출력값을 제시해보자.
한국인 b2= new 박서준();
System.out.println(b2.num);
이 때, 값은 동일하게 나올 것이다.
만약, 이런 상황이 온다면
class 한국인 extends 아시아인{
}
class 박서준 extends 한국인{
String name="박서준";
}
한국인 b2= new 박서준();
System.out.println(b2.name);
이렇게 되면, 이 코드는 name을 찾을 수 없다. 메모리는 박서준까지 띄웠지만, b2의 레퍼런스가 가리키는 것이 박서준의 부모 클래스인 한국인이이 때문에, 자식 클래스의 변수를 참조하지 않고 부모 클래스에서만 찾기 때문이다.
그것은 다음과 같은 예시를 보면 알 수 있다.
class 사람{
int num=10;
}
class 아시아인 extends 사람{
int num=30;
}
class 한국인 extends 아시아인{
}
class 박서준 extends 한국인{
int num=20;
}
한국인 b2= new 박서준();
System.out.println(b2.num);
이렇게 값을 넣으면 결과값은 30이 나온다. 왜일까?
메모리는 박서준까지 전부 열리지만, 상속에 의해서 메모리에서 탐색하는 순서가 한국인 - 아시아인 - 사람의 순서로 변수를 탐색하기 때문이다.
만일 이런 상황에서 박서준에 있는 20을 도출하고 싶다면 어떻게 해야할까?
상속도 자료형과 마찬가지로 다운 캐스팅이 가능하다.
박서준 downB2 = (박서준)b2;
System.out.println(downB2.num);
b2의 탐색 순서를 강제로 박서준으로 다운 캐스팅 함으로써 박서준에 있는 값을 도출할 수 있다.
이 때, "박서준"의 데이터가 메모리에 떠있지 않다면 다운 캐스팅을 할 수 없다.
상속된 데이터를 부를 때 주의 할 점이 있다.
박서준 b4 = new 한국인();
다음과 같은 호출은 오류가 나는데, 한국인까지 메모리가 열리면 박서준의 메모리가 열리지 않기 때문에, 박서준 메모리를 가리킬 수 없게 된다.
'JAVA' 카테고리의 다른 글
JAVA 실습 6. 매서드 오버라이딩을 이용한 오버로딩 줄이기 (0) | 2020.03.30 |
---|---|
9. 매서드 오버라이딩 (0) | 2020.03.30 |
7. 오버로딩 (0) | 2020.03.27 |
6. 생성자 (0) | 2020.03.27 |
클래스, 객체, 인스턴스 (0) | 2020.03.27 |