컴퓨터과학
[JAVA개념공부]is-a관계 (상속관계의 객체화)
광드
2021. 5. 25. 23:49
728x90
반응형
●자바에서의 is-a관계 (상속관계의 객체화)
- 모든 객체의 Data Type은 부모 객체가 될 수 있다.
- 모든 자식영역을 Reference할 수 있지만 접근불가.
- 코드예시 & 메모리 개요
Animal타입으로 선언하면 상위 클래스 Object까지 참조할 수 있음.
Object타입으로 선언하면 해당 클래스 Object까지만 참조할 수 있음. = 하위 클래스 Animal영역에 접근할 수 없음.
- ex1) 하위 클래스의 메소드를 사용하기 위해서는 다운캐스팅이 필요하다.
Animal a1 = new Fish(); //최상의 타입인 Object 클래스, 그리고 자식 클래스 Animal
((Fish)a1).breath(); //주의 깊게 사용해야하는 다운캐스팅 방식
- ex2) 상위 클래스 타입에서도 하위 클래스 내에서 오버라이드(Override)된 메소드는 접근하여 사용할 수 있다.
Object a1 = new Animal();
//자식 클래스 ‘Fish’의 ‘breath()’메소드
@Override
public void breath() { // over-riding
System.out.println("숨 : 아가미 호흡");
return;
}
//부모 클래스 ‘Animal’의 ‘breath()’ 메소드
public void breath() {
System.out.println("숨 : 폐 호흡");
return;
}
위와 같은 경우에는 부모 클래스 타입의 Animal 객체인 a1에서도 ‘breath()’메소드를 통해 “숨 : 폐 호흡”의 결과를 얻게 된다.
cf) Override : 부모 클래스에서 선언된 메소드와 같은 이름으로 하위 클래스에서 메소드를 선언하면 Override되어 하위 클래스에서 해당 이름의 메소드를 호출할 때 항상 하위 클래스에서 선언된 메소드로만 호출된다.
- is-a관계를 쓰는 이유 (이점)
- 공통으로 사용하고자 하는 메소드를 Override한다면 다음과 같이 상위 클래스 타입으로 동시에 자식 클래스들의 메소드를 호출할 수 있다.
is-a관계 이점의 예시)
// 부모타입을 이용한(is-a관계) 선언을 이용하지 않을 시
Student[] s = { new Student("김학생", 15, 2020201) };
Teacher[] t = { new Teacher("김선생", 35, "JAVA") };
Employee[] e = { new Employee("김직원", 30, "행정실") };
for (Person data : s) {
data.print();
}
for (Person data : t) {
data.print();
}
for (Person data : e) {
data.print();
}
// 부모타입(is-a관계)의 이점 : 여러 타입 한번에 관리 가능
Person[] p = {
new Student("김학생",
15, 2020201), new Teacher("김선생", 35, "JAVA"),
new Employee("김직원", 30, "행정실")
};
for (Person data : p) {// Override된 메소드
data.print();
}
Override의 이점 예시) print(); 메소드를 Override한 경우, 그렇지 않은 경우.
// Override된 메소드의 이점
// 하위 클래스의 메소드를 간단하게 호출
for (Person data : p) {
data.print();
}
// Override되지 않은 메소드는 상위 클래스에서 호출할 수 없음.
// Downcasting하여 자식 클래스의 메소드를 강제로 사용
for (Person data : p) {
if(data instanceof Student)
System.out.println(((Student)data).getId());
}
728x90
반응형