[Effective Java] 아이템 52. 다중정의는 신중히 사용하라

2022. 11. 15. 23:01· BE/Java
목차
  1. 아이템 52. 다중정의는 신중히 사용하라
  2. 다중정의
  3. 정리
반응형

EFFECTIVE JAVA(이펙티브 자바)

 

 

이 포스팅에서 작성하는 내용은 EFFECTIVE JAVA(이펙티브자바) 에서 발췌하였습니다.


아이템 52. 다중정의는 신중히 사용하라

 

다중정의

ex 1) 컬렉션의 종류를 출력하는 예

public class CollectionClassifier {
    public static String classify(Set<?> s) {
        return "집합";
    }

    public static String classify(List<?> lst) {
        return "리스트";
    }

    public static String classify(Collection<?> c) {
        return "그 외";
    }

    public static void main(String[] args) {
        Collection<?>[] collections = {
                new HashSet<String>(),
                new ArrayList<BigInteger>(),
                new HashMap<String, String>().values()
        };

        for (Collection<?> c : collections)
            System.out.println(classify(c));
    }
}
  • “집합”, “리스트”, “그 외”를 차례로 출력하리라 예상했겠지만, 실제로는 “그 외”가 세 번 연속 출력된다.
  • 다중정의된 세 classify 중 어느 메서드를 호출할지가 컴파일타임에 정해지기 때문이다.
    • 컴파일타임에는 for 문 안의 c는 항상 Collection<?> 타입이기에 그렇다. (런타임 시에는 타입이 매번 달라짐)
  • 재정의한 메서드는 동적으로 선택되고, 다중정의한 메서드는 정적으로 선택되기 때문이다.
  • 안전하고 보수적으로 사용하기를 원한다면, 매개변수 수가 같은 다중정의는 만들지 말자.
  • 다중정의하는 대신 메서드 이름을 다르게 지어주는 방향도 고려하자.

 

 

ex2) 재정의된 메서드를 호출하는 경우

class Wine {
  String name() {
    return "포도주";
  }
}

static class SparklingWine extends Wine {
  @Override
  String name() {
    return "발포성 포도주";
  }
}

static class Champagne extends Wine {
  @Override
  String name() {
    return "샴페인";
  }
}

public class Overriding {
	public static void main(String[] args) {
	  List<Wine> wineList = List.of(
	        new Wine(), new SparklingWine(), new Champagne()
	  );
	  for (Wine wine : wineList) {
	    System.out.println(wine.name());
	  }
	}
}

  • 이 예제는 “포도주”, “발포성 포도주”, “샴페인”으로 출력된다.
  • for 문에서의 컴파일타임 타입이 Wine 인 것과 무관하게 항상 가장 하위에서 정의한 메서드가 실행되는 것이다.

 

 

정리

  • 프로그래밍 언어가 다중정의를 허용한다고 해서 다중정의를 꼭 활용하란 뜻은 아니다.
  • 일반적으로 매개변수 수가 같을 때는 다중정의를 피하는 게 좋다.
  • 상황에 따라, 이 조언을 따르기가 불가능할 수 있다.
  • 그럴 때는 헷갈릴 만한 매개변수는 형변환하여 정확한 다중정의 메서드가 선택되도록 해야한다.
  • 이것이 불가능하면, 예컨데 기존 클래스를 수정해 새로운 인터페이스를 구현해야 할 때는 같은 객체를 입력받는 다중 정의 메서드들이 모두 동일하게 동작하도록 만들어야 한다.
  • 그렇지않으면 프로그래머들은 다중정의된 메서드나 생성자를 효과적으로 사용하지 못할 것이고, 의도대로 동작하지 않는 이유도 이해하지 못할 것이다.
반응형

'BE > Java' 카테고리의 다른 글

[Effective Java] 아이템 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라  (0) 2022.11.17
[Effective Java] 아이템 53. 가변인수는 신중히 사용하라  (0) 2022.11.16
[Effective Java] 아이템 51. 메서드 시그니처를 신중히 설계하라  (0) 2022.11.14
[Effective Java] 아이템 50. 적시에 방어적 복사본을 만들라  (0) 2022.11.11
[Effective Java] 아이템 49. 매개변수가 유효한지 검사하라  (0) 2022.11.10
  1. 아이템 52. 다중정의는 신중히 사용하라
  2. 다중정의
  3. 정리
'BE/Java' 카테고리의 다른 글
  • [Effective Java] 아이템 54. null이 아닌, 빈 컬렉션이나 배열을 반환하라
  • [Effective Java] 아이템 53. 가변인수는 신중히 사용하라
  • [Effective Java] 아이템 51. 메서드 시그니처를 신중히 설계하라
  • [Effective Java] 아이템 50. 적시에 방어적 복사본을 만들라
멍목
멍목
개발 관련 새롭게 알게 된 지식이나 좋은 정보들을 메모하는 공간입니다.
반응형
멍목
김멍목의 개발블로그
멍목
전체
오늘
어제
  • 분류 전체보기 (514)
    • BE (190)
      • Spring (21)
      • Java (141)
      • Kotlin (6)
      • JPA (22)
    • FE (33)
      • Javascript (16)
      • Typescript (0)
      • React (5)
      • Vue.js (9)
      • JSP & JSTL (3)
    • DB (32)
      • Oracle (22)
      • MongoDB (10)
    • Algorithm (195)
    • Linux (8)
    • Git (6)
    • etc (42)
    • ---------------------------.. (0)
    • 회계 (4)
      • 전산회계 2급 (4)
    • 잡동사니 (2)

블로그 메뉴

  • 홈
  • 관리

공지사항

인기 글

태그

  • 코틀린
  • 프로젝트로 배우는 Vue.js 3
  • 자기 개발
  • Effective Java
  • MongoDB with Node.js
  • 알고리즘공부
  • 자기 공부
  • 자바공부
  • Java to Kotlin
  • Oracle
  • 코테 공부
  • 자바 공부
  • JPA
  • JPA 공부
  • 자기공부
  • 더 자바 애플리케이션을 테스트하는 다양한 방법
  • 이펙티브 자바
  • MongoDB 공부
  • 이펙티브자바
  • 알고리즘 공부
  • 자바 테스팅 프레임워크
  • MongoDB 기초부터 실무까지
  • 자바 개발자를 위한 코틀린 입문
  • vue3 공부
  • 코테공부
  • 자기개발
  • junit5
  • java 8
  • 전산회계 2급 준비
  • 더 자바 Java 8

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
멍목
[Effective Java] 아이템 52. 다중정의는 신중히 사용하라
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.