certification/정보처리기사

[2023년 3회] JAVA 오류 발생 라인

gaing 2025. 4. 9. 21:23

📌 문제

다음은 오류가 발생하는 JAVA 프로그램이다. 프로그램을 분석하여 오류가 발생하는 라인을 쓰시오.

class Person {
    private String name;

    public Person(String val) {
        name = val;
    }

    public static String get() {
        return name;
    }

    public void print() {
        System.out.println(name);
    }
}

public class Test {
    public static void main(String[] args) {
        Person obj = new Person("Kim");
        obj.print();
    }
}

 

☑️ 정답

7번째 라인

return name;  // 컴파일 오류: non-static variable name cannot be referenced from a static context

 

📝 풀이 - 오류 발생 라인

public static String get() {
    return name;  // 오류 발생
}
  • static 메서드 안에서 name이라는 변수를 사용하려고 하자 컴파일 오류가 발생한다.
  • static 메서드: 객체가 없어도 호출할 수 있는 공용 메서드이다.
  • name: 인스턴스 변수로, 객체가 생성되어야만 접근할 수 있다.
  • 아직 객체가 만들어지지도 않았는데 그 객체 안에 있는 name이라는 값을 쓰려고 하니까 오류가 발생하는 것이다.

 

📝 풀이 - 해결 방법

public String get() {  // static 제거
    return name;
}
  • static을 제거하고 name 변수에 접근하려면 객체를 통해 메서드 호출해야 한다.
Person p = new Person("Kim"); // 객체 생성
System.out.println(p.get()); // "Kim" 출력
  • get() 메서드를 인스턴스 메서드로 변경하면 이제 객체를 생성한 후 get() 메서드를 호출할 수 있다.

✏️  개념 정리 메모

  • static 메서드와 인스턴스 변수의 차이
    • static은 클래스 수준에서 공유되는 멤버로, 객체를 만들지  않고 클래스명으로 직접 접근할 수 있다.
    • 반면, 인스턴스 변수는 객체가 생성되어야만 존재하고 객체마다 각기 다른 값을 가질 수 있다.
    • static 메서드는 객체 없이 호출되기 때문에 인스턴스 변수에 접근할 수 없으며 객체를 통해서만 접근이 가능하다.
  • static 메서드에서 this 키워드 사용 불가
    • static 메서드가 객체 없이 호출될 수 있기 때문에 this 키워드를 사용할 수 없다.
    • this는 현재 객체를 참조하는 키워드로, 객체가 존재해야 사용할 수 있다.
    • static 메서드는 객체와 관련 없이 클래스 자체에서 호출되므로 this를 사용할 수 없다.