영업 뛰다가 온, 남들과 조금 다른 주니어 개발자

영업하면서 배운 고객 중심적 사고, 비즈니스 통찰력 등을 총동원해서 서비스를 개발하고 있습니다. 영업 경험이 개발하는 과정에서 큰 역할을 하더라구요, 즐겁게 개발하고 있습니다!

Language/JAVA

[JAVA] Polymorphism 코드로 이해하기

브윗 2024. 8. 30. 15:02

Polymorphism, 다형성

 

 

아래는 생활코딩에서 보면서 한 예제.

좀 더 자세한 설명은 코드 아래에 적었다!

class A(){
	String x(){"x"};
}
class B1 extends A(){
	String x(){"B1.x"}; //class A의 x() method를 오버라이딩함.
	String y(){"B1.y"};
}
class B2 extends A(){
	String x(){"B2.y"}; //class A의 x() method를 오버라이딩함.
    String y(){"B2.y"};
    String z(){"B2.z"};
}

public class Exam01{
	public static void main(String[] args){
		A obj1 = new B1();
		A obj2 = new B2();
        
        System.out.println(obj1.x()); //B1.x 가 출력됨.
        System.out.println(obj2.x()); //B2.x 가 출력됨.

	}
}

 

 

A obj1 = new B1(); <- 이 부분은, B1 이라는 클래스의 인스턴스 이름을 obj1 으로 하되, 이 obj1 은 클래스 A의 형세를 갖고 있다는 뜻.

 

즉, B1 에 있는 method 들이, A의 구조를 따라간다는 뜻으로, A가 갖고 있는, B1 과 A 사이에 겹치는 method 위에만 B1의 내용이 덮어씌워진 것이라고 볼 수 있겠다. 

 

그래서, 클래스 A에는 y() 및 z() method 가 없기 때문에,

obj1 과 obj2 에선 y() z() method 를 쓸 수가 없다!

 


 

참고로, class 뿐만 아니라, interface 도 다형성 가능!

아래는 interface 인 I 를 구현한 class C 를 작성한 코드.

class C() 의 인스턴스를 obj 로 만들고, 이 obj 는 I 의 형세를 띔.

I에 설정되어 있는 method 만 구현할 수 있기에, class C 에 있는 dummy() method 는 obj 인스턴스로 사용 불가.

Interface I {
	String str(){}
    Int int(){}
}
class C implements I {
	String str(){return "C.str";}
    Int int(){return 100;}
    
    void dummy(){System.out.println("hi");
}
public class Exam02 {
	public static void main(String[] args){
    	I obj = new C();
        obj.str(); //C.str 이 출력됨.
        obj.int(); //100이 출력됨.
	}
}

 

 


다형성 관련 예제 3가지

 

 

1번째

package com.test.oop;

class Family{
    void hello(){
        System.out.println("가족들과 인사하고 지냅시다");

    }
}

class KimFamily extends Family {
    void hello(){
        System.out.println("김선생님 안녕하세요?");
    }

    void dinner(){
        System.out.println("같이 식사나 한 번 하시죠");
    }
    
    void drink(){
        System.out.println("술 한잔 하시죠");
    }
}

class ParkFamily extends Family {
    void hello(){
        System.out.println("박선생님 안녕하세요?");
    }
    void fishing(){
        System.out.println("낚시 한 번 하시죠");
    }
}

class ChoiFamily extends Family {  
    void hello(){
        System.out.println("최선생님 안녕하세요?");
    }
    void meeting(){
        System.out.println("가족 모임 한 번 하시죠");
    }

}

public class PolymorphismExam {
    public static void main(String[] args){


        //Upcasting 의 경우는 생성된 인스턴스(Child)의 메소드를 실행 --> 가상메소드
        Family f;
        f = new KimFamily(); //인스턴스 생성.
        f.hello(); //Parent 꺼가 실행이 안되고, Child 꺼만 실행됨.

        f = new ParkFamily();
        f.hello();
        
        f = new ChoiFamily();
        f.hello();

    }
}

 

 

2번째

package com.test.oop;

class Animal{
    public void move(){
        System.out.println("동물이 움직입니다.");
    }
}

class Human extends Animal{
    public void move(){
        System.out.println("인간이 움직입니다.");
    }

}

class Tiger extends Animal{
    public void move(){
        System.out.println("호랑이가 움직입니다.");
    }
}

class Eagle extends Animal{
    public void move(){
        System.out.println("독수리가 움직입니다.");
    }
}


public class PolymorphismExam02 {
    public static void main(String[] args){
        PolymorphismExam02 animalTest = new PolymorphismExam02();
        animalTest.moveAnimal(new Human()); //인스턴스를 주입. Injection. (생성이 아님)
        animalTest.moveAnimal(new Tiger());
        animalTest.moveAnimal(new Eagle());
        animalTest.moveAnimal(new Animal());
    }
    
    public void moveAnimal(Animal animal){ //class 인자 (animal 이라는 인스턴스)를 가지는 method
        animal.move();
    }
}

 

 

3번째

package com.test.oop;


class Animal1{
    public void move(){
        System.out.println("동물이 움직입니다.");
    }
}

class Human1 extends Animal1{
    public void move(){
        System.out.println("인간이 움직입니다.");
    }

}

class Tiger1 extends Animal1{
    public void move(){
        System.out.println("호랑이가 움직입니다.");
    }
}

class Eagle1 extends Animal1{
    public void move(){
        System.out.println("독수리가 움직입니다.");
    }
}

class AnimalMove{
    Animal1 animal;
    public AnimalMove(Animal1 animal){ //생성자를 통한 인스턴스 주입
        this.animal = animal;
        animal.move();
    }

}


public class PolymorphismExam03 {
    public static void main(String[] args){
        new AnimalMove(new Human1());
        new AnimalMove(new Eagle1());
        new AnimalMove(new Tiger1());
        new AnimalMove(new Animal1());
    }
}