반응형
상속
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를 출력하는 것을 확인할 수 있다. (반면에 메서드의 경우에는 하위클래스이 메서드로 오버라이딩 된다.)
출처
자바의 정석(남궁성)
반응형
'JAVA' 카테고리의 다른 글
[ JAVA ] - 파일 작업하기 (파일 읽기) (0) | 2023.05.11 |
---|---|
[ JAVA ] - 커스텀 어노테이션 만드는 법 (0) | 2023.05.06 |
[ Java ] - 생성자 (0) | 2022.12.30 |
[ Java ] - 오버로딩과 오버라이딩 (0) | 2022.12.30 |
[ Java ] - 클래스 / 객체 / 인스턴스 (인스턴스의 생성과 사용법) (0) | 2022.12.28 |