공부한 것 꼭꼭 씹어먹기

JAVA 메소드 오버라이드 본문

소소한 개발 지식

JAVA 메소드 오버라이드

젤라솜 2022. 10. 5. 17:15
반응형

 

오버라이드는 무엇인가

오버라이드(override)란, 서브 클래스로 슈퍼 클래스의 메소드를 우선시키는 것으로 폴리모피즘을 가능하게 합니다. 폴리모피즘은 같은 이름의 메소드에 대해 다른 처리를 하는 것입니다 .

순서를 따라 설명해보겠습니다. 우선, 서브 클래스를 슈퍼 클래스의 참조로 취급하는 메리트를 String 클래스의 equals 메소드를 사용해볼게요. 그 전에 instanceof 연산자에 대해 간단히 소개해 둡니다. 이 연산자는 인스턴스의 클래스를 검사할 때 유효한 연산자입니다. 사용 예입니다.

String s = "Hello";
System.out.println(s instanceof String);

출력 결과는 true로 표시됩니다. 그런 다음 String 클래스의 equals 메소드를 읽어 봅시다. 소스 코드를 읽기 전에 요구 사항을 정리하십시오. 전제: "Hello".equels("Hello")가 true인지 확인 / 문자열 "Hello"와 비교 대상의 문자열 "Hello"가 같다는 것은 다음의 2개의 패턴이 있습니다.

1. 어느 참조의 내용도 같은 경우(동일한 인스턴스를 가리키고 있는 경우)
2.동일한 인스턴스는 아니지만, 모든 캐릭터가 같을 경우

그리고 2.의 경우에서는, 이하의 3개의 기준을 클리어 하면 같은 캐릭터 라인이라고 하는 것을 말할 수 있습니다.

① 비교 대상도 문자열이다

②비교 대상 문자와 문자수가 같다(Hello의 경우는 5)

③ 선두 문자로부터 한 문자씩 비교해 가서 끝까지 같은 문자이다

※①②가 false이면 즉시 같은 문자열이 아니라고 판단할 수 있으므로 시간 단축이 가능합니다. 그것을 Java의 코드로 표현하고 있는 것이 이하의 String 클래스의 equals 메소드입니다. 덧붙여 이 코드로 사용되고 있는 변수 value 는 인스턴스의 캐릭터 라인 (이번의 예에서는 "Hello")이 한 문자씩 분리되어 있는 char 형의 배열입니다. String 클래스의 equals 메소드는 2개의 변수가 같은 인스턴스를 참조하고 있지 않아도, 같은 값(문자열)을 가지고 있으면 같다, 라는 의미라는 것을 우리는 배웠습니다.

그렇다면 Java 프로그램에서 무엇을 동일한 인스턴스로 판단할까요? 그것은 프로그램의 목적에 따라 달라집니다.

따라서 클래스마다 equal 메소드의 내용은 다시 쓸 수 있습니다.  String 클래스의 equal 메소드의 예에서 보듯이, 서브 클래스에서 슈퍼 클래스의 메소드를 변경할 수 있습니다. 이것을 오버라이드( override )라고 합니다.  영어로는 over 「위에」ride 「싣는다」라고 하는 것으로 덮어쓴다는 의미입니다. 그러나 이전 내용이 지워지지 않는 덮어쓰기 이죠. 오버로드(다중 정의: 인수의 수나 형태가 다르고 이름이 같은 메소드를 선언하는 것)와 이름이 비슷하므로 주의해 주세요. 또, 슈퍼 클래스의 오버라이드(override) 된 메소드가 덧쓰기(overwrite) 되어 버린 것은 아니기 때문에 주의해 주세요. 슈퍼 클래스의 메소드를 서브 클래스로부터 호출하는 것도 가능합니다. 그 때는 super라는 키워드를 사용하지만 여기에서는 그 세부 사항을 언급하지 않습니다.

 

 

메소드 오버라이드 

여기에서는 재정의가 성립하기 위한 3개의 조건을 들겠습니다.

  1. 메소드의 서명이 슈퍼 클래스와 동일합니다.
  2. 메소드의 액세스 제어가 슈퍼 클래스와 같거나 느슨합니다.
  3. 반환값의 형태가, 슈퍼 클래스의 메소드와 같거나 서브 클래스형인

일단 3은 폴리모피즘과 관련된 것이므로 지금은 넘어가겠습니다.  "1. 메소드의 서명이 슈퍼 클래스와 동일하다"에 대해서는 주의할 점이 있습니다. 철자 오류로 인해 재정의가 되지 않을 수 있는 것인데요. 이를 위해 @Override라는 주석(annotation)이 있습니다. 이 어노테이션을 삽입하면 「오버라이드의 생각이 철자 미스에 의해 오버라이드가 되어 있지 않았다」라고 하는 실수를 막는 효과가 있습니다. 즉, 이 메소드는 오버라이드 된 메소드라고 알려주는 어노테이션입니다.

 

public class Example {

    public static void main(String[] args) {
        Vehicle v = new Car();
        v.run();
    }
}

 

public class Car extends Vehicle {

    @Override
    void run() {
        System.out.println("I'm driving fast.");
    }
}
반응형
Comments