본문 바로가기

develop/Java

static 메서드

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