정보시스템감리사/기출문제_21년_22회

32_Java_컴파일오류

론리나잇 2025. 4. 17. 00:29

코드 분석

public class Test {
    private int a = 0;
    private static int count = 0;

    public int getA() { return a; }
    public static int getCount() { return count; }

    public static void test() {
        int sum = 0;
        sum = a;        // (가)
        sum += count;   // (나)
        System.out.println(getA());    // (다)
        System.out.println(getCount()); // (라)
    }
}

컴파일 오류가 발생하는 부분: (가) sum = a;

이유:

  • a인스턴스 변수(private int a)로, 객체를 생성해야 접근할 수 있습니다.
  • 하지만 test() 메서드는 정적 메서드(static)로 선언되어 있어 인스턴스 없이 클래스 수준에서 호출됩니다.
  • 정적 메서드에서는 인스턴스 변수나 메서드에 직접 접근할 수 없습니다. a에 접근하려면 Test 객체를 먼저 생성하고 그 객체를 통해 접근해야 합니다.

나머지 코드 분석

  • (나) sum += count;
    countstatic 변수이므로 정적 메서드 test()에서 문제없이 접근 가능합니다. 오류 없음.
  • (다) System.out.println(getA());
    getA()인스턴스 메서드입니다. 정적 메서드 test()에서 호출하려면 Test 객체를 생성한 후 해당 객체로 getA()를 호출해야 합니다. 따라서 여기에서도 컴파일 오류가 발생합니다.
  • (라) System.out.println(getCount());
    getCount()정적 메서드(static)이므로 test()에서 문제없이 호출 가능합니다. 오류 없음.

오류 수정 방법

test() 메서드에서 agetA()를 사용하려면 Test 객체를 생성해야 합니다. 수정된 코드는 다음과 같습니다:

public class Test {
    private int a = 0;
    private static int count = 0;

    public int getA() { return a; }
    public static int getCount() { return count; }

    public static void test() {
        Test obj = new Test(); // 객체 생성
        int sum = 0;
        sum = obj.a;        // (가) 객체를 통해 접근
        sum += count;       // (나)
        System.out.println(obj.getA());    // (다) 객체를 통해 호출
        System.out.println(getCount());    // (라)
    }
}

질문: 컴파일 오류 없이 실행될 때 (가) ~ (라) 중에서 참조 오류가 발생하지 않는 부분은?

  • (가): sum = a → 컴파일 오류 (인스턴스 변수 a를 정적 메서드에서 직접 접근).
  • (나): sum += count → 정상. countstatic 변수이므로 참조 오류 없음.
  • (다): System.out.println(getA()) → 컴파일 오류 (인스턴스 메서드 getA()를 정적 메서드에서 직접 호출).
  • (라): System.out.println(getCount()) → 정상. getCount()static 메서드이므로 참조 오류 없음.

답: (나), (라)

따라서 정답은 ② 나, 라입니다.

다만, 아마도 하나의 코드라인이 컴파일 오류면 전체가 컴파일이 안되므로 이의제기가 들어가서 모두 정답처리가 된 문제로 보입니다.

추가 설명

  • Java에서 static 메서드나 변수는 클래스 수준에서 동작하며, 객체 생성 없이 접근 가능합니다.
  • 반면, 인스턴스 변수나 메서드는 특정 객체에 속하므로 객체를 생성한 후에만 접근할 수 있습니다.
  • 위 코드에서 agetA()를 사용하려면 Test 객체를 생성해야 하며, 그렇지 않으면 컴파일 오류가 발생합니다.