Chillax in dev

[Java] 오버로딩? 오버라이딩? 본문

Java 공부/Java_Basic_Note

[Java] 오버로딩? 오버라이딩?

Seong Story 2020. 12. 27. 12:45
728x90

[java] 오버 로딩? 오버 라이딩?  확실히 알고 가자

- 오버 로딩과 오버 라이딩을 자바를 처음 공부할 때 암기과목처럼 공부했더니 용어가 헷갈린다.

그래서 이 기회에 이 둘을 정리하고자 한다. 


오버 로딩(overloading)

- 대부분 의 자바 서적에선 먼저 오버 로딩을 배운다. 

자바의 클래스를 배우고 나면 메서드를 배우게 된다.

메서드는 어떤 클래스의 기능을 정의하는 함수라고 보면 된다.

이때 하나의 클래스에  메서드 이름이 같은 여러 개의 매서드가 있더라도 매개변수의 개수, 타입이 다르면 같은 이름을 사용해서 다른 매서드를 정의하여 사용할 수 있다.

 

- 매우 편리한 기능이다. 매서드의 이름은 그대로이고 매개변수와 타입을 바꾸어 상황에 맞게 입맛대로 알아서 원하는 매서드를 호출하는 기능이다!

 

- 정리하면 한 클래스 내에서  같은 이름의 메서드를 여러 개 정의하는 것을 매서드 오버 로딩 줄여서 그냥 오버 로딩이라고 한다.

 

- 오버 로딩의 사전적 의미도 '과적하다' 즉 많이 싣는 것을 의미한다. 하나의 메서드 이름으로 여러 기능을 구현하기에 붙여진 이름이라 생각된다.

 

- <오버 로딩 조건>

  • 메서드 이름이 같아야 한다.
  • 매개변수의 개수 또는 타입이 달라야 한다.
  • 주의! 오버 로딩된 여러 메서드들은 매개변수에 의해서만 구별되니 return 즉 반환 타입은 아무 영향 안 준다!

이러한 오버 로딩은 위와 같은 특정 조건을 만족해야 한다. 하지만 외울 것도 없다. 생각해보면 이름이 같은 메서드를 선언해놨으니, 이들을 구별해 컴퓨터가 찾아줘야 하기에 차이점이 있어야 한다.

 

- 위의 조건을 만족하지 못하면 메서드 중복으로 컴파일 시에 에러가 발생한다.

 ' ~~ 메서드() is already defined' 메시지가 나타난다.

 

- ex)

누가 면접에서 오버 로딩의 대표적인 예를 묻는다면 println()을 떠올리자 우리는 무심코 

System.out.println("hello world"); 를 사용해왔지만 이 녀석이야 말고 매개변수에 상관없이 출력해주는

오버 라이딩의 대표적인 예시이다!

 

- <오버 로딩 장점>

  • 메서드의 이름을 절약할 수 있다.

- 오버 로딩을 공부하면 가변 인자(varargs)와 생성자(constructor)도 공부하게 되는데 다른 글에서 다루어보고 이번엔 개념만 정리하고 가자

 


오버 라이딩(overriding)

- 오버 로딩과 헷갈리니 사전적 의미부터 살펴보자 오버 라이딩의 사전적 의미는 '~위에 덮어쓰다(overwrite)'이다.

- 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버 라이딩이라 한다.

- 특히 자손 클래스 자신에 맞게 변경해서 사용하는 경우 조상의 메서드를 오버 라이딩한다.

 

-<오버 라이딩 조건>

자손 클래스에서 오버 라이딩하는 메서드는 조상 클래스의 메서드와

  • 이름이 같아야 한다.
  • 매개변수가 같아야 한다.
  • 반환 타입이 같아야 한다.

- 결국 선언부가 조상, 자손 모두 서로 일치해야 한다는 것이다.

- 다만 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다.

 

- 1. 접근 제어자는 조상 클래스의 메서드 보다 좁은 범위로 변경할 수 없다.

접근제어자(넓은 범위 > 좁은 범위) : [public > protected > (default) > private]

즉 조상 클래스가 protected로 선언돼 있고 이를 오버 라이딩하는 자손 클래스의 접근제어자가 public , protected 이어야 한다는 것이다.

 

- 2. 조상 클래스의 메서드 보다 많은 수의 예외를 선언할 수 없다.

- 3. 인스턴스 메서드를 static 메서드 또는 그 반대로 변경할 수 없다.

- 대표적인 예시는 toString이다.

- 아래 주석을 참고하면 이해가 용이하다.

package days12;

//toString 메소드의 사용
//toString 메소드는 클래스의 객체 정보를 문자열로 반환 : 객체의 클래스명 + '@' + 해시코드값(16진수)
//사용자 정의 클래스(직접 개발한 클래스)에 toString 메소드를 오버라이딩하여
//클래스의 정보를 문자열로 제공하도록 변형할 수 있습니다
class UserClass_B {
}

class Point {
	private int x;
	private int y;

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public String toString() {
		String strInfo = "x = " + this.x + ",  y = " + this.y;
		return strInfo; // "x = 값, y = 값" 리턴
	}
}

public class Object_02 {
	public static void main(String[] args) {
		UserClass_B obj = new UserClass_B();
		System.out.println("오버라이딩 되지 않은 toString()=>" + obj.toString());
		Point p = new Point(30, 20);
		System.out.println("오버라이딩 된 toString()=>" + p.toString());
		String msg = "Point =>" + p;
		System.out.println(msg);
		// .toString() 은 print 에서 사용되거나 다른 문자열과 '+' 연산될때 생략 가능합니다.

	}

}

실행 결과


<정리>

오버 로딩 vs 오버 라이딩

이들은 혼동하기 쉽지만 완전 다른 개념이다.

오버 로딩은 기존에 없는 새로운 메서드를 이름이 같되 내부가 다르게 새로 정의하는 것

오버 라이딩은 상속받은 메서드의 내용을 변경하여 자손이 쓰는 것

728x90
LIST

'Java 공부 > Java_Basic_Note' 카테고리의 다른 글

[Java] Scanner 클래스 사용하기  (0) 2020.12.22
Comments