코딩일기/자격증

[정보처리기사] [ Java ] 자바 객체지향 : 오버로딩, 오버라이딩 | 정보처리기사 실기 기출문제

jhy_2023 2024. 11. 21. 16:08
728x90
반응형

2020년 3회 정보처리기사 실기 기출문제

문제

다음은 자바 코드이다. 출력 결과를 쓰시오.

abstract class Vehicle {
    private String name;
    abstract public String getName(String val);
    public String getName() {
        return "Vehicle name: " + name;
    }
    public void setName(String val) {
        name = val;
    }
}

class Car extends Vehicle {
    public Car(String val) {
        setName(val);
    }
    public String getName(String val) {
        return "Car name: " + val;
    }
    public String getName(byte val[]) {
        return "Car name: " + val;
    }
}

public class Good {
    public static void main(String[] args) {
        Vehicle obj = new Car("Spark");
        System.out.print(obj.getName());
    }
}

정답

Vehicle name: Spark

반응형

해설

📌 1. main() 메서드 실행

public class Good {
    public static void main(String[] args) {
        Vehicle obj = new Car("Spark");
        System.out.print(obj.getName());
    }
}
  • new Car("Spark")를 통해 Car 객체를 생성합니다.
  • Car 생성자에서 setName("Spark")를 호출하여 Vehicle 클래스의 name 변수에 "Spark"를 저장합니다.
  • obj는 Vehicle 타입의 참조 변수이지만, 실제로는 Car 객체를 참조하고 있습니다.
  • obj.getName() 호출 시, Vehicle 클래스의 getName() 메서드가 호출됩니다.
    이유는 Vehicle 클래스에 이미 getName() 메서드가 구현되어 있으며, 이 메서드는 오버라이딩되지 않았기 때문입니다.

📌 2.Vehicle의 getName()

abstract class Vehicle {
    private String name;
    abstract public String getName(String val);
    public String getName() {
        return "Vehicle name: " + name;
    }
    public void setName(String val) {
        name = val;
    }
}
  • 이 메서드는 name 변수의 값을 사용해 문자열을 반환합니다.
  • name 변수에는 "Spark" 값이 저장되어 있으므로, **"Vehicle name: Spark"**를 반환합니다.

📌 3. 왜 Vehicle 클래스의 getName()이 호출되었나?

3.1 오버라이딩되지 않은 이유

      • Car 클래스에는 getName(String val)과 getName(byte[] val)이 오버로딩된 메서드로 정의되어 있지만, 매개변수 없는 getName()은 없습니다.
      • 따라서 부모 클래스(Vehicle)의 매개변수 없는 getName() 메서드가 호출됩니다.

3.2 오버로딩과 오버라이딩의 차이

    • 오버로딩:
      • 같은 이름의 메서드를 매개변수의 타입이나 개수를 다르게 정의.
      • 문제에서 Car 클래스의 getName(String val)과 getName(byte[] val)이 이에 해당.
    • 오버라이딩:
      • 부모 클래스의 메서드를 동일한 이름, 매개변수, 반환 타입으로 재정의.
      • 문제에서 매개변수 없는 getName() 메서드는 오버라이딩되지 않았기 때문에 부모 메서드가 호출됨.

📌 4. 핵심 요약

  1. 생성자
    • Car 클래스의 생성자는 부모 클래스의 setName() 메서드를 호출하여 name 변수 값을 "Spark"로 초기화.
  2. 오버라이딩
    • getName(String val)은 오버로딩된 메서드이므로, 매개변수 없는 getName()과는 관계가 없습니다.
    • 매개변수 없는 getName() 메서드는 오버라이딩되지 않았으므로 부모 클래스 메서드가 호출됩니다.
  3. 출력 결과
    • 부모 클래스의 getName() 메서드가 호출되어 "Vehicle name: Spark" 출력.

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형