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);
}
}
위 소스의 결과는 아래와 같다.
왜 이렇게 나오지?
그 이유는 오버로딩을 사용하려는 메소드는 컴파일 시점에 결정하기 때문이다.
컴파일 시 overloading
이라는 메소드와 파라미터를 결정짓는데, list
에 들어있는 Book과 Book2
는 아직 생성시점이 아니기 때문에 모두 Object
파라미터를 가지고 있는 메소드를 선택하는 것이다.
그렇다면 각 클래스를 출력시킨 것은 정상인것이냐?
해당 클래스의 이름을 출력시키는 것은 런타임 후 실행되는 것이므로 정상적인 클래스 이름을 찍을 수 있는 것이다.
반응형