hyeongwoo's blog

[Java] 다형성 본문

JAVA

[Java] 다형성

toribro 2024. 1. 27. 17:12

다형성(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