Post

다형성

분명히 안다고 생각했는데 면접때 제대로 대답을 못해서 다시 정리하는

다형성이란?

다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.

자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조 할 수 있도록 하여 구현하고 있습니다.

다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다.


자바에서 다형성 구현 종류

상속 클래스 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Parent {
    public String name;

    Parent() {
        this.name = "";
    }

    Parent(String name) {
        this.name = name;
    }

    void print() {
        System.out.println("I'm Parent");
    }
}
class Child extends Parent {

	Child(String name) {
    	super(name);
    }
}

메소드 오버라이딩

오버라이딩 : 상위 클래스의 메서드를 하위 클래스에서 재정의하는 행위를 의미한다.

오버라이딩 개념도 꼭!! 기억하자 왜 하나도 비슷하지 않은데 이름만 비슷해서 맨날 헷갈려

1
2
3
4
5
6
7
8
9
10
11
12
13
class Child extends Parent {

	Child(String name) {
    	super(name);
    }
    
    @Override
    void print() {
    	System.out.println("I'm Child");
    }
}

업캐스팅하여 객체 선언

업캐스팅 : 자식 클래스 객체를 부모 클래스로 형변환한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Animal {
    public void speak() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

class Dog extends Animal {
    public void speak() {
        System.out.println("멍멍!");
    }
}

class Cat extends Animal {
    public void speak() {
        System.out.println("야옹!");
    }
}

public class Main {
    public static void main(String[] args) {
        // 업캐스팅하여 객체 선언
        Animal animal1 = new Dog();  // Dog 클래스 객체를 Animal 클래스 타입으로 업캐스팅
        Animal animal2 = new Cat();  // Cat 클래스 객체를 Animal 클래스 타입으로 업캐스팅
        
        // Animal 클래스의 메소드 호출
        animal1.speak();  // 출력: "멍멍!"
        animal2.speak();  // 출력: "야옹!"
    }
}



부모 클래스 객체로 자식 메소드 호출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Parent {
    public void show() {
        System.out.println("부모 클래스의 메소드입니다.");
    }
}

class Child extends Parent {
    @Override
    public void show() {
        System.out.println("자식 클래스의 메소드입니다.");
    }
}

public class Main {
    public static void main(String[] args) {
        // 부모 클래스 객체 생성
        Parent parentObj = new Parent();

        // 자식 클래스 객체 생성
        Child childObj = new Child();

        // 부모 클래스 객체로 자식 클래스의 메소드 호출
        parentObj.show();  // 출력: "부모 클래스의 메소드입니다."

        // 자식 클래스 객체로 자식 클래스의 메소드 호출
        childObj.show();   // 출력: "자식 클래스의 메소드입니다."
    }
}



장점

유연성과 확장성을 제공한다는 것이 장점!

동일한 메소드를 여러 클래스에서 다르게 구현할 수 있으므로, 코드를 재사용하고 확장하기가 훨씬 쉬워집니다.

단점

실행 시간에 객체의 실제 타입을 확인해야 하므로 약간의 오버헤드가 발생할 수 있습니다.

이는 성능에 영향을 줄 수 있다고 한다.

This post is licensed under CC BY 4.0 by the author.