Hayden's Archive
[자바/Java] 메소드 오버로딩, 생성자 오버로딩 본문
오버로딩 = 중복선언. 똑같은데 똑같지 않게 하는 방법.
(오버로딩과 오버라이딩은 전혀 관련이 없다)
메소드 오버로딩(Method Overloading) 기법
< 메소드 오버로드의 룰 > - Convention이 아닌 Rule! 안 지키면 에러가 뜸!
1. 메소드 이름은 같아야 한다.
2. 메소드 인자값은 달라야 한다.( 순서 / 개수 / 타입 중 반드시 하나라도 달라야 함)
3. 리턴 타입은 상관 없음.
- 하는 일은 똑같은데 처리하는 데이터를 달리할 때 쓰는 기법
- 메소드의 통일감을 강조하면서도 서로 다른 데이터를 처리할 수 있게끔 해준다.
- 오버로딩을 세련되게 잘 쓰면 코드의 가독성이 높아지고 일관된 기능을 작성할 수 있음.
예시) - 둘 다 메소드 이름은 findManager - Argument List는 다름. String과 int로 달리함. - 메소드 이름을 findManagerByName이라고도 할 수 있지만 인자값(String name)만으로도 유추할 수 있음. 그게 더 간결. |
- 오버로드는 상속과 상관 없음. 하나의 클래스에서만 적용된다.
생성자 오버로딩(Function Overloading) 기법 - 정말 중요함!
- 어떤 값은 있고 나머지 값이 없을 때 생성자 오버로딩을 함.
- 없는 값은 기본값으로 채워넣고 나중에 채워놓으면 됨.
public class MyDate {
private int year;
private int month;
private int day;
public MyDate(int year, int month, int day) {
super();
this.year = year;
this.month = month;
this.day = day;
}
public String toString() {
return year+"-"+month+"-"+day;
}
}
public class Employee {
private String name;
private int salary;
private MyDate birthDate;
public Employee() {} // 기본 생성자
// 인자값을 받지 않음.
public Employee(String name, int salary, MyDate birthDate) { // 명시적 생성자1
super();
this.name = name; // 변수명 앞에 붙이는 this
this.salary = salary;
this.birthDate = birthDate;
}
// 이름, 월급, 생년월일을 인자값으로 받음.
public Employee(String name) { // 명시적 생성자2
this(name, 100, new MyDate(1980,1,1); // 생성자 앞에 붙이는 this
}
// 이름만 인자값으로 받을 경우 월급, 생년월일은 기본값 100, 1980-1-1로 지정함.
public String getDetails() {// 여기서 getDetails 말고 toString() 만들어도 됨.
return name+","+salary+","+birthDate;
}
}
- 위 코드에서는 인자값의 유무, 인자값의 개수에 따라서 생성자 오버로딩 기법을 사용했다.
- 참고로 위 코드에서 변수명 앞에 붙이는 this와 생성자 앞에 붙이는 this는 다음과 같은 차이점이 있다. ( 변수명 앞에 붙이는 this 관련 포스팅 : https://hayden-archive.tistory.com/61 )
변수명 앞에 붙이는 this | 생성자 앞에 붙이는 this |
필드와 로컬변수의 이름이 같을 때 둘을 구분하기 위해서 필드 앞에 붙임 |
하나의 클래스에서 서로 다른 생성자를 호출할 때 사용됨 |
- 따라서 위 코드의 명시적 생성자2 앞에 붙이는 this는 명시적 생성자 1을 호출하여 인자값 (name, 100, new MyDate(1980,1,1)을 주입하기 위해 사용되었다.
위 코드를 Test 클래스에서 실행시켜보면
public class EmployeeTest {
public static void main(String[] args) {
Employee e1 = new Employee();
Employee e2 = new Employee("이영자", 11000, new MyDate(1976,2,11));
Employee e3 = new Employee("박나래");
System.out.println(e1.getDetails());
System.out.println(e2.getDetails());
System.out.println(e3.getDetails());
}
}
생성자 오버로딩을 통해 각각 인자값이 없을 때 / 인자값을 name, salary, birthDate 세 개 모두 받았을 때 / 인자값을 name 하나만 받았을 때 다르게 출력되는 것을 알 수 있다.
이게 바로 생성자 오버로딩의 효과!