일단 해보자고~

자바 :: Overloading / Overriding의 사용법과 차이 본문

Programming Language/Java

자바 :: Overloading / Overriding의 사용법과 차이

InWooK 2022. 9. 6. 15:22

1. Overloading(오버로딩)

- 의미 : 사전적인 의미로 '과적하다'라는 뜻인데 의미와 비슷하게 메서드의 이름은 같으면서 매개변수의 개수가 다르거나, 타입이 다른 경우를 의미함.

 

- 조건 : 메서드의 이름이 같고, 매개변수의 개수나 타입이 달라야 함.

( * return 값만 다른 것은 오버로딩 불가)

 

- 예시

class OverTest{
	// 반환형이 void이고 이름이 cat인 메서드
	void cat() {
		System.out.println("매개변수 없음");
	}
	// 반환형이 void이고 이름이 cat인 메서드이면서 매개변수를 정수형으로 1개 갖음.
	void cat(int a) {
		System.out.println("매개변수 : " + a);
	}
	// 반환형이 void이고 이름이 cat인 메서드이면서 매개변수를 정수형으로 2개 갖음.
	void cat(int a, int b) {
		System.out.println("매개변수 : " + a + ", " + b);
	}
	// 반환형이 void이고 이름이 cat인 메서드이면서 매개변수를 String으로 1개 갖음.
	String cat(String str) {
		System.out.println("매개변수 : " + str);
		return str;
	}
}

public class OverloadingTest {

	public static void main(String[] args) {
		
		OverTest ot = new OverTest();
		
		ot.cat();
		ot.cat(0);
		ot.cat(1, 2);
		ot.cat("Overloading");
	}
}

 

출력 : 

 

 

 

2. Overriding(오버라이딩)

- 의미 : 부모&상위 클래스에서 상속받은 것을 자식&하위 클래스에서 재정의 하는 것. 상속받은 메서드를 그대로 사용할 수도 있지만, 자식&하위 클래스에서 상황에 맞게 변경해야 하는 경우 오버라이딩할 필요가 생김.

 

- 조건 : 오버라이딩은 부모&상위 클래스의 메서드를 재정의 하는 것이므로, 자식&하위 클래스에서는 오버라이딩하고자하는 메서드의 이름, 매개변수의 타입, return값이 모두 같아야 함.

 

- 예시

public class OverridingTest {

	public static void main(String[] args) {
		Parent parent = new Parent();
		Child child = new Child();
		ChildChild cchild = new ChildChild();
		
		parent.name();
		child.name();
		cchild.name();
	}
}

class Parent{
	void name() {
		System.out.println("부모");
	}
}
class Child extends Parent{
	@Override
	public void name() {
		System.out.println("자식");
	}
}
class ChildChild extends Parent{
	@Override
	protected void name() {
		System.out.println("자식+자식");
	}
}

 

출력 : 

 

* Overriding 할 때의 알아 두어야 할 것.

1. 자식&하위 클래스에서 오버라이딩하는 메서드의 접근제어자는 부모 클래스보다 더 좁게 설정할 수 없음.

- 위 예제에서 부모&상위 클래스의 접근제어자는 default로 설정되어 있다. 여기서 자식&하위 클래스들은 default보다 같거나 더 넓은 범위의 접근제어자만 설정할 수 있으므로 private을 제외한 default, protected, public만 사용 가능함.

2. 예외(Exception)는 부모&상위 클래스의 메서드 보다 많이 선언할 수 없다.

- 부모&상위 클래스에서 어떤 예외를 throws 한다고 하면, 자식&하위 클래스에서는 그 예외보다 더 큰 범위의 예외를 throws 할 수 없다.

3. static 메서드를 인스턴스의 메서드로 또는 그 반대로 바꿀 수 없다.

- 부모&상위 클래스의 static메서드를 자식&하위 클래스에서 같은 이름으로 정의할 수 있지만 이것은 다시 정의하는 것이 아니라 같은 이름의 static메서드를 새로 정의하는 것.

4. 오버라이딩 할 때 개발자의 실수를 방지하기 위해 메서드 위에 @Override를 관례적으로 적음.

 


Overloading VS Overriding

 

이름만 비슷할 뿐 명백히 다른 것이다.

 

오버로딩 : 메서드의 이름은 같으면서, 매개변수의 타입이 다르거나 타입이 다른 경우

오버라이딩 : 부모&상위 클래스의 메서드를 자식&하위 클래스에서 재정의 하여 사용.

 

Comments