"오버라이딩"의 두 판 사이의 차이
sykang001215 (토론 | 기여) |
|||
7번째 줄: | 7번째 줄: | ||
− | '''메소드 오버라이딩''',(method overriding)은 [[객체 지향 프로그래밍]]에서 서브[[클래스]] 또는 자식 클래스가 자신의 슈퍼클래스들 또는 부모 클래스들 중 하나에 의해 이미 | + | '''메소드 오버라이딩''',(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://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> | + | |
− | |||
== 등장배경/역사 == | == 등장배경/역사 == |
2020년 8월 6일 (목) 11:07 판
오버라이딩(overriding)이란 조상 클래스로부터 상속받은 메소드(method)의 내용을 자손 클래스에 맞게 변경하는 것을 말한다. 오버로딩은 기존 메소드에 새로운 내용이 추가되지만, 오버라이딩은 기존 메소드 중 중복되는 내용이 새로운 내용으로 변경된다.
개요
상위 클래스가 가지고 있는 멤버변수가 하위 클래스로 상속되는 것처럼 상위 클래스가 가지고 있는 메소드도 하위 클래스로 상속되어 하위 클래스에서 사용할 수 있다. 하지만, 하위 클래스에서 메소드를 재정의해서 사용할 수 있다. 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술을 오버라이딩(Overriding) 이라고 한다.[1]
메소드 오버라이딩,(method overriding)은 객체 지향 프로그래밍에서 서브클래스 또는 자식 클래스가 자신의 슈퍼클래스들 또는 부모 클래스들 중 하나에 의해 이미 제공된 메소드를 특정한 형태로 구현하는 것을 제공하는 언어의 특징이다. 서브클래스에서의 구현은 부모 클래스에서 같은 이름, 같은 파라미터 또는 시그니처 그리고 같은 반환형을 갖는 메소드를 제공함으로써 슈퍼클래스에서의 구현을 오버라이드한다. 실행되는 메소드의 버전은 이것을 발생시키는데 사용되는 객체에 의해서 결정될 것이다. 만약 부모 클래스의 객체가 메소드를 발생시키는데 사용된다면 부모 클래스 버전이 실행될 것이지만, 만약 서브클래스의 객체가 메소드를 발생시키는데 사용된다면 자식 클래스 버전이 실행될 것이다. 몇몇 언어들은 프로그래머가 메소드를 오버라이딩하는 것을 예방하게할 수 있게 한다.[2]
등장배경/역사
특징
- 메소드 이름이 같아야 한다.
- 리턴형이 같아도 되고 달라도 된다.
- 파라미터 개수가 달라야 한다.
- 파라미터 개수가 같을 경우, 데이터타입이 달라야 한다.[3]
언어별 예시(활용)
- C++[2]
C++에서, 부모 또는 기본 클래스의 이름은 함수들을 오버라이드하기 위한 범위 지정 연산자(scope resolution operator) 이후에 사용된다. 예를 들면 다음의 코드는 두 클래스들을 나타내는데, 기본 클래스 TRectangle, 그리고 유도 클래스 TBox이 그것이다. TBox는 TRectangle 클래스의 print() 메소드를 오버라이드하며, 또한 자신의 높이를 보여준다.
#include <iostream> class TRectangle { public: TRectangle(double l, double w) : length(l), width(w) {} virtual void print() const;
private: double length; double width; };
void TRectangle::print() const { // print() method of base class. std::cout << "Length = " << this->length << "; Width = " << this->width; }
class TBox : public TRectangle { public: TBox(double l, double w, double h) : TRectangle(l, w), height(h) {} // virtual is optional here, but it is a good practice to remind it to the developer. virtual void print() const; private: double height; };
void TBox::print() const { // Invoke parent print() method. TRectangle::print(); std::cout << "; Height = " << this->height; }
클래스 TBox에서 print()는 메소드 print()의 부모 버전을 불러일으킴으로써, 또한 기본 클래스의 private 변수 length와 width를 출력할 수 있다. 반면, 이러한 변수들은 TBox에 접근할 수 없다. 다음 구문은 타입 TRectangle 와 TBox,의 객체들을 인스턴스화할 것이며, 그들 각각의 print() 메소드들을 호출한다:
int main(int argc, char** argv) { TRectangle rectangle(5.0, 3.0);
// Outputs: Length = 5.0; Width = 3.0 rectangle.print();
TBox box(6.0, 5.0, 4.0);
// The pointer to the most overridden method in the vtable in on TBox::print, // but this call does not illustrate overriding. box.print();
// This call illustrates overriding. // outputs: Length = 6.0; Width = 5.0; Height= 4.0 static_cast<TRectangle&>(box).print(); }
C++11에서는 자바와 비슷하게 슈퍼클래스에서 final로 정의된 메소드는 오버라이딩될 수 없다. 또한 메소드는 컴파일러가 기본 클래스에서 메소드를 오버라이드하는지를 검사하기 위해 override가 선언될 수 있다.
- 델파이
델파이에서 메소드 오버라이딩은 지시자 override를 통해 수행되지만, 단지 메소드가 dynamic 또는 virtual 지시자로 표시되어야 한다. inherited라는 단어는 슈퍼클래스 행동을 호출하기를 원할 때 반드시 호출되어야 한다.
type TRectangle = class private FLength: Double; FWidth: Double; public property Length read FLength write FLength; property Width read FWidth write FWidth;
procedure Print; virtual; end;
TBox = class(TRectangle) public procedure Print; override; end;
- 파이썬
파이썬에서, 서브클래스는 슈퍼클래스의 메소드를 오버라이드하는 메소드를 포함하며, 또한 self.method.In 대신 super(Subclass, self).method를 호출함으로써 슈퍼클래스를 호출할 수 있다.
class Thought(object): def __init__(self): pass def message(self): print "I feel like I am diagonally parked in a parallel universe."
class Advice(Thought): def __init__(self): super(Advice, self).__init__() def message(self): print "Warning: Dates in calendar are closer than they appear" super(Advice, self).message()
- 루비
루비에서, 서브클래스는 슈퍼클래스의 메소드를 오버라이드하는 메소드를 포함하며, 또한 오버라이딩 된 메소드에서 super를 호출함으로써 슈퍼클래스를 호출할 수 있다. 만약 오버라이딩된 메소드 오버라이딩 메소드의 외부에서 보존되게 하고 싶다면 아래의 'super_message'와 함께 alias를 사용할 수 있다.
class Thought def message puts "I feel like I am diagonally parked in a parallel universe." end end
class Advice < Thought alias :super_message :message def message puts "Warning: Dates in calendar are closer than they appear" super end end
- JAVA
public class 클래스A{ int A = 1; int B = 2; public void method() { System.out.println(this.A+ this.B); } } public class 클래스B extends 클래스A{ public void method() { System.out.println("A + B = " +(this.A+ this.B)); } }
각주
같이 보기