본문 바로가기

Java

Java static / non-static

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

 

static / non-static


static은 언제 사용할까요?

1. 전역 변수, 전역 함수를 만들 때 사용

2. 클래스에서 관리하는 변수, 함수를 만들 때 사용

 

우선 위와 같이 static이 사용되는 상황에 대해서 인지하고, Java의 메모리 구조를 이해하면

static을 완벽하게 이해할 수 있습니다.

 

아래 코드를 보겠습니다.

public class StaticExam {

    public static int sint;
    public static void setSint(int input) {
        sint = input;
    }
    
    public int mint;
    public void setMint(int input) {
        mint = input;
    }
    
    public static void main(String[] args) {
    	StaticExam.setSint(1);
        StaticExam staticExam = new StaticExam();
        staticExam.setMint(1);
    }
}

위 코드를 메모리 그림으로 옮겨보면 아래와 같습니다.

 

앞서 클래스 인스턴스에 대해 배웠을 때는 code, stack, heap 메모리에 대해서만 다뤘습니다.

static은 static 변수들이 저장되는 메모리 공간이 따로 있습니다.

 

static과 code 메모리는 JVM에 의해서 클래스가 접근되는 순간 생성됩니다. (단 1개)

즉 위의 main함수에서는 StaticExam.setSint(1); 문장이 실행되는 순간 static 메모리와 code 메모리가 로딩되는 것입니다.

heap 메모리는 당연하게도 new를 통해 생성되고 나서 로딩됩니다. (여러 개가 될 수 있음)

 

위와 같은 메모리 구조와 생성시간을 갖기 때문에 당연하게도 new를 통해 클래스 인스턴스가 생성되지 않았을 때도

static 변수와 메서드는 사용이 가능합니다.

 

이런 static의 특성 때문에 앞서 말했듯

1. 전역 변수, 전역 함수를 만들 때 사용

2. 클래스에서 관리하는 변수, 함수를 만들 때 사용

이럴 때 사용하는 것입니다.


 

사용법


지금까지는 static의 개념에 대해서 알아보았습니다. 이제 사용법에 대해서 알아보겠습니다.

 

1. 기본 사용법

    public static void main(String[] args) {
        //1번 방식
        StaticExam.setSint(1);
        
        //2번 방식
        StaticExam s = new StaticExam();
        s.setSint(3);
    }

위에서 보면 알 수 있듯이 두 가지 사용법이 있습니다.

1번 방식은 클래스 이름(식별자)으로 접근하는 방식,

2번 방식은 인스턴스를 통해 접근하는 방식입니다.

 

static을 사용할 때는 1번 방식을 지향하고, 2번 방식은 지양해야 합니다.

왜냐하면 2번 방식은 static의 특성을 잘 살리지 못한 방식이기 때문입니다.

 

애초에 static을 사용하는 이유가 클래스 차원에서 변수, 함수를 관리하고 싶어 사용하는 것인데

개별 인스턴스에서 접근하게 되면 그 의미가 흐려집니다.

 

2. static의 기준

그렇다면 어떤 변수, 함수를 static하게 만들어야 할까요?

변수의 경우에는 각 인스턴스별로 상이한 특성이 아닌 클래스 전체적인 특성을 static으로 선언해주면 좋습니다.

메서드의 경우에는 메서드 내부에서 멤버 변수 (필드)를 사용하지 않을 때 static으로 선언해주면 좋습니다.

 

여기까지 static 개념과 사용법에 대해서 알아보았습니다.

'Java' 카테고리의 다른 글

(상속) 부모 클래스 접근  (0) 2021.05.07
자바 상속 기본  (0) 2021.05.07
Java의 패키지와 접근 지정자  (0) 2021.05.06
생성자  (0) 2021.04.13
클래스와 객체(미완성)  (0) 2021.04.06