S E P H ' S

[Java] 9. Overloading & Overriding 본문

Programing & Coding/JAVA

[Java] 9. Overloading & Overriding

yoseph0310 2022. 1. 18. 14:44

오버로딩(Overloading)

자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있습니다.

 

오버로딩(Overloading)이라는 뜻은 사전적으로 '과적하다' 라는 뜻입니다. 자바에서 하나의 메소드 이름으로 여러 기능을 구현할 수 있기 때문에 '과적하다'라는 뜻의 이름을 붙여준 것으로 보입니다.

 

오버로딩의 조건

메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 합니다. 주의할 점은 리턴 값만 다른 것은 오버로딩을 할 수 없습니다.

위와 같이 print라는 같은 이름을 가진 네 개의 메소드가 매개변수의 개수와 타입을 다르게 지정하여 사용하는 것이 가능하다는 것을 잘 보여주고 있습니다. 또한 접근 제어자도 자유롭게 지정해 줄 수 있습니다. 

 

오버로딩을 사용하는 이유

1. 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.

 

가장 친숙한 println이라는 메소드를 대표적인 예로 들 수 있습니다. println의 인자 값으로 int, double, boolean, String 등 아주 다양한 타입의 매개변수들을 집어넣어도 그 함수들이 어떻게 실행되는지는 모르나 콘솔창에 아주 잘 출력해주는 것을 볼 수 있습니다.

이처럼 '출력하다'라는 기능을 가진 메소드들을 println이라는 하나의 이름으로 정의가 가능한 것입니다.

 

2. 메소드의 이름을 절약할 수 있다.

 

농담을 조금 보태자면 개발을 하다보면 가장 어려운 것이 네이밍일 것입니다. 가독성이 좋고 의미가 뚜렷한 이름을 부여하기 위해 많은 시간을 고민하고는 합니다. println을 예로 들어보자면 printlnInt, printlnBoolean, printlnString 등 물론 의미가 뚜렷하기는 하지만 현재 println이라는 메소드를 편하게 쓰는 입장에서 생각해본다면 너무도 불필요한 네이밍처럼 보이지 않나요? 이처럼 메소드의 네이밍에 고민을 덜어주기도 합니다.

 

 

오버라이딩(Overriding)

 

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

 

오버라이딩의 조건

오버로딩과는 다르게 오버라이딩하고자 하는 메소드의 이름, 매개변수, 리턴 값이 모두 같아야 합니다.

부모 클래스의 메소드를 오버라이딩 하는 것은 내용만 새로 정의하는 것이기 때문에 선언부는 부모의 것과 완벽히 동일해야 하는 것을 볼 수 있습니다. 여기서 Child클래스의 cry()메소드는 접근 제한자를 다르게 한 것을 볼 수 있는데 오버라이딩에서 접근 제어자를 설정하는 규칙이 존재합니다.

 

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

 

위의 코드에서 부모클래스의 접근 제어자는 default로 설정되어 있습니다. 여기서 자식 클래스들은 default보다 같거나 더 넓은 범위의 접근 제어자만 설정할 수 있습니다. 그래서 위와 같은 경우 가능한 접근 제어자는 default, protected, public 이 됩니다.

 

2. 예외(Exception)는 부모 클래스의 메소드 보다 많이 선언할 수 없습니다.

 

세상의 어떤 부모도 자식에게 더 큰 짐을 주고 싶어하지 않는 것이 이치입니다. 예시가 적절한지는 모르겠으나 부모클래스에서 어떤 예외를 throws 한다고 하면, 자식 클래스는 그 예외보다 더 큰 범위의 예외를 throws할 수 없습니다.

 

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

 

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

 

오버로딩 & 오버라이딩

오버로딩과 오버라이딩은 이름만 비슷하고 완전히 다른 것입니다. 아래 표를 끝으로 정리하고 마무리하겠습니다.

오버로딩 - 기존에 없는 새로운 메소드를 추가하는 것

오버라이딩 - 상속받은 메소드를 재정의하는 것

 

구분 Overloading Overriding
접근 제어자 모든 접근 제어자 부모클래스 < 자식클래스
(접근제어자)
리턴형 달라도 됨 동일
메소드명 동일 동일
매개변수 달라야만 함 동일
적용 범위 같은 클래스 내에서 적용 상속관계에서 적용

 

'Programing & Coding > JAVA' 카테고리의 다른 글

[Java] StringBuilder  (0) 2022.12.12
[Java] Arrays.asList()  (0) 2022.11.07
[Java] 8. final keyword  (0) 2022.01.10
[Java] 7. Generic  (0) 2022.01.10
[Java] 6. Annotation  (0) 2022.01.04