JAVA

[ Java ] - 상속 (instanceOf / 멤버변수가 같을 때 )

algml0703 2023. 1. 2. 17:17
반응형

상속

instanceOf

상속관계의 클래스에서 해당 클래스가 속한 타입을 구별하는데 도움을 주는 키워드이다.

package chapter07;

public class InstancdOfEx {

    public static void main(String args[]) {
        Person[] people = {new Person(), new Teacher(), new Student()};

        for (int i = 0; i<people.length; i++) {
            people[i].sayMe();
            if (people[i] instanceof Person) {
                System.out.println("person type");
            } else if (people[i] instanceof Student) {
                System.out.println("stuent type");
            } else if (people[i] instanceof Teacher) {
                System.out.println("teacher type");
            }
        }
        // 나는 사람입니다.
        // person type
        // 나는 선생닙니다.
        // person type
        // 나는 학생입니다.
        // person type

        System.out.println("---------");

        for (int i = 0; i<people.length; i++) {
            people[i].sayMe();
            if (people[i] instanceof Teacher) {
                System.out.println("teacher type");
            } else if (people[i] instanceof Student) {
                System.out.println("student type");
            } else if (people[i] instanceof Person) {
                System.out.println("person type");
            }
        }
        // 나는 사람입니다.
        // person type
        // 나는 선생닙니다.
        // teacher type
        // 나는 학생입니다.
        // student type

    }
}

class Person {
    public void sayMe() {
        System.out.println("나는 사람입니다.");
    }

}
class Teacher extends Person {
    public void sayMe() {
        System.out.println("나는 선생닙니다.");
    }

}
class Student extends Person {
    public void sayMe() {
        System.out.println("나는 학생입니다.");
    }
}

위의 코드에서 두 for문을 보면 첫번째 for문에서는 전부 person type을 출력하고 있는 것을 확인할 수 있다. 이는 Teacher 클래스와 Student클래스가 Person클래스를 상속받는 하위클래스이기 때문이다. 때문에 위와 같은 문제를 해결하기 위해서는 상위클래스를 상속받은 하위클래스의 타입을 먼저 비교해야 한다.

상위클래스와 하위클래스의 멤버변수명이 같은 경우

package chapter07;

public class BindingTest {
    public static void main(String args[]) {
        Parent p = new Child();
        Child c = new Child();

        System.out.println(p.x);
        p.method();
        System.out.println(c.x);
        c.method();
    }
}
//100
//child method
//200
//child method

class Parent {
    int x = 100;
    void method() {
        System.out.println("parent method");
    }

}
class Child extends Parent {
    int x = 200;
    void method() {
        System.out.println("child method");
    }

}

상위클래스에서 선언된 멤버변수와 하위클래스의 멤버변수가 같은 경우 해당 인스턴스의 타입에 따라 멤버변수가 결정된다. 위의 코드의 경우 멤버변수 x는 Parent 타입의 p변수에서는 parent를 출력하고, Child 타입의 c 변수에서는 child를 출력하는 것을 확인할 수 있다. (반면에 메서드의 경우에는 하위클래스이 메서드로 오버라이딩 된다.)

 

출처

자바의 정석(남궁성)

반응형