Hayden's Archive

[자바/Java] 메소드 오버로딩, 생성자 오버로딩 본문

Study/Java & Kotlin

[자바/Java] 메소드 오버로딩, 생성자 오버로딩

_hayden 2020. 4. 16. 14:58

출처 : https://en.dict.naver.com/#/entry/enko/ac1a7f3925314a7d93f8edcf598c1b43
출처 : https://ko.dict.naver.com/#/entry/koko/0aa4475858da4a0ebdb3f7f1854187e8

 

오버로딩 = 중복선언. 똑같은데 똑같지 않게 하는 방법.

(오버로딩과 오버라이딩은 전혀 관련이 없다)


 메소드 오버로딩(Method Overloading) 기법 

< 메소드 오버로드의 룰 > - Convention이 아닌 Rule! 안 지키면 에러가 뜸! 
1. 메소드 이름은 같아야 한다. 
2. 메소드 인자값은 달라야 한다.( 순서 / 개수 / 타입 중 반드시 하나라도 달라야 함) 
3. 리턴 타입은 상관 없음. 

 

- 하는 일은 똑같은데 처리하는 데이터를 달리할 때 쓰는 기법

- 메소드의 통일감을 강조하면서도 서로 다른 데이터를 처리할 수 있게끔 해준다. 

- 오버로딩을 세련되게 잘 쓰면 코드의 가독성이 높아지고 일관된 기능을 작성할 수 있음.

 

예시)
public Manager findManager(String name)
public Manager[ ] findManager(int deptno) 

- 둘 다 메소드 이름은 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 하나만 받았을 때 다르게 출력되는 것을 알 수 있다. 

이게 바로 생성자 오버로딩의 효과!