산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

자바 메서드 오버라이딩: 슈퍼클래스 동작 커스터마이징

이전 장에서 슈퍼클래스와 서브클래스에 대해 다뤘습니다. 클래스가 슈퍼클래스에서 메서드를 상속받으면, 그 메서드가 final로 표시되지 않은 한 오버라이드할 수 있습니다.

오버라이딩의 이점: 서브클래스 타입에 특화된 동작을 정의할 수 있어, 서브클래스가 부모 클래스 메서드를 자신의 요구사항에 맞게 구현할 수 있습니다.

객체지향 용어로 오버라이딩은 기존 메서드의 기능을 재정의하는 것을 의미합니다.

예제

예제를 살펴봅시다.

class Animal {
    public void move() {
        System.out.println("Animals can move");
    }
}

class Dog extends Animal {
    public void move() {
        System.out.println("Dogs can walk and run");
    }
}

public class TestDog {
    public static void main(String args[]) {
        Animal a = new Animal();  // Animal 참조와 객체
        Animal b = new Dog();     // Animal 참조지만 Dog 객체
        a.move();  // Animal 클래스의 메서드 실행
        b.move();  // Dog 클래스의 메서드 실행
    }
}

실행 결과

Animals can move
Dogs can walk and run

위 예제에서 b는 Animal 타입이지만 Dog 클래스의 move 메서드를 실행합니다. 이유는: 컴파일 타임에는 참조 타입을 기준으로 체크하지만, 런타임에는 JVM이 객체 타입을 파악하여 해당 객체에 속한 메서드를 실행하기 때문입니다.

따라서 위 예제에서 Animal 클래스에 move 메서드가 있으므로 컴파일은 정상적으로 됩니다. 런타임에는 해당 객체에 특화된 메서드가 실행됩니다.

다음 예제를 고려해 보세요.

예제

class Animal {
    public void move() {
        System.out.println("Animals can move");
    }
}

class Dog extends Animal {
    public void move() {
        System.out.println("Dogs can walk and run");
    }
    public void bark() {
        System.out.println("Dogs can bark");
    }
}

public class TestDog {
    public static void main(String args[]) {
        Animal a = new Animal();  // Animal 참조와 객체
        Animal b = new Dog();     // Animal 참조지만 Dog 객체
        a.move();  // Animal 클래스의 메서드 실행
        b.move();  // Dog 클래스의 메서드 실행
        b.bark();  // 컴파일 에러!
    }
}

실행 결과

TestDog.java:26: error: cannot find symbol
    b.bark();
    ^
symbol: method bark()
location: variable b of type Animal
1 error

이 프로그램은 컴파일 타임 에러를 던집니다. b의 참조 타입인 Animal에 bark라는 이름의 메서드가 없기 때문입니다.

메서드 오버라이딩 규칙

super 키워드 사용하기

오버라이드된 메서드의 슈퍼클래스 버전을 호출할 때 super 키워드를 사용합니다.

예제

class Animal {
    public void move() {
        System.out.println("Animals can move");
    }
}

class Dog extends Animal {
    public void move() {
        super.move();  // 슈퍼클래스 메서드 호출
        System.out.println("Dogs can walk and run");
    }
}

public class TestDog {
    public static void main(String args[]) {
        Animal b = new Dog();  // Animal 참조지만 Dog 객체
        b.move();  // Dog 클래스의 메서드 실행
    }
}

실행 결과

Animals can move
Dogs can walk and run

java

  1. Java 연산자 마스터하기: 종류, 문법, 실전 예제
  2. Java 인터페이스 마스터: 개념, 구현, 모범 사례
  3. Java String length() 메서드: 문자열 크기 구하기 (예제 포함)
  4. Java String.indexOf() 마스터: 부분문자열 위치 찾기 & 실전 예제
  5. Java String.charAt() 완전 이해: 문법, 반환타입, 예외, 실전 예제
  6. Java String compareTo() 마스터: 문법, 활용 케이스, 실전 예제
  7. Java String.contains() 메서드: 부분문자열 포함 여부 확인 (실전 예제)
  8. Java String.endsWith() 마스터: 문자열 접미사 확인 예제
  9. Java 문자열 치환 마스터: replace(), replaceAll(), replaceFirst() 완벽 해설
  10. Java static 완벽 해설: 변수, 메서드, 블록과 실전 예제