U E D R , A S I H C RSS

Java Study2004/오버로딩과오버라이딩

수업 내용

2004년 자바 중간고사 3번 문제로 출제

오버라이딩

기반 클래스에 이미 존재하는 함수를 파생 클래스에서 다시 선언하고, 구현하는 것을 함수를 재정의(Overriding)한다고 한다. 기반 클래스에 이미 존재하는 함수를 파생 클래스에서 재정의 하면, 파생 클래스에서는 기반 클래스에서 정의된 함수가 무시되고, 파생 클래스에 새로 정의된 함수가 동작하게 된다.
예를 들어 People클래스에 move(int aX, int aY){this.position.x += aX;this.position.y += aY;}라는 함수가 있다. 그리고 People클래스를 상속 받은 Student이라는 클래스가 있다. 근데 '학생'은 좀 멍청해서 반대로 움직인다. 그렇다면 상속받은 move함수를 재정의 해줘야한다. move(int aX, int aY){this.position.x -= aX;this.position.y -= aY;}
~cpp 
People people;//초기 위치(100, 100)
people.move(10,10);//이동 후 위치(110, 110)

Student student;//초기 위치(100, 100)
student.move(10,10);//이동 후 위치(90, 90)
함수를 재정의 할 때는 기반 클래스에 만들어져 있는 함수와 파생 클래스에서 재정의한 함수의 함수명과 매개변수의 타입이 완전히 같아서 서로 구별할 수 없어야 한다. 만약, 재정의 하려고 함수를 만들었는데 이것이 기반 클래스에 있는 함수와 매개변수의 타입이 조금이라도 다르면, 이것은 재정의가 아니라 오버로딩으로 간주된다.

오버로딩

오버로딩이란 하나의 함수명에 비슷한 기능을 하면서 넘겨 받는 매개변수가 서로 다른 함수를 두개 이상 정의하는 것을 말한다.
위에서 말한 People클래스의 move함수를 예를 들어보겠다. 위의 move함수는 정수형 인자를 매개변수로 받아들인다. 만약 people.move(1.1, 2.13)라는 명령어를 실행한다면 매개변수의 타입이 다르다는 에러가 발생할 것이다. 더블 형의 인자를 받아들이기 위해 move함수를 Overloading한다. move(double aX, double aY){this.position.x += (int)aX;this.position.y += (int)aY;} 두 함수 다 유효한 함수로 사용된다. 두 함수 중 어떤 함수가 호출될 것인지는 매개변수 값에 의해서 결정된다. 즉 오버로딩 된 함수들은 반드시 매개변수의 타입이 달라 서로 구별될 수 있어야 한다.
~cpp 
People people;//초기 위치(100, 100)
people.move(10,10);//이동 후 위치(110, 110)
people.move(5.1,11.8);//Overloading된 함수 호출, 이동 후 위치(115, 121)

사전적 의미

Overriding과 Overloading은 비슷하게 생겼기 때문에 혼동하기 쉽다. Overloading은 '너무 많이 싣다', '과적하다'라는 뜻으로 되어있고, Overriding은 '무시하다', '짓밟다'라고 해석된다. 사전적 의미를 기억해둔다면 두 개가 혼동될 때 도움이 될 것이다.

Thread

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:19
Processing time 0.0100 sec