[Java] 메소드 오버로딩

정보구니·2021년 12월 28일
0

Java

목록 보기
28/39
post-thumbnail

메소드 오버로딩


한 클래스 내에 동일한 이름의 메소드를 둘 이상 정의하는 것은 불가능하다.

그러나 매개변수의 선언이 다르면 메소드의 이름이 같더라도 정의가 가능하며, 이것을 메소드 오버로딩이라고 한다.


🔎 호출된 메소드를 찾을 때 참조하는 두가지 정보

  • 메소드의 이름
  • 메소드의 매개변수 정보

따라서 이름이 같고 매개변수 선언이 다른 메소드를 정의하는 것이 가능하다.

// 메소드 오버로딩 예1 (매개변수의 수가 다른 경우)
void sampleMethod(int n) {...}
void sampleMethod(int n1, int n2) {...}


// 메소드 오버로딩 예2 (매개변수의 형이 다른 경우)
void sampleMethod(int n) {...}
void sampleMethod(double d) {...}


// 메소드 오버로딩 조건x
int sampleMethod() {...}
double sampleMethod() {...}

🔎 메소드 오버로딩의 주의할 점

  • 전달인자의 자료형과 매개변수의 자료형이 다를 경우 자동 형변환 규칙을 통해 가장 가까운 위치에 놓여있는 자료형으로 형 변환이 이뤄진다.
  • 오버로딩 된 메소드를 호출할 때는 전달인자의 자료형과 매개변수의 자료형을 일치시키는 것이 좋다.











생성자의 오버로딩


생성자도 매개변수의 선언이 다르면 둘 이상 정의가 가능하다.

class Main {
	public static void main(String[] args) {
		// 여권번호가 있는 사람의 정보를 담은 인스턴스 생성
		Person lim = new Person(990522, 112233);

		// 여권번호가 없는 사람의 정보를 담은 인스턴스 생성
		Person kim = new Person(201228);

		System.out.println("lim의 정보");
		lim.showPersonInfo();
		System.out.println("kim의 정보");
		kim.showPersonInfo();
	}
}


class Person {
	private int regiNum; // 주민등록 번호
	private int passNum; // 여권 번호

	/* 생성자1 */
	Person(int rnum, int pnum) {
		regiNum = rnum;
		passNum = pnum;
	}

	/* 생성자2 */
	Person(int rnum) {
		regiNum = rnum;
		passNum = 0;
	}

	void showPersonInfo() {
		System.out.println("주민등록 번호: " + regiNum);
		System.out.println("여권 번호: " + passNum);
	}
}


// 출력 결과
lim의 정보
주민등록 번호: 990522
여권 번호: 112233
kim의 정보
주민등록 번호: 201228
여권 번호: 0




🔎 키워드 this를 이용한 다른 생성자의 호출

  • 생성자 안에서의 this(..) : 오버로딩 된 다른 생성자를 의미

this를 이용해 정의된 생성자는 초기화 할 값을 전달받는 역할만 하고, 실제 초기화는 호출한 다른 생성자를 통해 진행된다.
이는 중복된 코드를 줄이는 효과를 가진다.




🔎 키워드 this를 이용한 인스턴스 변수의 접근

  • 생성자 안에서의 this. : 인스턴스 변수를 의미

인스턴스 변수와 생성자의 매개변수의 이름이 동일하게 선언된 경우, 선언된 지역 내에서의 해당 이름은 매개변수를 우선적으로 의미한다.
이때 키워드 this를 이용하면 해당 영역 안에서도 매개변수가 아닌 인스턴스 변수에 접근할 수 있다.


class ThisInstExam {
	public static void main(String[] args) {
		SampleBox box = new SampleBox(99);
		System.out.println(box.getData());

		box.setData(77);
		System.out.println(box.getData());
	}
}


class SampleBox {
	private int data;

	/* 생성자 */
	SampleBox(int data) {
		// 인스턴스변수와 매개변수의 이름이 동일할 경우 매개변수가 우선
		// 따라서 매개변수가 아닌 인스턴스 변수 this에 접근하기 위해서 this 키워드를 사용
		this.data = data;
	}

	void setData(int data) {
		this.data = data;
	}

	int getData() {
		return this.data;
	}	
}


// 출력 결과
99
77











참고
열혈 자바 ch11-1 (메소드 오버로딩)

0개의 댓글