Hyeonuk_.log

알고 사용하자 Static이란 본문

Dev_.log/Java

알고 사용하자 Static이란

Hyeonuk_. 2022. 2. 20. 06:00

평소 Static에 대해 제대로 알지 못하고 사용한 것 같아 이번 기회에 한번 정리하고 넘어가려고 한다.
static은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다. 인스턴스변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만, 클래스변수(static멤버변수)는 인스턴스에 관계없이 같은 값을 갖는다. 그 이유는 하나의 변수를 모든 인스턴스가 공유하기 때문이다.

static이 붙은 멤버변수와 메서드, 그리고 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이기 때문에 인스턴스를 생성하지 않고도 사용할 수 있다. 인스턴스 메서드와 static 메서드의 근본적인 차이는 메서드 내에서 인스턴스 멤버를 사용하는가의 여부에 있다.

static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭

제어자
대상
의미
static
멤버변수
- 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
- 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
- 클래스가 메모리에 로드될 때 생성된다.
메서드
- 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
- static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.
초기화 블럭
- 클래스가 메모리에 로드될 때 단 한번만 수행되면, 주로 클래스 변수(static 변수)를 초기화 하는데 사용된다.

 

class Person {

    static String name = "Jack";
    static int age = "20";

    static {
        // static 변수의 복잡한 초기화 수행, 클래스가 메모리에 로드될 때 1번만 수행
    }

    static String introduce() { // 클래스의 static 메서드
        return "my name is " + name + ", age is " + age;
    }
}
 

static이 붙으면 일단 클래스가 로드되면서 생성이 된다. 이 때문에 인스턴스가 초기화 되면서 생성되는 멤버변수를 클래스(static)메서드에서 사용할 수 없다

static 변수의 초기화 순서
기본값 -> 명시적 초기화 -> static초기화 블럭

인스턴스변수
기본값 -> 명시적 초기화 -> 인스턴스 초기화 블럭 -> 생성자

 

추가적인 정리...

1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
- 생성된 각 인스턴스는 독립적이기 때문에 각 인스턴스의 변수는 서로 다른 값을 유지한다. 그러나 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서 클래스 변수로 정의해야한다.

2. 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 클래스가 메모리에 로드될 때, 이미 로드되지 때문이다.

3. 앞서 말했듯이, 클래스 메서드는 인스턴스 변수를 사용할 수 없다.

4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.

static에 대해 두서없이 정리를 했다.

조금이나마 도움이 되었길 바라면 나부터 제대로 사용하도록 하자.

아래의 참고 자료에 자세히 기재가 되어 있으니 참조해보기 바란다.

 

참고

https://vaert.tistory.com/101

자바의정석 3rd Edition

 

 

 

 

 

 

Comments