[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한다면 다음과 같이 상위 클래스 타입으로 동시에 자식 클래스들의 메소드를 호출할 수 있다.

 

상위 클래스는 Animal,  자식 클래스는Dog와 Fish다.

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
반응형