개념
메소드 오버라이딩(method overriding), 즉 오버라이딩은 슈퍼클래스와 서브 클래스의 메소드 사이에서 같은 이름, 같은 반환형, 같은 매개변수 리스트를 갖는 메소드를 서브클래스에서 재작성하는 것이다.
예를 들어 슈퍼클래스에서의 draw() 함수와 서브클래스에서의 draw()함수가 존재할때, 서브클래스 객체로 선언되어진 객체에서 draw()함수를 호출하게되면 반드시 서브클래스의 draw()함수가 실행된다는 것이다.
즉, 메소드 오버라이딩은 '슈퍼 클래스 메소드 무시하기 혹은 덮어쓰기'로 이해할 수 있다. 이는 슈퍼 클래스의 메소드를 무시하고 서브 클래스에서 오버라이딩된 메소드가 무조건 실행되도록 한다는 것인데, 이런 처리를 동적 바인딩이라고 부르며, 메소드 오버라이딩은 동적 바인딩을 유발시킨다.
예제
class Shape { //슈퍼 클래스
public Shape next;
public Shape() {
next=null;
}
public void draw(){
System.out.println("Shape");
}
}
class Line extends Shape {
public void draw() { //오버라이딩
System.out.println("Line");
}
}
class Rect extends Shape {
public void draw() { //오버라이딩
System.out.println("Rect");
}
}
class Circle extends Shape {
public void draw() { //오버라이딩
System.out.println("Circle");
}
}
public class MethodOverridingEx {
static void paint(Shape p) {
p.draw();
}
public static void main(String[] args) {
Line line=new Line();
paint(line);
paint(new Shape());
paint(new Rect());
paint(new Circle());
paint(new Line());
}
}
@Override라는 주석문을 사용하면 오버라이딩시에 오타로인한 컴파일 오류를 쉽게 확인할 수 있다.
활용
main() 메소드에서 Line, Rect, Circle등의 객체들을 생성하여 연결리스트로 연결하였다.
start 변수는 연결 리스트의 시작 주소(레퍼런스)를 저장하며, last는 연결 리스트에 연결된 마지막 도형 객체의 주소(레퍼런스)를 저장한다. 그리고 obj는 새로 생긴 도형 객체의 주소(레퍼런스)를 저장한다.
main()에서 다음 코드는 start에서부터 연결된 모든 도형 객체를 방문하면서 draw() 메소드를 호출한다.
Shape p = start;
while(p!=null) {
p.draw(); //p가 가리키는 객체의 오버라이딩된 draw() 메소드 호출
P=P.next; //p는 다음 객체의 레퍼런스 값을 가짐
}
레퍼런스는 p의 타입이 Shape이므로 p.draw()는 Shape의 멤버 draw()를 호출하게 될 것 같지만, 실제로는 오버라이딩한 draw() 메소드가 호출된다. 이것을 동적 바인딩이라 한다.
public class UsingOverride {
public static void main(String[] args) {
Shape start;
Shape last;
Shape obj;
start=new Line();
last=start;
obj=new Rect();
last.next=obj;
last=obj;
obj=new Line();
last.next=obj;
last=obj;
obj=new Circle();
last.next=obj;
Shape p=start;
while(p!=null) {
p.draw();
p=p.next;
}
}
}
메인함수만 변경하여 연결리스트로 연결하였다.
연결리스트 개념 참고
2024.07.13 - [Algorithm] - 연결 리스트 (linked list)
연결 리스트 (linked list)
연결 리스트 (linked list)배열과 달리 각각의 요소가 포인터를 사용하면서 다음 요소의 위치를 가리킨다.포인터를 사용하여 자료를 연결하는 다른 자료구조에는 스택, 큐, 트리, 그래프 등이 있다.
kwone.tistory.com
super 키워드, 정적 바인딩
super 키워드를 활용하면 정적 바인딩을 통해 수퍼 클래스의 메소드를 실행할 수 있다.
super.슈퍼클래스의멤버
super는 자바 컴파일러에 의해 지원되는 것으로 슈퍼 클래스에 대한 레퍼런스이다. super를 이용하면 슈퍼클래스의 필드와 메소드 모두 접근 가능하다.
name="Circle"; //Circle 클래스의 name에 "Circle" 기록
super.name="Shape"; //Shape 클래스의 name에 "Shape" 기록
super.draw(); //Shape 클래스의 draw() 호출, 정적 바인딩, Shape 출력
this와 super는 모두 레퍼런스로서 this는 현재 객체의 모든 멤버를, super는 현재 객체 내에 있는 슈퍼 클래스 멤버를 접근할 수 있다.
super로 메소드를 호출하면 정적바인딩을 실행한다. 한편, this()와 super()는 모두 메소드호출이며, this()는 생성자에서 다른 생성자를 호출할 때 사용하고, super()는 서브 클래스의 생성자에서 슈퍼 클래스의 생성자를 호출할 때 사용한다.
예제
class Weapon{
protected int fire() {
return 1;
}
}
class Canon extends Weapon{
@Override
protected int fire() {
return 10;
}
}
public class Overriding {
public static void main(String[] args) {
Weapon weapon;
weapon=new Weapon();
System.out.println("기본 무기의 살상도 "+weapon.fire());
weapon=new Canon();
System.out.println("대포 무기의 살상도 "+weapon.fire());
}
}
오버로딩과 오버라이딩은 차이가 있다. 오버라이딩은 상속관계에서만 성립되지만 오버로딩은 상속 관계 둘 다 가능하다.
'JAVA' 카테고리의 다른 글
Chapter 04 실습 문제 (0) | 2024.08.16 |
---|---|
클래스와 객체 활용 예제 (0) | 2024.08.16 |
상속 (0) | 2024.08.14 |
Chapter 03 실습문제 (0) | 2024.08.13 |
비정형 배열 (0) | 2024.08.13 |