다형성이란?
- 다형성이란 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미함
- 자바에서는 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있게 함으로써 구현하고 있음
- 이 때 참조 변수가 사용할 수 있는 멤버 개수는 실제 인스턴스 개수보다 같거나 적어야함
class Parent { ... }
class Child extends Parent { ... }
...
Parent pa = new Parent();
Child ch = new Child();
Parent pc = new Child();
Child cp = new Parent();
- 참조 변수는 아래의 조건에 해당되는 경우 타입 변환이 가능함
- 서로 상속 관계에 있는 클래스 사이일 것
- 부모 클래스에서 자식 클래스로의 타입 변환일 경우 타입 변환을 명시할 것 (반대는 생략 가능)
class Parent { ... }
class Child extends Parent { ... }
class Brother extends Parent { ... }
...
Parent pa01 = null;
Child ch = new Child();
Parent pa02 = new Parent();
Brother br = null;
pa01 = ch;
br = (Brother)pa02;
br = (Brother)ch;
instanceof
- 참조 변수가 특정 인스턴스를 참조하는지 확인해주는 연산자
- 참조 변수가 대상 클래스를 참조하면 true를 반환하고, 아니거나 null을 반환하면 false를 반환함
class Parent { ... }
class Child extends Parent { ... }
class Brother extends Parent { ... }
public class Polymorphism01 {
public static void main(String[] args) {
Parent p = new Parent();
System.out.println(p instanceof Object);
System.out.println(p instanceof Parent);
System.out.println(p instanceof Child);
System.out.println();
Parent c = new Child();
System.out.println(c instanceof Object);
System.out.println(c instanceof Parent);
System.out.println(c instanceof Child);
}
}
추상 메서드, 추상클래스
- 자식 클래스에서 반드시 오버라이딩해서 사용해야하는 메서드를 추상 메서드라고 의미함
- 모듈과 같이 중복되는 부분이나 공통적인 부분들만 미리 만들어두고, 사용하는 쪽에서는 자신에게 필요한 부분만 다시 작성하도록 하여 생산성을 향상시키는데 목적을 두고 있음
굳이 구현이 필요없는 경우는 추상 메서드로 선언할 필요가 없음
- 추상 메서드는 선언부만이 존재하며 구현부는 자식 클래스에서 오버라이딩해서 사용해야 함
- 추상 메서드를 하나 이상 가지는 클래스를 추상 클래스라고 하며, 반드시 abstract 키워드를 사용해 추상클래스임을 선언해야 함
abstract class Animal { abstract void cry(); }
class Cat extends Animal {
void cry() { System.out.println("냐아아아아아아아아앙"); }
}
class Dog extends Animal {
void cry() { System.out.println("머어어어어어어어어엉"); }
}
public class Polymorphism02 {
public static void main(String[] args) {
Animal a = new Animal();
Cat c = new Cat();
Dog d = new Dog();
c.cry();
d.cry();
}
}
인터페이스
- 자바에서는 다중상속이 불가능함
- 다중 상속이 필요한 경우에는 인터페이스를 활용해야 함
- 인터페이스에는 추상 메서드와 상수만을 선언할 수 있음
추상 메서드는 전부 public abstract, 모든 필드는 public static final로 처리됨 (제어자는 생략 가능)
interface Animal { public abstract void cry(); }
interface Pet { public abstract void play(); }
class Cat implements Animal, Pet {
public void cry() {
System.out.println("냐아아아아아아아아앙");
}
public void play() {
System.out.println("고양아 놀자~!");
}
}
class Dog implements Animal, Pet {
public void cry() {
System.out.println("머어어어어어어어어엉");
}
public void play() {
System.out.println("멍멍아 놀자~!");
}
}
public class Polymorphism04 {
public static void main(String[] args) {
Cat c = new Cat();
Dog d = new Dog();
c.cry();
c.play();
d.cry();
d.play();
}
}
내부 클래스
- 클래스 내부에 추가로 클래스를 선언한 것을 내부 클래스라고 함
- 내부 클래스를 사용하면 내부 클래스에서 외부 클래스 멤버에 손쉽게 접근 가능하며, 관련 있는 클래스를 묶어 캡슐화 가능하며, 코드의 복잡도를 줄일 수 있다는 장점이 있음
- 클래스를 선언한 위치에 따라 정적 클래스, 인스턴스 클래스, 지역 클래스, 이름을 가지지 않는 익명 클래스로 구분할 수 있음
출처:
http://www.tcpschool.com/java/java_polymorphism_concept