T.I.L #12 다형성(Polymorphism)

개발자지망생·2023년 10월 24일
0

다형성(Polymorphism)이란?

여러 다른 클래스가 동일한 인터페이스나 베이스 클래스를 공유하여 코드를 더 유연하게 만드는 데 사용된다. 다형성은 같은 이름의 메소드 또는 연산자를 여러 객체 유형에 적용할 수 있는 능력을 의미하며, 실행 시간 또는 컴파일 시간에 여러 다른 유형의 객체를 처리할 수 있는 코드를 작성할 수 있게 한다.

1. 메소드 다형성

메소드 오버로딩 및 메소드 오버라이딩을 통해 구현된다. 메소드 오버로딩은 동일한 메소드 이름을 가지지만 다른 매개변수를 혀용하는 것이고, 메소드 오버라이딩은 부모 클래스와 자식 클래스 사이에서 메소드를 재정의하는 것이다.

2. 다형성을 통한 코드 재사용성

인터페이스, 추상 클래스 또는 베이스 클래스를 사용하여 여러 클래스가 동일한 인터페이스를 구현하거나 동일한 베이스 클래스를 상속할 수 있다. 이것은 코드의 재사용성을 높이고 유지 보수성을 향상시킨다.

3. 동적 바인딩(Dynamic Binding)

다형성은 실행 시간에 객체의 실제 유형에 따라 메소드 호출을 동적으로 해결한다. 이것은 코드를 더 유연하게 만들고, 실행 중에 객체의 동작을 변경할 수 있게 한다.

class 메뉴항목 {
    String 이름;
    int 가격;

    메뉴항목(String 이름, int 가격) {
        this.이름 = 이름;
        this.가격 = 가격;
    }

    void 주문() {
        System.out.println(이름 + "을 주문합니다. 가격: $" + 가격);
    }
}

class 햄버거 extends 메뉴항목 {
    햄버거(String 이름, int 가격) {
        super(이름, 가격);
    }
}

class 음료 extends 메뉴항목 {
    음료(String 이름, int 가격) {
        super(이름, 가격);
    }
}

class 사이드메뉴 extends 메뉴항목 {
    사이드메뉴(String 이름, int 가격) {
        super(이름, 가격);
    }
}

public class 메뉴주문 {
    public static void main(String[] args) {
        메뉴항목[] 주문 = new 메뉴항목[3];
        주문[0] = new 햄버거("치즈버거", 5);
        주문[1] = new 음료("콜라", 2);
        주문[2] = new 사이드메뉴("감자튀김", 3);

        System.out.println("주문 내역:");
        for (메뉴항목 항목 : 주문) {
            항목.주문();
        }
    }
}

메뉴항목 클래스를 상속하는 햄버거, 음료, 사이드메뉴 클래스가 있고, 각 클래스는 메뉴 항목의 이름과 가격을 나타내며, 주문 메소드를 오버라이딩하여 각 메뉴 항목을 주문하는 동작을 구현한다.

메뉴항목 배열에 다향한 메뉴 항목 객체를 저장하고 반복문을 통해 각 메뉴 항목을 주문한다. 이때, 다형성을 사용하여 각 메뉴 항목의 실제 유형에 따라 올바른 메소드가 호출된다.

다형성(Polymorphism) 추가 설명

1. 업캐스팅(Upcasting)과 다운캐스팅(Downcasting)

업캐스팅은 하위 클래스의 객체를 상위 클래스 유형의 참조 변수에 할당하는 것을 말한다. 다운캐스팅은 상위 클래스의 참조 변수를 하위 클래스 유형으로 변환하는 것을 의미한다. 다운캐스팅을 할 때 주의해야 하며, instanceof 연산자를 사용하여 유효성 검사를 수행하는 것이 좋다.

2. 다형성과 추상 클래스, 인터페이스

추상 클래스와 인터페이스는 다형성을 구현하는데 중요한 역할을 한다. 여러 클래스가 동일한 인터페이스를 구현하거나 추상 클래스를 상속받으면 클라이언트 코드에서 다형성을 활용할 수 있다.

3. 런타임 다형성(Runtime Polymorphism)

다형성은 주로 런타임(실행 시간)에 작동한다. 실행 시에 객체의 실제 유형에 따라 호출되는 메소드가 동적으로 결정된다.

4. 정적 다형성(Static Polymorphism)과 동적 다형성(Dynamic Polymorphism)

정적 다형성은 메소드 오버로딩과 관련이 있으며, 컴파일 시간에 메소드 오버로딩된 메소드가 결정된다. 동적 다형성은 메소드 오버라이딩과 관련이 있으며, 실행 시간에 오버라이딩된 메소드가 결정된다.

5. 오버로딩과 오버라이딩의 차이

메소드 오버로딩은 같은 메소드 이름을 가지지만 매개변수 목록이 다른 메소드를 여러 개 정의하는 것을 의미한다. 메소드 오버라이딩은 부모 클래스와 자식 클래스 간의 상속 관계에서 같은 메소드 이름을 사용하여, 메소드의 동작을 재정의하는 것이다.

6. 다형성의 이점

다형성은 코드의 재사용성과 확장성을 높이며, 복잡한 프로그램을 보다 쉽게 관리하고 확장할 수 있게 한다. 또한, 코드를 더 유연하게 만들어 다양한 객체 유형을 처리한다.

다형성(Polymorphism)은 어디에 쓰일까?

1. 인터페이스와 추상 클래스

인터페이스와 추상 클래스를 사용하여 다형성을 구현한다. 여러 클래스가 동일한 인터페이스를 구현하거나 추상 클래스를 상속함으로써, 코드에서객체를 동일한 방식으로 구현하거나 추상 클래스를 상속함으로써, 코드에서 객체를 동일한 방식으로 다룰 수 있다. 예를 들어, Java에서는 JDBC(Java Database Connectivity) API에서 인터페이스를 사용하여 다양한 데이터 베이스 벤더의 드라이버를 지원한다.

2. 다형성을 통한 모듈화

다형성을 사용하면 새로운 모듈 또는 컴포넌트를 쉽게 추가할 수 있다. 예를 들어, 그래픽 사용자 인터페이스(GUI) 라이브러리에서는 다양한 컨트롤(버튼, 텍스트 상자, 체크 박스 등)을 일관된 방식으로 처리하는데 다형성을 사용한다.

3. 프레임워크와 라이브러리 확장

프레임워크 및 라이브러리를 개발하는 경우, 다형성을 활용하여 사용자의 정의 동작을 추가하거나 변경할 수 있는 확장 포인트를 제공한다. 이를 통해 개발자는 기존 코드를 수정하지 않고도 원하는 동작을 확장할 수 있다.

4. 다양한 데이터 유형 처리

현업에서 데이터베이스, 웹 서비스, 파일 시스템 등과 상호작용하는 경우, 다양한 데이터 유형을 처리해야 한다. 다형성을 사용하면 데이터 소스에 따라 다르게 작동하는 코드를 작성할 수 있으며, 코드의 재사용성을 향상시킬 수 있다.

5. 이벤트 처리와 리스너 패턴

이벤트 처리 시스템에서 다형성을 활용하여 여러 종류의 이벤트(마우스 클릭, 키 입력, 파일 저장 등)를 처리한다. 이벤트 처리기(리스너)는 다양한 이벤트 유형을 처리할 수 있어야 하며, 이를 위해 다형성을 활용한다.

6. 상속 관계와 다형성

클래스 상속 관계에서 다형성을 사용하여 부모 클래스 유형의 참조변수를 사용하여 다양한 하위 클래스의 객체를 처리한다. 이것은 코드의 확장성을 높이고 유지 보수성을 개선하는 데 도움을 준다.

참고한 것 : 자바의 정석 , 구글 서칭

0개의 댓글