static 메서드
(정적 메서드)
보통 메서드 모양
public (리턴타입) 메서드명(){}
static 메서드 모양은
public static (리턴타입) 메서드명(){}
데이터타입(리턴타입) 앞에 static 키워드를 붙혀 클래스가 메모리에
로딩될 때 함께 로딩된다. 이 역시도 인스턴스 생성과 무관하며 클래스명만으로도 접근 가능하다.
(인스턴스 생성 전에 먼저 메모리에 로딩됨)
<주의 사항>
인스턴스 생성 시점에서 메모리에 로딩되는 대상들은
static 메서드 내에서 접근 불가능.
1. 인스턴스 멤버에 접근 불가
2. 레퍼런스 this 사용 불가
=> static 키워드가 붙은 메서드가 로딩되는 시점과 일반 인스턴스들이 로딩되는 시점이 다르다는
점을 유념해야 함!
static 메서드도 참조변수를 통해서 호출할 수 있지만 클래스명을 이용해 호출하는 것이 더 낫다
1. 인스턴스 멤버에 접근 불가 예시
class StaticMethod{
private int normalVar = 10;
private static int staticVar = 20;
//인스턴스 메서드 정의
//=> 인스턴스가 생성될 때 함께 로딩됨
public void normalMethod(){ //인스턴스 메서드
System.out.println("일반 메서드에서 인스턴스 변수" + normalVar);
System.out.println("일반 메서드에서 static 변수" + staticVar);
staticMethod();
//인스턴스 메서드 내에서는 static 변수 및 메서드 접근 가능하다.
}
public static void staticMethod(){ //static 메서
System.out.println("static 메서드에서 인스턴스 변수" + normalVar); //컴파일 에러
System.out.println("static 메서드에서 static 변수" + staticVar);
//static 메서드가 로딩되는 시점에서 인스턴스 변수 및 메서드는 로딩x
normalMethod(); //컴파일 에러!
}
//sta
}
2. 레퍼런스 this 사용 불가
class StaticMethod2{
private int num = 10;
private static int staticNum = 20;
//앞에 private 접근 제한자를 붙혀서 외부에서 접근 못하도록 함
//그래서 Getter, Setter 로 접근해야함
public int getNum(){
return num;
}
public static int getStaticNum(){
return staticNum;
}
public void setNum(int num){
this.num = num;
//인스턴스 메서드의 로컬변수와 클래스의 인스턴스 변수 이름이 같으므로
//앞에 this를 붙혀서 구분해야함
}
public void setStaticNum(int staticNum){
this.staticNum = staticNum //오류!!!
//static변수에서는 this 대신에 클래스명을 사용해 멤버변수에
//접근해야 한다
//=>이유! static메서드는 인스턴스가 생성되기 전 이미 로딩되기에
//인스턴스 주소가 저장되는 this는 생성되기 전 상태임
StaticMethod2.staticNum = staticNum;
}
}
'develop > Java' 카테고리의 다른 글
상속(Inheritance) (0) | 2021.03.01 |
---|---|
싱글톤 디자인 패턴(Singleton Design Pattern) (0) | 2021.03.01 |
static (0) | 2021.02.23 |
코드의 재사용 (0) | 2021.02.18 |
this 키워드 (0) | 2021.02.17 |