public class Person {
public static final String name = "KimDongWoo";
public static void main(String[] args) {
System.out.println(this.name);
// 출력 : KimDongWoo
}
}
public class Main {
public static void main(String[] args) {
사람 a사람1 = new 사람();
a사람1.이름 = "홍길동";
a사람1.나이 = 22;
a사람1.자기소개();
// 출력 : 저는 22살 홍길동 입니다.
사람 a사람2 = new 사람();
a사람2.이름 = "홍길순";
a사람2.나이 = 25;
a사람2.자기소개();
// 출력 : 저는 25살 홍길순 입니다.
a사람1.자기소개();
// 출력 : 저는 22살 홍길동 입니다.
}
}
// static은 static끼리만 접근가능 / 그 반대도 마찬가지
// 또한 static은 본사(클래스)직원이기에 객체로 만들면 내부에 생성되지 않음
// 그래서 static으로 필드랑 메서드만 만들어진 클래스에 대한 객체를 만들면
// ex) 사람 a사람1 = new 사람(); 일 때 a사람1.나이라는 필드는 없다
// 그러니까 자바 내부적으로 자연스럽게 클래스(본사)를 찾게되고 거기에 있는지 확인 후 그 값을 사용
// 즉, static int 나이; 는 본사직원이기에 a사람1.나이 = "10" 이 아니고
// 사람.나이 = "10"이 된다.
class 사람 {
static int 나이;
static String 이름;
static void 자기소개() {
System.out.println("저는 " + 나이 + "살 " + 이름 + " 입니다.");
}
}
사람 클래스를 사용하여 객체를 만들면, 그 객체 안에는 static이 붙지 않는 메소드가 생긴다.
예시 1
A a = new A(); → A클래스의 객체 만들어 a변수에 담음.
a.introduce(); → 본사가 아닌 대리점의 메서드인 introduce()를 사용
결과 1
그럼 반대로 해보면 어떨까?
예시 2.
A a = new A()와 a.introduce()는 그대로 두고 필드엔 static을 빼고, 메서드엔 static을 붙였다.
그 결과 2.
번역 : java: 정적이 아닌 변수 정적 컨텍스트에서 참조할 수 없습니다
이러한 결과가 나오는 이유