오버라이딩 편집하기

이동: 둘러보기, 검색

경고: 로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다. 로그인하거나 계정을 생성하면 편집자가 아이디(ID)으로 기록되고, 다른 장점도 있습니다.

편집을 되돌릴 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 저장해주세요.
최신판 당신의 편집
2번째 줄: 2번째 줄:
  
 
== 개요 ==
 
== 개요 ==
[[오버로딩]]과 [[오버라이딩]]은 그 단어의 유사함으로 인해 혼동하기 쉽다. 하지만 그 개념은 확실히 다르며, 표기는 비슷하지만, 전혀 다른 의미이다. [[오버로딩]](overloading)은 새로운 [[메소드]]를 정의하는 것이고, 오버라이딩(overriding)은 상속받은 기존의 [[메소드]]를 재정의하는 것이다.<ref name="오버로딩과 라이딩 차이">[https://gbsb.tistory.com/235 오버로딩과 오버라이딩의 차이]〉, 《오버로딩과 오버라이딩의 차이》, 2018-03-13</ref>
+
[[파일:Overriding.PNG|800|오버로딩과 오버라이딩의 차이|가운데|오버로딩과 오버라이딩의 차이]]<ref name='diff'>오버로딩과 오버라이딩 비교사진〈[https://www.zerocho.com/category/JavaScript/post/59c17a58f40d2800197c65d6]〉, 《blog》 , 2017-04-30</ref>
 +
 
 +
<br>
 +
 
 +
[[오버로딩]]과 [[오버라이딩]]은 그 단어의 유사함으로 인해 혼동하기 쉽다. 하지만 그 개념은 확실히 다르며, 표기는 비슷하지만, 전혀 다른 의미이다. 오버로딩(overloading)은 새로운 메서드를 정의하는 것이고, 오버라이딩(overriding)은 상속받은 기존의 메서드를 재정의하는 것이다.
 +
<ref name="오버로딩과 라이딩 차이">오버로딩과 오버라이딩의 차이〈[https://gbsb.tistory.com/235]〉,  
 +
《오버로딩과 오버라이딩의 차이》, 2018-03-13</ref>
  
 
:{|class=wikitable width=800 style="background-color:#ffffee"
 
:{|class=wikitable width=800 style="background-color:#ffffee"
|+오버로딩과 오버라이딩 비교<ref name='java'>[https://88240.tistory.com/450 Overloading과 Overriding 비교]〉, 《blog》 , 2016-04-30</ref><ref name="오버라이드"></ref>
+
|+오버로딩과 오버라이딩 비교<ref name='java'>오버로딩과 오버라이딩 비교〈[https://88240.tistory.com/450]〉, 《blog》 , 2016-04-30</ref><ref name="오버라이드"></ref>
 
!align=center style="background-color:#ffeecc"| 구분
 
!align=center style="background-color:#ffeecc"| 구분
 
!align=center style="background-color:#ffeecc"| Overloading
 
!align=center style="background-color:#ffeecc"| Overloading
25번째 줄: 31번째 줄:
 
|align=center|모든 접근 제어자를 사용할 수 있다.
 
|align=center|모든 접근 제어자를 사용할 수 있다.
 
|align=center|
 
|align=center|
부모 [[클래스]]의 [[메소드]]의 [[접근 제어자]]보다 더 넓은 범위의 <br> 접근 제어자를
+
부모 클래스의 메소드의 접근 제어자보다 더 넓은 범위의 <br> 접근 제어자를
자식 [[클래스]]의 [[메소드]]에서 설정할 수 있다.
+
자식 클래스의 메소드에서 설정할 수 있다.
 
|-
 
|-
 
|align=center|매개변수, 타입
 
|align=center|매개변수, 타입
 
|align=center|같은 클래스 내에서 적용된다.
 
|align=center|같은 클래스 내에서 적용된다.
|align=center|[[상속]]관계에서 적용된다.
+
|align=center| 상속관계에서 적용된다.
 
|}
 
|}
 +
 +
<br>
  
 
상위 [[클래스]]가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 메소드도 하위 클래스로 상속되어 하위 클래스에서 사용할 수 있다. 하지만, 하위 클래스에서 메소드를 재정의해서 사용할 수 있다.
 
상위 [[클래스]]가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 메소드도 하위 클래스로 상속되어 하위 클래스에서 사용할 수 있다. 하지만, 하위 클래스에서 메소드를 재정의해서 사용할 수 있다.
상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술을 오버라이딩(Overriding) 이라고 한다.<ref name="오버라이딩">[https://hyeonstorage.tistory.com/185 오버라이딩 정의]〉, 《오버라이딩이란》, 2013-12-08</ref>
+
상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술을 오버라이딩(Overriding) 이라고 한다.<ref name="오버라이딩">오버라이딩 정의〈[https://hyeonstorage.tistory.com/185]〉,  
 
+
《오버라이딩이란》, 2013-12-08</ref>
[[파일:오버라이딩.png|250픽셀|섬네일|오른쪽|오버라이딩]]
+
<br>
'''메소드 오버라이딩'''(method overriding)은 [[객체 지향 프로그래밍]]에서 서브 클래스 또는 자식 클래스가 자신의 슈퍼클래스들 또는 부모 클래스들 중 하나에 의해 이미 제공된 [[메소드]]를 특정한 형태로 구현하는 것을 제공하는 언어의 특징이다. 서브클래스에서의 구현은 부모 클래스에서 같은 이름, 같은 파라미터 또는 시그니처 그리고 같은 반환형을 갖는 [[메소드]]를 제공함으로써 슈퍼클래스에서의 구현을 오버라이드한다. 실행되는 메소드의 버전은 이것을 발생시키는데 사용되는 객체에 의해서 결정될 것이다. 만약 부모 클래스의 [[객체]]가 메소드를 발생시키는데 사용된다면 부모 클래스 버전이 실행될 것이지만, 만약 서브클래스의 객체가 [[메소드]]를 발생시키는데 사용된다면 자식 클래스 버전이 실행될 것이다. 몇몇 언어들은 프로그래머가 [[메소드]]를 오버라이딩하는 것을 예방하게할 수 있게 한다.<ref name='위키백과'>[https://ko.wikipedia.org/wiki/%EB%A9%94%EC%86%8C%EB%93%9C_%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9 메소드 오버라이딩]〉, 《위키백과》 , 2018-04-30</ref>
+
<br>
 +
'''메소드 오버라이딩''',(method overriding)은 [[객체 지향 프로그래밍]]에서 서브[[클래스]] 또는 자식 클래스가 자신의 슈퍼클래스들 또는 부모 클래스들 중 하나에 의해 이미 제공된 [[메소드]]를 특정한 형태로 구현하는 것을 제공하는 언어의 특징이다. 서브클래스에서의 구현은 부모 클래스에서 같은 이름, 같은 파라미터 또는 시그니처 그리고 같은 반환형을 갖는 메소드를 제공함으로써 슈퍼클래스에서의 구현을 오버라이드한다. 실행되는 메소드의 버전은 이것을 발생시키는데 사용되는 객체에 의해서 결정될 것이다. 만약 부모 클래스의 객체가 메소드를 발생시키는데 사용된다면 부모 클래스 버전이 실행될 것이지만, 만약 서브클래스의 객체가 메소드를 발생시키는데 사용된다면 자식 클래스 버전이 실행될 것이다. 몇몇 언어들은 프로그래머가 메소드를 오버라이딩하는 것을 예방하게할 수 있게 한다.<ref name='위키백과'>메소드 오버라이딩〈[https://ko.wikipedia.org/wiki/%EB%A9%94%EC%86%8C%EB%93%9C_%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9]〉, 《위키백과》 , 2018-04-30</ref>
  
 
== 특징 ==
 
== 특징 ==
* [[메소드]] 이름이 같아야 한다.
+
* 메소드 이름이 같아야 한다.
* 메소드 리턴형이 같아야 한다.
+
* 리턴형이 같아도 되고 달라도 된다.
* 파라미터 개수, 파라미터의 자료형이 같아야 한다.
+
* 파라미터 개수가 달라야 한다.
* 오버라이드 하고자 하는 메소드가 상위 클래스에 존재해야 한다.<ref name='매거진'>[https://brunch.co.kr/@kimkm4726/2 오버라이딩 특징]〉, 《매거진》 , 2016-04</ref>
+
* 파라미터 개수가 같을 경우, 데이터타입이 달라야 한다.<ref name='매거진'>오버라이딩 특징〈[https://brunch.co.kr/@kimkm4726/2]〉, 《매거진》 , 2016-04</ref>
* 상위 메소드와 동일하거나 내용이 추가되어야 한다.<ref name='특징+'>[https://memoryfilm.tistory.com/16 오버라이딩 특징]〉, 《린월》 , 2014-01-16</ref>
+
* 오버라이드 하고자 하는 메소드가 상위 클래스에 존재해야한다.
 +
* 상위 메소드와 동일하거나 내용이 추가되어야 한다.<ref name='특징+'>오버라이딩 특징〈[https://memoryfilm.tistory.com/16]〉, 《린월》 , 2014-01-16</ref>
  
 
== 필요성 ==
 
== 필요성 ==
부모 클래스로부터 상속받은 [[메소드]]를 자식 클래스에서 재정의하는 것을 오버라이딩이라고 한다. 상속받은 [[메소드]]를 그대로 사용할 수도 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우 오버라이딩할 필요가 생긴다.<br>
+
부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것을 오버라이딩이라고 한다. 상속받은 메소드를 그대로 사용할 수도 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우 오버라이딩할 필요가 생긴다.<br>
오버라이딩을 하지않으면 이름을 다르게 해야하는데 그럼 그 [[메소드]]가 여전히 살아있기 때문에 문제가 발생할 수 있다. 알맞지 않은 기능은 못쓰게 해야 하기 때문에 이 기능을 다른 기능으로 바꾸기 위하여 오버라이딩을 사용한다.<ref name="오버라이드"></ref>
+
오버라이딩을 하지않으면 이름을 다르게 해야하는데 그럼 그 메소드가 여전히 살아있기 때문에 문제가 발생할 수 있다. 알맞지 않은 기능은 못쓰게 해야 하기 때문에 이 기능을 다른 기능으로 바꾸기 위하여 오버라이딩을 사용한다.<ref name="오버라이드"></ref>
  
 
== 언어별 예시 ==  
 
== 언어별 예시 ==  
 
=== C++ ===
 
=== C++ ===
C++에서, 부모 또는 기본 클래스의 이름은 함수들을 오버라이드하기 위한 범위 지정 연산자(scope resolution operator) 이후에 사용된다. 예를 들면 다음의 코드는 두 클래스들을 나타내는데, 기본 클래스 TRectangle, 그리고 유도 클래스 TBox이 그것이다. TBox는 TRectangle 클래스의 print() [[메소드]]를 오버라이드하며, 또한 자신의 높이를 보여준다.<ref name="위키백과"></ref>
+
C++에서, 부모 또는 기본 클래스의 이름은 함수들을 오버라이드하기 위한 범위 지정 연산자(scope resolution operator) 이후에 사용된다. 예를 들면 다음의 코드는 두 클래스들을 나타내는데, 기본 클래스 TRectangle, 그리고 유도 클래스 TBox이 그것이다. TBox는 TRectangle 클래스의 print() 메소드를 오버라이드하며, 또한 자신의 높이를 보여준다.<ref name="위키백과"></ref>
 
 
 
  #include <iostream>
 
  #include <iostream>
 
  class TRectangle
 
  class TRectangle
175번째 줄: 184번째 줄:
 
  }
 
  }
  
== 오버라이드 ==  
+
== Override ==  
오버라이드(override)란 [[어노테이션]](annotation)이라는 것으로 직역하면 [[주석]]이라는 뜻이다.<ref name="오버라이드">[https://hyoje420.tistory.com/14 오버라이드란]〉, 《오버라이드》, 2018-07-12</ref> 이는 일반적인 주석과 다르게, 검증하는 기능을 한다. 여기서 사용된 @Override라는 어노테이션은 오버라이딩을 검증하는 기능을 한다. 코드상으로 검사했을 때 오버라이딩이 실제로 시행되지 않았다면 컴파일시 오류를 출력한다.
+
Override <ref name="오버라이드">오버라이드란〈[https://hyoje420.tistory.com/14]〉,  
 
+
《오버라이드》, 2018-07-12</ref>란 어노테이션(Annotation)이라는 것으로 직역하면 주석이라는 뜻이다. 이는 일반적인 주석과 다르게, 검증하는 기능을 한다. 여기서 사용된 @Override라는 어노테이션은 오버라이딩을 검증하는 기능을 한다. 코드상으로 검사했을 때 오버라이딩이 실제로 시행되지 않았다면 컴파일시 오류를 출력한다.
 +
<br><br>
 
위 코드는 정상적으로 실행되는 것을 볼 수 있다. 부모 클래스의 메소드를 오버라이딩하는 것은 내용만을 새로 정의하는 것이므로 선언부는 부모의 것과 완벽히 동일해야 하는 것을 볼 수 있다.
 
위 코드는 정상적으로 실행되는 것을 볼 수 있다. 부모 클래스의 메소드를 오버라이딩하는 것은 내용만을 새로 정의하는 것이므로 선언부는 부모의 것과 완벽히 동일해야 하는 것을 볼 수 있다.
 
+
<br><br>
 
프로그래머가 Person클래스의 cry메소드를 '흑흑'이라고 정의했다. 그런데 Child클래스와 Senior클래스를 만들면서 울음소리를 다르게 출력하고 싶은 것이다. 그래서 Chile클래스와 Senior클래스에서 부모의 메소드의 이름만 빌려와서 자기의 방식대로 '재정의'하였다. 이것이 오버라이딩이다.
 
프로그래머가 Person클래스의 cry메소드를 '흑흑'이라고 정의했다. 그런데 Child클래스와 Senior클래스를 만들면서 울음소리를 다르게 출력하고 싶은 것이다. 그래서 Chile클래스와 Senior클래스에서 부모의 메소드의 이름만 빌려와서 자기의 방식대로 '재정의'하였다. 이것이 오버라이딩이다.
 
여기서 접근 제어자를 다르게 설정해 놓은 것을 볼 수 있다.  
 
여기서 접근 제어자를 다르게 설정해 놓은 것을 볼 수 있다.  
 +
<br><br>
 +
==== 오버라이딩에서 접근 제어자를 설정하는 규칙 ====
 +
1. 자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다. 위에서 볼 수 있듯이 부모클래스의 접근제어자는 default로 설정되어 있다. 여기서 자식 클래스들은 default보다 같거나 더 넓은 범위의 접근제어자만 설정할 수 있으므로 default, protected, public 이 세 개의 접근 제어자는 사용이 가능하다.<br>
  
==== 오버라이딩에서 접근 제어자를 설정하는 규칙 ====
+
<br>2. 예외(Exception)는 부모 클래스의 메소드 보다 많이 선언할 수 없다.부모 클래스에서 어떤 예외를 throws 한다고 하면, 자식 클래스에서는 그 예외보다 더 큰 범위의 예외를 throws할 수 없다는 것이다.<br>
# 자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다. 위에서 볼 수 있듯이 부모클래스의 접근제어자는 default로 설정되어 있다. 여기서 자식 클래스들은 default보다 같거나 더 넓은 범위의 접근제어자만 설정할 수 있으므로 default, protected, public 이 세 개의 접근 제어자는 사용이 가능하다.
+
<br>3. static메소드를 인스턴스의 메소드로 또는 그 반대로 바꿀 수 없다. 부모 클래스의 static메소드를 자식에서 같은 이름으로 정의할 수 있지만 이것은 다시 정의하는 것이 아니라 같은 이름의 static메소드를 새로 정의하는 것이다.
# 예외(Exception)는 부모 클래스의 메소드 보다 많이 선언할 수 없다.부모 클래스에서 어떤 예외를 throws 한다고 하면, 자식 클래스에서는 그 예외보다 더 큰 범위의 예외를 throws할 수 없다는 것이다.<br>
 
# static 메소드를 인스턴스의 메소드로 또는 그 반대로 바꿀 수 없다. 부모 클래스의 static메소드를 자식에서 같은 이름으로 정의할 수 있지만 이것은 다시 정의하는 것이 아니라 같은 이름의 static메소드를 새로 정의하는 것이다.
 
  
 +
<br>
 
=== Override 조건 ===
 
=== Override 조건 ===
 
* 부모 클래스와 자식 클래스 사이에서만 성립된다.
 
* 부모 클래스와 자식 클래스 사이에서만 성립된다.
194번째 줄: 206번째 줄:
 
* interface를 구현하여 오버라이드할 때는 반드시 public 접근 제어자를 사용해야 한다.
 
* interface를 구현하여 오버라이드할 때는 반드시 public 접근 제어자를 사용해야 한다.
 
* 오버로드와 달리 리턴 타입, 메소드명, 매개변수 패턴이 모두 같아야 한다.
 
* 오버로드와 달리 리턴 타입, 메소드명, 매개변수 패턴이 모두 같아야 한다.
* final이 지정된 메소드는 오버라이드 할 수 없다.<ref name="오버라이드 조건">〈[https://programmingnote.tistory.com/29 오버라이드 조건]〉, 《오버라이드 조건》, 2018-10-12</ref>
 
 
* 부모 클래스의 메소드의 접근 제한자 범위보다 작아질 수 없고 확장은 가능하다.
 
* 부모 클래스의 메소드의 접근 제한자 범위보다 작아질 수 없고 확장은 가능하다.
::- 부모의 public 접근제한 ->자식의 private, default 수정불가
+
* 부모 클래스의 메소드보다 더 많은 예외를 던질 수 없다.
::- 부모의 default 접근제한 ->자식의 default, public 수정가능
+
* final이 지정된 메소드는 오버라이드 할 수 없다.<ref name="오버라이드 조건">오버라이드 조건
* 부모 클래스의 메소드보다 더 많은 예외를 던질 수 없다.(새로운 예외(Exception)를 throws(떠넘기기)할 수 없다.)
+
〈[https://programmingnote.tistory.com/29]〉,  
::예외의 개수 뿐만 아니라 상위의 예외의 경우, 개수가 적어보이지만 더 많은 예외를 처리할 수 있기 때문에 선언할 수 없게 된다.
+
《오버라이드 조건》, 2018-10-12</ref>
#throws error Example
 
class Parent {
 
void parentMethod() throws IOException, SQLException {
 
};
 
}
 
 
class Child extends Parent {
 
void parentMethod() throws Exception { //조상 클래스보다 예외의 개수가 적지만 예외 클래스의 최상의 클래스
 
};
 
}
 
  
 +
<br>
 
=== Override 장점 ===
 
=== Override 장점 ===
* 같은이름으로 body(구현부)를 변경하여 내용을 수정하여 사용함을 통해 프로그램의 리소스를 줄여준다.<ref name="오버라이드 장점">〈[https://springofdev.tistory.com/entry/overloading%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-overriding%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9 오버라이드 장점]〉, 《오버라이드 장점》, 2015-04-09</ref>
+
* 같은이름으로 body(구현부)를 변경하여 내용을 수정하여 사용함을 통해 프로그램의 리소스를 줄여준다.<ref name="오버라이드 장점">오버라이드 장점
 +
〈[https://springofdev.tistory.com/entry/overloading%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-overriding%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9]〉,  
 +
《오버라이드 장점》, 2015-04-09</ref>
  
 
{{각주}}
 
{{각주}}
  
 
== 참고자료 ==
 
== 참고자료 ==
* [https://www.zerocho.com/category/JavaScript/post/59c17a58f40d2800197c65d6 오버로딩과 오버라이딩의 차이]
+
* [https://www.zerocho.com/category/JavaScript/post/59c17a58f40d2800197c65d6 오버로딩과 오버라이딩의 차이]
* [https://gbsb.tistory.com/235 오버로딩과 오버라이딩 비교]
+
*[https://gbsb.tistory.com/235 오버로딩과 오버라이딩 비교]
* [https://ko.wikipedia.org/wiki/%EB%A9%94%EC%86%8C%EB%93%9C_%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9 메소드 오버라이딩 - 위키백과]
+
* [https://ko.wikipedia.org/wiki/%EB%A9%94%EC%86%8C%EB%93%9C_%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9 메소드 오버라이딩 - 위키백과]
* 〈[https://hyoje420.tistory.com/14 오버라이드의 정의]〉
+
* [https://programmingnote.tistory.com/29 오버라이드의 조건/장점]
* 〈[https://springofdev.tistory.com/entry/overloading%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9%EA%B3%BC-overriding%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9 오버라이드의 장점]〉
 
* 〈[https://programmingnote.tistory.com/29 오버라이드의 조건/장점]
 
* 모든기록, 〈[https://all-record.tistory.com/60 오버라이딩(Overrind)]〉, 《개인블로그》, 2016
 
  
 
== 같이 보기 ==
 
== 같이 보기 ==

해시넷에서의 모든 기여는 다른 기여자가 편집, 수정, 삭제할 수 있다는 점을 유의해 주세요. 만약 여기에 동의하지 않는다면, 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다 (자세한 사항은 해시넷:저작권 문서를 보세요). 저작권이 있는 내용을 허가 없이 저장하지 마세요!

취소 | 편집 도움말 (새 창에서 열림)