본문 바로가기
Java

JAVA 다형성

by titlejjk 2023. 5. 2.

Java의 다형성(polymorphism)은 객체 지향 프로그래밍의 중요한 개념 중 하나로, 상속, 인터페이스, 오버라이딩 등의 기술을 이용하여 같은 타입이지만 다른 객체를 참조할 수 있도록 하는 것을 말한다. 이를 통해 코드 재사용성과 유지보수성을 높일 수 있다.

자바에서 다형성을 구현하는 방법은 크게 두 가지이다.

첫 번째는 부모 타입으로 자식 객체를 참조하는 업캐스팅(Upcasting)이다. 이 경우, 부모 클래스 타입의 변수로 자식 클래스 타입의 객체를 참조 하는 것. 따라서 부모 클래스에서 정의된 메서드만 사용할 수 있다.

두 번째는 오버라이딩(Overriding)이다. 부모 클래스에서 정의한 메서드를 자식 클래스에서 다시 정의하여 사용하는 것을 말한다. 이 때, 메서드의 이름, 매개변수, 반환형이 모두 일치해야 한다.

 

다형성을 사용하면 코드의 유연성과 확장성이 높아진다. 예를 들어, 상속과 오버라이딩을 이용하여 동물 클래스를 만들고, 각 동물마다 다르게 움직이는 메서드를 정의할 수 있다. 이때, 동물 클래스 타입의 변수로 각 동물 객체를 참조할 수 있고, 해당 변수를 이용하여 다양한 동물 객체를 관리할 수 있다. 이렇게 하면 새로운 동물 클래스를 추가하거나 기존 클래스를 수정하는 경우, 코드의 변경을 최소화하고 유지보수가 용이해진다.

 

다만 다형성을 사용하면 코드의 가독성이 떨어 질수도 있으며, 부모 클래스에서 정의된 메서드만 사용해야 하기 때문에, 자식 클래스에서 추가된 메서드나 기능을 사용하기 위해서는 타입캐스팅을 해야 한다. 이때, 캐스팅을 잘못하면 런타임 에러가 발생할 수 있으며, 다형성을 사용하면 컴파일러가 오류를 잡아내지 못할 수 있다. 이러한 문제를 해결하기 위해 instanceof 연산자나 getClass()메서드를 이용하여 객체의 타입을 확인할 수 있다.

 

오버로딩👉

같은 이름의 메서드를 여러 개 정의하고, 매개변수의 개수나 자료형을 다르게 하여 다양한 상황에서 호출할 수 있도록 하는 것이다. 예를 들어 print() 메서드를 정의할 때, 매개 변수 없이 호출할 수 있는 print() 와 문자열을 출력하는 print(String str)등 다양한 형태의 print() 메서드를 오버로딩하여 사용할 수 있다.

 

오버라이딩👉

상위 클래스에서 정의한 메서드를 하위 클래스에서 다시 재정의하여 사용하는 것.

상속 관계에서 부모 클래스의 메서드를 자식 클래스에서 다시 정의하여 사용 하는 것이다. 이때, 메서드의 이름, 매개변수, 반환형이 모두 일치해야 한다. 예를 들어, Animal클래스에서 정의한 move()메서드를 Dog클래스에서 재정의하여 사용할 수 있다.

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

class Dog extends Animal {
    @Override
    public void move() {
        System.out.println("개가 네 발로 걷습니다.");
    }

    public void bark() {
        System.out.println("멍멍!");
    }
}

class Cat extends Animal {
    @Override
    public void move() {
        System.out.println("고양이가 네 발로 걷습니다.");
    }

    public void meow() {
        System.out.println("야옹~");
    }
}

public class PolymorphismExample {
    public static void main(String[] args) {
        Animal animal1 = new Animal();
        Animal animal2 = new Dog();
        Animal animal3 = new Cat();

        animal1.move(); // 동물이 움직입니다.
        animal2.move(); // 개가 네 발로 걷습니다.
        animal3.move(); // 고양이가 네 발로 걷습니다.

        // animal2.bark(); // 에러 발생: Animal 클래스에 bark() 메서드가 없기 때문
        Dog dog = (Dog) animal2;
        dog.bark(); // 멍멍!

        // animal3.meow(); // 에러 발생: Animal 클래스에 meow() 메서드가 없기 때문
        Cat cat = (Cat) animal3;
        cat.meow(); // 야옹~
    }
}

'Java' 카테고리의 다른 글

JAVA Extends  (0) 2023.05.02
JAVA Abstract  (0) 2023.05.02
JAVA This  (0) 2023.05.01
JAVA Scanner  (0) 2023.05.01
JAVA Static  (0) 2023.04.27

댓글