[Java] - 다형성

chancehee·2022년 12월 8일
0

자바

목록 보기
7/12
post-thumbnail
post-custom-banner

0. 글을 작성하는 이유

객체지향 언어의 특징 중 하나인 다형성에 대해서 자세히 알아보기 위해서 이 글을 작성합니다.

1. 다형성(Polymorphism)

하나의 객체가 많은 형(타입)을 가질 수 있는 성질입니다.
(상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리)

[예시]
장동건(자식) is a 로미오(부모)
원빈(자식) is a 로미오(부모)

2. 유형

  1. 컴파일 타입 다형성 - 오버로딩
  2. 런타임 타입 다형성 - 오버라이딩

3. 사용 이유

  1. 자바의 자료 구조를 간단하게 처리할 수 있습니다.
    (뭐든지 담을 수 있는 만능의 주머니)

    [예시]
    Object[] objs = new Object[3];
    objs[0] = "Chancehee"; // java.lang.String
    objs[1] = objs; // [Ljava.lang.Object;
    objs[2] = 1; // autoboxing: int -> java.lang.Integer 
  2. 매개변수의 다형성
    (조상을 파라미터로 처리한다면 객체의 타입에 따라 메서드를 만들 필요가 없습니다.)
    [예시]
    public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

4. 다형성 활용

  • 메모리에 있는 것과 사용할 수 있는 것의 차이를 알아야 합니다.
    (메모리에 있더라도 참조하는 변수의 타입에 따라 접근할 수 있는 내용이 제한됩니다.)
  • 참조형 객체의 형 변환
    작은 집(child) -> 큰 집(super) : 묵시적 캐스팅
    (조상의 모든 내용이 자식에 있기 때문에 걱정할 필요가 없습니다.)
    Fish fish = new Fish();
    Object obj = fish;
    큰 집(super) -> 작은 집(child) : 명시적 캐스팅
    (조상 타입을 자손 타입으로 참조: 형변환 생략 불가능)
    (조상을 무작정 자손으로 변경하면 무늬만 같는 형변환이 발생할 수 있습니다.)
    (instanceof 연산자를 통해서 실제 메모리에 있는 객체가 특정 클래스 타입인지 boolean으로 리턴 받아 확인하고 사용합니다.)
    Fish fish = new Shark();
    // 형변환을 할 때에는 반드시 타입을 확인하고 하자!!
    if (fish instanceof Shark) {
    	Shark shark = (Shark)fish;
    }
  • 참조 변수의 레벨에 따른 객체의 멤버 연결
    (Override된 메서드가 있다면, 조상 타입의 메서드를 호출하더라도 가장 최적화된 자식 클래스의 메서드가 호출됩니다. -> virtual method invocation)
    (용도에 따른 가장 적합한 메서드 구성)
    - 상위로 올라갈 수록 활용도가 높아집니다.하지만 코드의 복잡성도 함께 증가합니다.
    - 많은 경우 비즈니스 로직 상 최상위 객체 사용을 권장합니다.

5. 다형성 장점

  1. 유지보수가 쉬워집니다.
  2. 재사용성이 증가합니다.
  3. 느슨한 결합이 가능합니다.

6. 다형성 필수 조건

  1. 상속 관계
    다형성을 활용하기 위해서는 필수로 부모-자식 간 클래스 상속이 이루어져야 합니다.
  2. 오버라이딩
    다형성이 보장되기 위해서는 하위 클래스 메서드가 반드시 재정의되어 있어야 합니다.
  3. 업캐스팅
    부모 타입으로 자식클래스를 업캐스팅하여 객체를 생성해야 합니다.

7. 결론

다형성을 잘 활용하면 유연한 소프트웨어를 만들 수 있습니다.
하지만 올바르지 못한 사용은 코드의 가독성을 떨어 뜨리고, 디버깅의 어려움을 줄 수 있습니다.
따라서 개발자는 다형성을 확실히 이해하고 올바르게 적용한다면 좋은 객체 지향 설계가 가능할 것 입니다.📚🥳

post-custom-banner

0개의 댓글