Notice
Recent Posts
Recent Comments
Link
hyeongwoo's blog
[Java] 다형성 본문
다형성(Polymorphism)
프로그래밍에서 하나의 객체가 여러타입의 인스턴스를 참조할 수 있는 것이다.
자바에서 다형성은 클래스상속과 인터페이스구현을 통해 이루어진다.
다형성 조건
- 클래스가 상속 관계이거나 인터페이스 구현관계이어야한다.
- 부모클래스가 자식클래스(상속받는클래스)를 참조해야한다.
- 자식클래스에서는 부모클래스나 인터페이스의 메소드를 반드시 오버라이딩 해야한다.
- 자식클래스는 부모클래스로 업캐스팅 되어야한다
- 자식클래스로 부모클래스는 참조가 불가하다.
- 오버라이딩 이외의 자식클래스의 유일 메소드에는 부모클래스의 참조변수로 접근이 불가하다.
다형성의 장점
- 여러개의 객체를 하나의 타입으로 관리할 수있다
- 객체의 재사용성이 높아진다
- 객체들의 확장에 용이하다.
다형성 예시
class Animal {
public void sound() {
System.out.println("This animal makes a sound");
}
}
class Dog extends Animal {
@Override //오버라이드
public void sound() {
System.out.println("The dog barks");
}
}
class Cat extends Animal {
@Override
public void sound() {
System.out.println("The cat meows");
}
}
class Fox extends Animal{
@Override
public void sound() {
System.out.println("?????");
}
public void tail(){
System.out.println("fox's beautiful tail");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
//다형성 구현
//Animal 타입의 참조변수가 여러개의 자식 인스턴스를 참조
Animal myAnimal = new Animal();
Animal myDog = new Dog();
Animal myCat = new Cat();
Animal myFox = new Fox();
//각 자식객체의 오버라이딩 메소드 호출
myAnimal.sound(); // This animal makes a sound
myDog.sound(); // The dog barks
myCat.sound(); // The cat meows
myFox.sound(); // What the Fox say??
// 부모 객체로 자식 유일메소드 접근 불가
// myFox.tail()// x
//접근하려면 다운캐스팅후 접근
Fox fox=(Fox)myFox;
fox.tail() // fox's beautiful tail
}
}
인터페이스
구현부가없는 메소드인 추상메소드와 상수로만 이루어진 형식
- 단독으로 객체의 인스턴스를 생성할 수 없다.
- 반드시 구현클래스가 인터페이스를 구현후 인스턴스생성이 가능하다
- 구현클래스는 인터페이스의 모든 메소드를 반드시 오버라이딩 해야한다.
- 인터페이스는 구현클래스에서 다중 상속이 가능하다.
- 인터페이스로 다형성 구현이 가능하다.
인터페이스를 이용한 다형성 구현
// 인터페이스 정의
interface Animal {
void sound();
}
//각 클래스에 인터페이스 구현
class Dog implements Animal {
@Override
public void sound() {
System.out.println("The dog barks");
}
}
class Cat implements Animal {
@Override
public void sound() {
System.out.println("The cat meows");
}
}
class Fox implements Animal{
@Override
public void sound() {
System.out.println("The Fox fufufufufufu~");
}
}
// 메인 클래스
public class InterfaceExample {
public static void main(String[] args) {
// Animal animal =new Animal() (x) 인터페이스는 단독으로 객체생성불가
//인터페이스로 다형성 구현 (업캐스팅) 부모->자식
Animal myDog = new Dog();
Animal myCat = new Cat();
Animal myFox = new Fox();
myDog.sound(); // The dog barks
myCat.sound(); // The cat meows
myFox.sound(); // The Fox fufufufufufu~
}
}
instanceof
다형성이 구현된 객체에서 인스턴스 타입을 확인하기위해 사용한다.
- 객체의 인스턴스의 타입을 확인하는 연산자이다.
- 인스턴스가 참이면 true 아니면 false를 반환한다.
- 안전하게 형 변환하기 위해 사용한다.
- 다운캐스팅시 자식 인스턴스가 의도랑 다른 타입이면 오류가 발생하므로 타입 검사를 해주어야한다.
instanceof 예시코드
public interface Animal {
public void makeSound();
}
class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("멍멍!");
}
public void fetch() {
System.out.println("공 던지기");
}
}
class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("야옹!");
}
}
class Fox implements Animal {
@Override
public void makeSound() {
System.out.println("Kiik kiik");
}
public void tail(){
System.out.println("fox's beautiful tail");
}
}
public class InstanceOfExample {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
Animal fox = new Fox();
checkInstance(cat);
checkInstance(dog);
checkInstance(fox);
}
public static void checkInstance(Animal animal){
// instanceof 연산자를 사용하여 객체의 클래스 확인
if (animal instanceof Dog) {
System.out.println(" Dog 클래스의 인스턴스입니다.");
Dog myDog = (Dog) animal;//다운 캐스팅
myDog.fetch(); // 형 변환 후 Dog 클래스의 메서드 호출 가능
}
if (animal instanceof Cat) {
System.out.println("Cat 클래스의 인스턴스입니다.");
}
if (animal instanceof Fox) {
System.out.println("Fox 클래스의 인스턴스입니다.");
Fox myFox=(Fox) animal;
myFox.tail();//fox's beautiful tail
}
}
}
'JAVA' 카테고리의 다른 글
[Java] IO_(입출력스트림) (0) | 2024.02.02 |
---|---|
[Java] None_Static영역과 Static영역 (0) | 2024.02.02 |
[Java] 상속 (0) | 2024.01.26 |
[Java] 메소드 (0) | 2024.01.26 |
[Java] this (2) | 2024.01.24 |