본문 바로가기
back-end/JAVA

24) 메서드 오버라이딩(overriding), 오버로딩과 오버라이딩 차이

by 모두의 향연 2021. 6. 3.
728x90
반응형

24) 메서드 오버라이딩(overriding), 오버로딩과 오버라이딩 차이

 

 

1. 정의

[override ⓥ덮어쓰다]

-상속받은 조상의 메서드를 자신에 맞게 변경하는 것

 

 

2. 예제

오버라이딩 예시

Point클래스는 getLocation이라는 메서드가 있습니다.

Point3D는 Point를 상속받았네요.

Point3D는 상속받은 Point클래스에서 getLocation메서드를 오버라이딩 할겁니다.

내용을 살짝 추가해서 만드는 겁니다. 

선언부는 절대 변경 불가이고, 구현부만 변경 가능합니다. 

(선언부와 구현부를 모르시는 분들은 이것부터 보세요)

https://feastforall.tistory.com/20?category=999998 

 

9) 객체지향-메서드의 정의, 메서드의 선언부와 구현부

9) 객체지향-메서드의 정의, 메서드의 선언부와 구현부 9-1) 메서드란? ① 문장들을 묶어놓은 것. 작업 단위로 문장들을 묶어서 이름 붙인 것. 어렵게 생각하지 마시고 이게 전부예요. 위 그림에서

feastforall.tistory.com

 

만약, 메인 메서드에 getLocation()을 호출하면 어떤 게 호출될까요?

자식 메서드의 getLocation()이 호출됩니다.

오버라이딩했다고 해서 조상 메서드의 내용이 바뀌지도 상속이 안 되지도 않습니다.

상속을 받긴 받는데 조상 메서드를 안 쓰고 자손 것이 호출이 되는 겁니다.

 

 

3. 추가 예제

Object클래스를 상속받음

Object클래스의 toString() 메서드를 오버라이딩했습니다.

메서드 앞에 public을 쓴 이유는 toString() 메서드는 원래 public이 붙어있기 때문에 써준 겁니다. (오버라이딩할때 어차피 선언부는 똑같아야 돼서 똑같이 써줍니다[public String toString()])

이제 객체를 생성해보겠습니다.

Object의 메서드 사용

오버라이딩한 메서드를 호출해보겠습니다.

System.out.println("p.x=" + p.x);
System.out.println("p.y=" + p.y);

원래는 x와 y를 호출할 때 이렇게 따로따로 써줬잖아요?

근데 우리는 쉽고 빠르게 호출하기 위해 메서드를 사용합니다,

System.out.println(p.toSting());이렇게요.

하지만 toString은 Object로부터 상속받은 메서드라 생략 가능하다고 했습니다.

(모르신다면 아래 링크에서 확인하세요)

https://feastforall.tistory.com/34?category=999998 

 

23) Object클래스

23) Object클래스 1. 정의 -모든 클래스의 조상 2. 특징 -부모가 없는 클래스는 자동으로 Object클래스를 상속받게 된다. -모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다(toString(), equ

feastforall.tistory.com

그래서 System.out.println(p); 이렇게 간단히 쓰여도 메서드가 호출됩니다.

 

아니면 생성자를 사용해서 코드를 더 간단하게 만들 수도 있습니다.

생성자를 사용하여 간단하게 만든 코드

생성자를 만들고, 메인클래스에서 한 번에 초기화하고 출력하는 것까지 깔끔하게 코드 화했습니다.

 

 

4. 오버라이딩의 조건

-선언부가 조상 클래스의 메서드와 일치해야 한다.

선언부가 같아야한다

선언부는 '반환타입_메서드이름_매개변수목록'로 구성되어 있는데, 이 모두가 같아야 합니다.

 

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

public, protected, default, private를 접근제어라자고 하는데요, 조상클래스의 메서드보다 좁은 범위로 변경 불가능합니다.

 

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

예외는 조상메서드와 같거나 적어야 합니다.

 

 

5. 오버로딩 vs 오버라이딩

사실 이 두 개는 관련이 전혀 없어요. 이름만 비슷하지..

하지만 면접문제에 잘 나오니까 정리해두세요. 많이 헷갈려합니다.

 

오버로딩(overloading): 기존에 없는 새로운 메서드를 정의하는 것(new)

오버라이딩(overriding): 상속받은 메서드의 내용을 변경하는 것(change, modify)

 

오버로딩은 기존에 없는 새로운 메서드를 정의하는 건데요, 이름만 같을 뿐 매개변수의 개수나 타입이 달라야 한다고 이전에 배웠죠? 상속과도 전혀 관계가 없습니다.

https://feastforall.tistory.com/27?category=999998 

 

16)객체지향-오버로딩(overloading)

16) 객체지향-오버로딩(overloading) 16-1) 오버 로딩이란? 한 클래스 안에 같은 이름의 메서드 여러 개를 정의하는 것(메서드:메서드 이름=n:1) overloading:과적하다 대표적인 예로 println을 들 수 있습니

feastforall.tistory.com

오버라이딩은 상속받은 메서드의 내용을 변경하는 건데요, 사실 새로운 메서드를 만드는 것도 맞긴 맞죠.

하지만 상속받은 걸 바꾸는 거니까.. 다릅니다.

 

 

<퀴즈> 오버로딩인지 오버라이딩인지 맞춰보세요.

class Parent{
     void parentMethod() {}
}

class Child extends Parent{
     void parentMethod() {}
     void parentMethod(int i) {}

     void childMethod() {}
     void childMethod(int i) {}
     void childMethod() {}
}

 

①오버라이딩(조상의 메서드를 자손에서 변경한 것)

②오버로딩(같은 클래스에 있는 이름이 같은 메서드를 매개 변수만 다르게 해서 정의한 것)

③그냥 메서드 정의한 것(Child클래스에서 새로운 메서드 정의한 것)

④오버로딩(같은 클래스에 있는 이름이 같은 메서드를 매개변수만 다르게 해서 정의한 것)

⑤중복 정의. 에러(오버로딩도 오버라이딩도 아닌 3번 메서드와 중복 정의한 것. 그래서 에러남)

 

 

 

*유튜브 남궁성 선생님의 `자바의 정석`을 참고하여 만들었습니다*
*자세히 보고 싶은 분들은 유튜브 가서 보시면 됩니다*

728x90
반응형