베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • leetcode
    • 알고리즘
    • 백준
    • 스프링시큐리티
    • 자바
    • 코드업
    • 스프링
    • 운영체제
    • java
    • 토비스프링
    • 스레드
    • Spring
    • 데이터베이스
    • C++
    • 함수형인터페이스
    • 이펙티브자바
    • jpa
    • BFS
    • 자바8
    • dfs

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    개발서적/Effective Java

    [Effective Java] 가변인수를 신중히 사용하라

    2023. 6. 2. 05:39

    가변인수

    가변인수는 명시한 타입의 인수를 0개 이상 받을 수 있다. 가변인수 메서드를 호출하면, 가장 먼저 인수의 개수와 길이가 같은 배열을 만들고 인수들을 이 배열에 젖아하여 가변인수 메서드에 건네준다.

    인수가 1개 이상이어야 할 때

    static int min(int... args) {
        if (args.length == 0)
            throw new IllegalArgumentException("인수가 1개 이상 필요합니다.");
        int min = args[0];
        for (int i = 1; i < args.length; i++)
            if (args[i] < min)
                min = args[i];
        return min;
    }

    위 코드는 다음과 같은 문제가 있다.

    1. 인수를 0개만 넣어 호출하면 런타임에 실패한다.
    2. 코드가 지저분한다
    3. args 유효성 검사를 명시적으로 해야 한다.

    이를 다음코드처럼 매개변수를 2개 받도록 하면 매끄럽게 해결된다.

    static int min(int firstArg, int... remainingArgs) {
        int min = firstArg;
        for (int arg : remainingArgs)
            if (arg < min)
                min = arg;
        return min;
    }

    가변인수와 성능

    만약 성능에 민감한 상황이라면 가변인수가 걸림돌이 될 수 있다. 가변인수 메서드는 호출될 때마다 배열을 새로 하나 할당하고 초기화한다. 이럴 때는 메서드 호출의 빈도수를 고려하여 메서드를 작성하면 된다.

    예를 들어 해당 메서드 호출의 95%가 인수를 3개 이하로 사용한다고 해보자. 그렇다면 인수가 0개인 것부터 4개인 것까지 총 5개를 다중정의하자. 마지막 다중정의 메서드가 인수 4개 이상인 5%의 호출을 담당한다.

    public void food() {}
    public void food(int a1) {}
    public void food(int a1, int a2) {}
    public void food(int a1, int a2, int a3) {}
    public void food(int a1, int a2, int a3, int... rest) {}
    저작자표시 비영리 변경금지 (새창열림)
      '개발서적/Effective Java' 카테고리의 다른 글
      • [Effective Java] 옵셔널 반환은 신중히 하라
      • [Effective Java] null이 아닌, 빈 컬렉션이나 배열을 반환하라
      • [Effective Java] 다중정의는 신중히 사용하라
      • [Effective Java] 메서드 시그니처를 신중히 설계하라
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바