자바/자바기초

[자바] 6화 오버로딩&오버라이딩(overloading / overriding)

khao 2016. 4. 7. 00:52

사실 상속 다음에 바로 오버로딩과 오버라이딩을 쓰려 했는데 예외처리를 먼저 쓰게 되어 순서가 조금 어색해진 부분이 없잖아 있습니다. 그래서 기왕 꼬인 일 이해의 흐름에 문제만 없다면 신경쓰지 않기로 했습니다. 

오버로딩(Overloading)과 오버라이딩(Overriding)은 이름이 비슷해서 상당히 잘 헷갈립니다. 쓰다보면 외워진다지만 나름 쉽게 외우는 방법을 설명 드리자면...




오버로딩같은 이름의 메소드가 소스코드에 너무 많이 실렸다고 생각하시면 됩니다.

C와 달리 자바나 C#에서는 같은 이름의 메소드에 괄호 안에 들어가는 매개변수의 자료형이나 변수 개수만 바꿔서 여러가지의 같은 이름을 쓴 메소드를 만들 수 있습니다. 여기서 중요한 것은 매개변수가 구분기준이라는 것입니다. 올바른 예와 나쁜 예를 간단히 살펴보자면 아래와 같습니다.

void sayMessage(String msg) {
  System.out.println(msg);
}
void sayMessage(Player name, String msg) {
  name.send(msg);
}

[올바른 Overloading의 예]

void sayMesage(String msg) {
}
String sayMessage(String msg) {
    return msg;
}

[잘못된 Overloading의 예]




오버라이딩은 슈퍼클래스에서 상속받은 메소드를 서브클래스에서 다른 의미의 메소드로 변형하는 것을 의미합니다.

오버라이딩은 사전설명이 너무 프로그래밍에서의 의미와 맞아떨어져서 더 설명할 필요도 없을 것 같습니다.

사전적 의미 그대로 슈퍼클래스에서 정한 메소드의 의미를 무시하고 서브클래스에서 새롭게 정의하는 것입니다.

class Entity {
  public String getName() {
    return "Entity";
  }
}
class Human extends Entity {
  private String Name;
  public String getName(){
    return Name;
  }
}
class Zombie extends Entity {
  public String getName() {
    return "zombie";
  }
}

위에서 Entity라고 하는 생명체를 통칭하는 클래스를 하나 만들고 사람과 좀비라는 클래스를 Entity를 상속받도록 하여 만들었습니다. getName()이라고 불리는, 이름을 얻는 메소드를 각각의 서브클래스가 새로 정의를 내렸습니다. Human의 경우 자신의 이름을 부르도록 하였고, Zombie의 경우 zombie라고 불리는 집합을 이름이 되도록 했습니다. 위처럼 같은 슈퍼클래스를 상속받아 같은 getName()을 쓰지만 서로 다른 내용을 정의하는 것을 오버라이딩이라고 합니다.