다형성(Polymorphism)
- 한 객체가 여러가지 타입을 가질 수 있는 것(객체 지향 프로그래밍에서 한 클래스가 여러 타입으로 인식될 수 있는 능력)
- 부모 클래스 타입의 참조 변수로 자식클래스 인스턴스 참조
참조변수와 다형성
- 서로 상속관계에 있는 클래스 사이에서만 형변환이 가능
- 메서드 매개변수가 같은 부모 클래스라면 부모 클래스 타입을 매개변수 타입으로 선언 가능
- 배열 혹은 자료구조에 부모 클래스로 데이터 타입을 지정하면 여러 자식 클래스를 저장 가능
- instanceof 연산자로 참조변수가 참조하는 인스턴스의 실제 타입을 확인하는데 사용 가능
instanceof
- 실제 참조하고 있는 인스턴스의 타입 확인
- 특정 객체가 특정 클래스의 인스턴스인지 확인하는 데 사용
class Animal {
void sound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
void sound() {
System.out.println("Dog barks");
}
}
class Cat extends Animal {
void sound() {
System.out.println("Cat meows");
}
}
public class TestPolymorphism {
public static void main(String[] args) {
Animal a;
a = new Dog();
a.sound();
a = new Cat();
a.sound();
// 사용 예: instanceof
if (a instanceof Cat) {
System.out.println("a is an instance of Cat");
}
if (a instanceof Dog) {
System.out.println("a is an instance of Dog");
}
if (a instanceof Animal) {
System.out.println("a is an instance of Animal");
}
}
}
Dog barks
Cat meows
a is an instance of Cat
a is an instance of Animal
- a는 Cat의 인스턴스(당연히 Animal의 인스턴스에도 해당됨, Cat은 Animal을 상속받았기 때문)이기 때문에 Dog의 인스턴스인지 확인하는 instanceof에서는 false를 반환한다.
패키지와 제어자
패키지(package)
- 물리적으로 관련이 있는 클래스 파일들을 포함하는 하나의 디렉토리
- 계층구조를 .(점) 으로 구분
- 모든 클래스는 반드시 한 패키지에 속해야 함
- 같은 클래스 이름이라도 서로 다른 패키지에 속하면 구별 가능
Import 문
- Java 컴파일러에게 소스 파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것
- Import 문으로 사용하고자 하는 class파일의 패키지를 명시해주면 클래스 사용 시 생략 가능
- Import문에 package.* 을 하더라도 하위 패키지의 모든 클래스를 포함하는 것은 아님
- 주로 하위 패키지.* 로 구체적으로 명시
- import static 문으로 작성하면 클래스 사용 시, 클래스 생략 가능