[CS] 자바의 정석 독서 #7 - 메서드 오버로딩

2025. 10. 1. 18:54·언어공부/Java | Kotlin

 

Spawn more Overloads!

 

과제가 몇 개 밀리기도하고 백준하다가 책을 안 읽기도해서 거의 일주일동안 자바의 정석을 안 읽었다.

주말은 알바랑 과제까지 겹치면 책 읽기는커녕 시험공부도 못할 지경이니.. 알바를 그만둬야지 암튼 읽기시작


오버로딩

같은 이름의 메서드라도 전해주는 매개변수가 다르면 선언할 수 있다. 이렇게 동일이름의 메서드를 여럿 생성하는 것을 오버로딩이라고 한다. 오버로딩에는 메서드 이름이 같고, 매개변수는 달라야한다. (개수던 타입이던..) 나머지는 상관없음

 

public void println(int x) {
        if (getClass() == PrintStream.class) {
            writeln(String.valueOf(x));
        } else {
            synchronized (this) {
                print(x);
                newLine();
            }
        }
    }
    
public void println(String x) {
        if (getClass() == PrintStream.class) {
            writeln(String.valueOf(x));
        } else {
            synchronized (this) {
                print(x);
                newLine();
            }
        }
    }

대표적인 오버로딩의 예시인 println

 

오버로딩에도 조건이 있는데,

반환형은 오버로딩에 영향을 끼치지 않으며, 오직 메서드명, 인자의 수 및 타입만 영향을 끼친다. 매개변수명이 다르더라도 같은 타입의 매개변수를 같은 개수만큼 전해주었다면 에러. 다만 int-long과 long-int로 매개변수를 전해주는 등 매개변수를 전해주는 순서가 다르면 오버로딩으로 간주된다.

 

왜 쓰는가?

우선 코드가 간결하다. 오버로딩이 안된다면 가능한 모든 매개변수마다 다른 메서드명을 가져야할 것이다. 그럼 println이 아니라 System.out.printlnString, System.out.printlnInteger 같이 명령어를 썼어야했을 것이다. 메서드 이름도 절약할 수 있고

 

추가로

public static void main (String[] args) {
        System.out.println("main 실행!");
        System.out.println("int a + int b is " + add(3,3));
        System.out.println("main 끝!");
    }

    public static int add(int a, int b){
        System.out.println("add 실행!");
        return a+b;
    }

이 코드를 실행하면

이렇게 뜬다.

main이 실행되고, println 안에 있는 add가 먼저 호출되고, println이 호출되고 main이 끝나는 형식으로 진행된다. 출력보다는 출력문에 있는 메서드를 먼저 호출한다. 당연한 소리인가


가변인자

JDK5부터는 매개변수를 가변인자를 통해 개수를 미리 지정하지 않고도 동적으로 지정할 수 있다.

public PrintStream printf(String format, Object ... args) {
        return format(format, args);
    }

printf에 들어있는 가변인자

가변인자와 가변인자가 아닌 매개변수를 메서드에 넘겨주어야한다면 가변인자를 무조건 마지막으로 써야한다.

 

타입명... 변수명으로 선언하면 된다. 저기서는 가변적으로 전해줄 변수의 타입의 Object, 변수명이 args인거고, main 메서드처럼 변수의 타입이 String 배열에 변수명이 args일 수도 있다.

 

가변인자는 값을 한 개, 여러 개, 값을 주지 않거나 배열을 사용할수도 있다.

 

    public static int[] concat(int... args){
        return args;
    }

가변인자는 내부적으로 배열을 사용하기 때문에 이것이 가능하다. 메서드가 호출되면 배열이 생성되고 하는 식으로.. 따라서 약간 비효율적이기 때문에 무지성사용은 지양해야한다.

 

이런식으로..

 

public static void main (String[] args) {
        System.out.println(concat("윤마치", "윤만치", "상수", "합정", "대흥"));
        System.out.println(concat2(new String[] {"윤마치", "윤만치", "상수", "합정", "대흥"}));
    }

    public static String concat(String... args){
        return Arrays.toString(args);
    }

    public static String concat2(String[] args){
        return Arrays.toString(args);
    }
}

따라서 이렇게 가변인자가 아니라 배열을 직접 만들어서 넘겨주어도 딱히 큰 차이가 없다.

 

다만 매개변수를 배열로한다면 값을 아예 넘겨주지 않는 것은 불가능하고 길이가 0인 배열을 선언 후 넘겨주어야한다.

 

가변인자 오버로딩

되는경우와 안되는 경우를 구분하자.

 

가변인자를 받는 메서드를 오버로딩할 경우 어느 메서드를 선택할지 몰라서 에러가 생긴다. 이 경우를 주의해야한다. 가능하면 가변인자를 사용한 메서드는 오버로딩하지 말아야한다.

 

너무 끊어서 올리는 거 아닌가 싶긴한데 앞으로는 이렇게 주제를 나눠서 올리는게 나중에 읽기 더 좋을 것 같다.

지금 예전에 쓴 CS글을 읽으려니 찾는게 너무 어려워서..

'언어공부 > Java | Kotlin' 카테고리의 다른 글

[CS] 자바의 정석 독서 #9 - 상속  (0) 2025.10.02
[CS] 자바의 정석 독서 #8 - 생성자와 초기화  (0) 2025.10.01
[CS] 자바의 정석 독서 #6 - 클래스와 메서드  (0) 2025.09.24
[CS] 자바의 정석 독서 #6 - 객체지향 프로그래밍, OOP란 무엇인가?  (0) 2025.09.24
[CS] 자바의 정석 독서 #5 - 연산자  (0) 2025.09.22
'언어공부/Java | Kotlin' 카테고리의 다른 글
  • [CS] 자바의 정석 독서 #9 - 상속
  • [CS] 자바의 정석 독서 #8 - 생성자와 초기화
  • [CS] 자바의 정석 독서 #6 - 클래스와 메서드
  • [CS] 자바의 정석 독서 #6 - 객체지향 프로그래밍, OOP란 무엇인가?
Radiata
Radiata
개발을 합니다.
  • Radiata
    DDD
    Radiata
  • 전체
    오늘
    어제
    • 분류 전체보기 (211)
      • 신년사 (3)
        • 2025년 (2)
        • 2026년 (1)
      • CS (59)
        • JVM (12)
        • 백엔드 (20)
        • 언어구현 (1)
        • 객체지향 (1)
        • 논리회로 (5)
        • 컴퓨터구조 (9)
        • 데이터베이스 (1)
        • 컴퓨터 네트워크 (10)
      • 언어공부 (64)
        • Java | Kotlin (48)
        • JavaScript | TypeScript (9)
        • C | C++ (6)
      • 개인 프로젝트 (11)
        • [2025] Happy2SendingMails (3)
        • [2026] 골든리포트! (8)
        • [2026] 순수자바로 개발하기 (0)
        • 기타 이것저것 (0)
      • 팀 프로젝트 (29)
        • [2025][GDG]홍대 맛집 아카이빙 프로젝트 (29)
      • 알고리즘 (13)
        • 백준풀이기록 (11)
      • 놀이터 (0)
      • 에러 수정일지 (2)
      • 고찰 (24)
        • CEOS 23기 회고록 (2)
  • 블로그 메뉴

    • CS
    • 언어공부
    • 개인 프로젝트
    • 팀 프로젝트
    • 알고리즘
    • 고찰
    • 신년사
    • 컬러잇 개발블로그
  • 링크

    • 컬러잇 개발블로그
  • 공지사항

  • 인기 글

  • 태그

    144
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Radiata
[CS] 자바의 정석 독서 #7 - 메서드 오버로딩
상단으로

티스토리툴바