반응형

오버라이딩  (overrriding)

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

 

오버라이딩은 정확히는 메서드 오버라이딩 이다. (override의 뜻은 동사로 '덮어쓰다') 라는 뜻이다.
오버라이딩은 상속받은 조상의 메서드를 자신에 맞게 변경하는 것이다. 

Point클래스, 2차원 상의 좌표를 나타내는데,  
x, y값을 getLocation() 메서드가 문자열로 반환한다. (위치를 반환)

이러한 getLocation()이라는 값이 있을 때, 
이것을 상속 받아서 Point3D라는 클래스를 만들었다.
이것은 3차원 좌표상의 한 점을 의미한다. 
그래서 int z; 가 추가되었다.

근데, 상속받은 Point클래스의 getLocation() {} 을 그냥 사용하기에는 Point3D클래스는 3차원의 점이기 떄문에 맞지 않는다.

그래서 "오버라이딩" 해서 getLocation() {}  의 내용을 z를 포함시키도록 수정했다.

오버라이딩은 선언부는 변경하지 못하고, 구현부만 변경가능 하다. 즉, 내용{}만 변경 가능하다.

물론, 오버라이딩 말고, getLocation3D() {} 라는 새로운것을 만들 수 있지만, 그것보다는,
Point를 사용하던 사람들은, getLocation() 호출하면 좌표를 문자로 얻을 수 있었으니까,
Point3D도 getLocation을 호출하면, 위치를 문자로 얻을것이라고 생각 할 것이다. 
그래서 의미상 같은 일을 해야하기 때문에 오버라이딩이 더 적절하다. 

상속받은 조상의 메서드를 자신에게 맞게 변경하는 것을 오버라이딩 이라고 한다.

 


 

오버라이딩의 조건

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

선언부 부분이 조상과 자손이 일치해야 한다.
선언부 (반환타입, 메서드이름, 매개변수목록) 이 일치해야한다.

 

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

접근제어자는 public, protected, default, private 4가지가 있다.
오버라이딩의 조건중 하나는, 이 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다는 것이다.

 

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

무슨 이야기냐면,
이것들을 예외 선언이라고 부르는데, 

Parent클래스의 메서드에서 예외 갯수가 2개이고,
Child 클래스에의 메서드는 예외가 1개다.

조상이 2갠데, 자손이 더 많으면 안된다. 이 예시처럼 처럼 같거나 적어야 한다.

 

이 세가지 조건을 외워야 한다.

예외에 대한 것은 예외단원에서 공부를 하면 이해가 될 것이다. 우선은 외우자.

 


 

오버로딩 vs오버라이딩

 

오버로딩과 오버라이딩은 이름만 비슷하지 둘이 전혀 관계가 없다.

그런데도, 오버로딩과 오버라이딩의 차이가 뭐냐 라는 질문이 많이 나오곤 한다.
근본적으로 이 둘은 서로 관계가 없다.
그래도 비교해서 알아보자.

오버로딩은 기존에 없는 새로운 메서드를 정의하는 것이다. 단, 이름이 같게 정의하는 것이다.
오버로딩은 상속과 관계가 없다.

오버라이딩은 상속받은 메서드의 내용을 변경하는 것이다.(change, modify)
오버라이딩도 사실 새로운 메서드를 만드는 것은 맞지만, 상속받은 메서드의 내용을 변경하는 것을 오버라이딩 이라고 한다.

 

왼쪽 코드를 보면,
Parent클래스와 Parnet클래스의 자손 Child클래스가 있다.
이 두 클래스가 부모자식 관계에 있는데, 이럴 때 어떤게 오버로딩이고 어떤게 오버라이딩인지 생각해보자.

1번은 조상의 메서드를 자손에서 변경한 것이므로 오버라이딩이다.

2번은 이름이 같은 메서드를 매개변수만 다르게 해서 정의한 것이므로 오버로딩이다. 

3번은 메서드를 새로 정의한 것이다.

4번은 childMethod의 매개변수만 달리해서 변경한 것이므로 ​오버로딩이다.

5번은 중복정의에러이다. 

 

 

반응형

'JAVA' 카테고리의 다른 글

패키지, 클래스 패스  (0) 2022.03.31
참조변수 super, 생성자 super()  (0) 2022.03.31
단일 상속, Object 클래스  (0) 2022.03.30
클래스 간의 관계, 상속과 포함  (0) 2022.03.30
상속  (0) 2022.03.30