티스토리 뷰
반응형
오버로딩
왜 오버로딩을 사용하는가?
- 객체가 커지면 커질수록 메소드의 개수는 많아진다. 이 때, 근본적으로는 같은 기능을 하지만 이름 짓기가 애매하고 사용하는 쪽도 메소드만 보고 확실한 개념을 잡기에 어려워 오버로딩을 사용한다.
- 객체적으로 접근해봤을 때는, 사용하려는 객체의 메소드만 알고 있으면 해당 메소드(오버로딩 메소드)는 여러 파라미터를 가지고 있어 객체간의 메시지 전송이 원활하다.
흔히 알고 있는 오버로딩
- 오버로딩 조건
- 메소드 이름은 같아야 한다.
- 파라미터 개수나 타입이 달라야 한다.
- 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
파라미터를 가지고 있는 메소드를 선택하는 것이다.
그렇다면 각 클래스를 출력시킨 것은 정상인것이냐?
해당 클래스의 이름을 출력시키는 것은 런타임 후 실행되는 것이므로 정상적인 클래스 이름을 찍을 수 있는 것이다.
반응형
'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
링크
TAG
- junit
- 정적팩터리메서드
- 이펙티브자바
- 이펙티브 자바
- 복사 팩토리
- try with resources
- try catch finally
- effectivejava
- ifPresent
- jdk버전
- java
- @Lazy
- 자바8
- 김영한
- flatMap
- mustache
- 스프링부트
- 연관관계
- 점층적 생성 패턴
- java8
- 생성자
- JPA
- 인프런
- springboot
- Effective Java
- 빌더 패턴
- 빈 순환 참조
- 팩토리 메소드 패턴
- package-private
- Spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
글 보관함