티스토리 뷰

Java/Java 기초

[Java 기초] 오버로딩

메성 2020. 1. 3. 21:17
반응형

오버로딩

왜 오버로딩을 사용하는가?

  • 객체가 커지면 커질수록 메소드의 개수는 많아진다. 이 때, 근본적으로는 같은 기능을 하지만 이름 짓기가 애매하고 사용하는 쪽도 메소드만 보고 확실한 개념을 잡기에 어려워 오버로딩을 사용한다.
  • 객체적으로 접근해봤을 때는, 사용하려는 객체의 메소드만 알고 있으면 해당 메소드(오버로딩 메소드)는 여러 파라미터를 가지고 있어 객체간의 메시지 전송이 원활하다.

흔히 알고 있는 오버로딩

  • 오버로딩 조건
    • 메소드 이름은 같아야 한다.
    • 파라미터 개수나 타입이 달라야 한다.
    • return 타입은 상관이 없다.
//생성자 오버로딩
public class BasicOverLoading {
    String brandName;
    int since;

    public BasicOverLoading(int since) {
        this.since = since;
    }

    public BasicOverLoading(String brandName) {
        this.brandName = brandName;
    }

    public BasicOverLoading(String brandName, int since) {
        this.brandName = brandName;
        this.since = since;
    }
}

//this를 활용한 생성자
public BasicOverLoading(int since) {
    this(since, "기아");    //파라미터 두개 받은 메소드로 생성이 된다.
}

//메소드 오버로딩
public class BasicOverLoading {
    int wheelPrice;
    int sheetPrice;
    int enginePrice;

    public int bodySizeSum(int wheelPrice, int sheetPrice) {
        return wheelPrice + sheetPrice;
    }

    public int bodySizeSum(int wheelPrice, int sheetPrice, int enginePrice) {
        return wheelPrice + sheetPrice + enginePrice;
    }
}

오버로딩의 시점

오버로딩된 메소드는 컴파일 시점에 선택된다.

  • 오버로딩한 메소드는 컴파일 시점에 각각의 다른 이름으로 rename된다.
  • 즉, 오버로딩 메소드는 컴파일 시점에 어떤 메소드를 선택할지가 결정되는 것이다.
public static void overloading(Object obj) {
    System.out.println("obj");
}

public static void overloading(Book book) {
    System.out.println("book");
}

public static void overloading(Book2 book2) {
    System.out.println("book2");
}

public static void main(String[] args) {
    List<Object> list = Arrays.asList(new Object(), new Book(), new Book2());

    for(Object obj : list) {
        System.out.println(obj.getClass());
        overloading(obj);
    }
}

위 소스의 결과는 아래와 같다.

1578052980710

왜 이렇게 나오지?

그 이유는 오버로딩을 사용하려는 메소드는 컴파일 시점에 결정하기 때문이다.

컴파일 시 overloading이라는 메소드와 파라미터를 결정짓는데, list에 들어있는 Book과 Book2는 아직 생성시점이 아니기 때문에 모두 Object 파라미터를 가지고 있는 메소드를 선택하는 것이다.

그렇다면 각 클래스를 출력시킨 것은 정상인것이냐?

해당 클래스의 이름을 출력시키는 것은 런타임 후 실행되는 것이므로 정상적인 클래스 이름을 찍을 수 있는 것이다.

반응형

'Java > Java 기초' 카테고리의 다른 글

[Java 기초] 접근제한자  (0) 2020.01.04
[Java 기초] 상속과 구성  (2) 2020.01.04
[Java 기초] enum  (0) 2020.01.01
[Java 기초] 변수의 Scope와 static  (0) 2019.12.31
[Java 기초] 제네릭  (0) 2019.12.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함