<객체와 상관 없이!! 객체 생성 이전에 로드되는!!>
-static 멤버들을 객체의 생성 없이 호출할 수 있는 것은 객체 생성 이전에 메모리가 할당되기 때문입니다.
-즉 객체 생성 이전에 클래스 로더에 의해 클래스가 로딩될 때 메모리에 올라가기 때문에 객체를 만들기 전에 클래스 이름만으로도 호출이 가능합니다.
그렇기 때문에 이미 메모리에 올라간 static 멤버가 아직 메모리에 올라가지 않은, static이 아닌 멤버를 호출하는 것은 불가능하다.
ex) Class A{
int a; //
static int c; //클래스 변수
static void abc(){
int b = a;
} //Error! 불가능.
}
int a; //
static int c; //클래스 변수
static void abc(){
int b = a;
} //Error! 불가능.
}
ex)
System.out.println() //System클래스에 있는 out이라는 객체를 가져와서, out이라는 객체의 println()이라는 함수를 쓰겠다.
System.out.println() //System클래스에 있는 out이라는 객체를 가져와서, out이라는 객체의 println()이라는 함수를 쓰겠다.
1, static 메서드 - static 변수 OK
클래스 멤버변수 X
2. 클래스 멤버 메서드 - static 변수 OK
class 멤버 변수 O.K
<static 키워드의 정리>
1. static 멤버는 클래스 변수, 클래스 메소드라고 불리웁니다.
2. 객체 생성없이 [클래스이름.멤버이름]으로 static 멤버를 호출할 수 있습니다.
3. 그 클래스로부터 만들어진 모든 객체들이 static 멤버를 공유합니다.
4. static 멤버는 객체 생성 이전에 클래스가 로딩될 때, 메모리에 먼저 올라갑니다.
5. static 멤버는 static이 아닌 멤버를 직접 호출할 수 없습니다.
6. this와 함께 쓰일 수 없습니다.
7. 부모 클래스의 static 메소드는 메소드 오버라이딩이 안됩니다.
1. static 멤버는 클래스 변수, 클래스 메소드라고 불리웁니다.
2. 객체 생성없이 [클래스이름.멤버이름]으로 static 멤버를 호출할 수 있습니다.
3. 그 클래스로부터 만들어진 모든 객체들이 static 멤버를 공유합니다.
4. static 멤버는 객체 생성 이전에 클래스가 로딩될 때, 메모리에 먼저 올라갑니다.
5. static 멤버는 static이 아닌 멤버를 직접 호출할 수 없습니다.
6. this와 함께 쓰일 수 없습니다.
7. 부모 클래스의 static 메소드는 메소드 오버라이딩이 안됩니다.
main() 메소드
main()메소드가 static으로 정의되어져야 하는 이유
main()메소드는 JVM이 프로그램을 시작하는 시작점이기 때문에 main()을 가지고 있는 클래스가 객체를 생성하는 것과 상관없이 무조건 실행되어야 하기 때문입니다.
main()메소드의 접근 지정자가 public 인 이유
클래스가 어느 위치에 있건 간에 JVM에서 접근하려면 가장 넓은 범위의 접근 범위를 설정해야 하기 때문입니다.
static 이니셜라이저(Initializer)
static 이니셜라이저(Initializer)란, 메소드 바깥 쪽에 다음과 같은 형태로 static 코드 블록을 만드는 것을 의미합니다.
public class MyClass { static { } //멤버 변수 정의 //멤버 메소드 정의 } |
- static 코드 블록 안의 코드는 클래스가 로딩될 때 단 한번만 실됩니다. - static형식으로 초기화 됨. |
'Java' 카테고리의 다른 글
표현언어(Expression Language) (0) | 2011.01.27 |
---|---|
파일과 입출력 API (0) | 2011.01.11 |
java.util 패키지(유틸리티 API) (0) | 2011.01.11 |
추상클래스 / 인터페이스 (0) | 2011.01.06 |
instanceof연산자 (0) | 2011.01.05 |