교육, 학습/멀티캠퍼스_풀 스택

JAVA 문법 - 제어자(modifier)중 static의 특징, 자바를 run할 때 실행되는 순서

개발하는 경제학도 2021. 12. 31. 00:31

강의 소개

현재 수강하고 있는 멀티캠퍼스 지능형 웹서비스 풀스 텍 과정을 수강하며 적은 내용입니다.

교재로는 자바의 정석을 사용하고 있습니다.


제어자(modifier)

제어자(modifier)란

클래스, 변수, 메서드의 앞에 사용되어 추가적인 의미를 가진다.

크게 접근 제어자, 그 외로 나뉜다.

[각 제어 자별 사용 가능: O, 사용 불가능: X, 편의를 위해 몇 가지 제어자는 생략하였음]

  modifier 클래스 변수 메서드 생성자
접근 제어자
(사용범위 접근 제한)
public O O O O
protected X O O O
private X O O O
활용방법 static X O O X
final(상수) O O O X
abstract O X O X

 

static

static이란

static은 한 마디로 '공통'이며, '공유'된다는 것이다.

예를 들어, 서울시에서 인구조사를 한다고 가정하면 조사를 받은 인원 모두가 '서울시' 거주자일 것이다.

만약 조사할 때 수집하는 정보가 이름, 나이, 거주 시로 총 3가지라 한다면 아래와 같은 클래스가 필요할 것이다.

class 서울시민{
    String 이름;
    int 나이;
    String 거주시;
}

 

그런 뒤에 아래와 같이 조사를 받은 인구에 대한 각각의 인스턴스를 생성해줄 것이다.

서울시민 p1 = new 서울시민();
p1.이름 = "김영희";
p1.나이 = 22;
p1.거주시 = "서울시";
서울시민 p2 = new 서울시민();
p2.이름 = "박영배";
p2.나이 = 39;
p2.거주시 = "서울시";

class 서울시민 중에서 공통되는 변수는 코드에서 보이듯 거주 시임을 알고 있다.

 

이렇게 한 클래스에 동일한 값(여기선 서울시)을 계속 넣어주어야 하는 경우 static을 붙여주는 것이다.

class 서울시민{
    String 이름;
    int 나이;
    static String 거주시; // 이 클래스에서 공통되는 값을 가진 유일한 변수
}

 

이렇게 되면 static이 붙은 거주 시만 따로 메서드 영역에 보관되며, 서울시민 클래스를 인스턴스로 생성할 때마다 '공유'되어 꺼내진다.

이런 static이 붙은 변수를 '클래스 변수'라 한다.

 

반대로 static이 붙지 않은 변수들(이름, 나이)은 인스턴스 별로 서로 다른 주소를 가진다. 

이런 static이 붙지 않은 변수들은 '인스턴스 변수'라 한다.

 

클래스 변수(= static이 붙은 변수) 특징

1) 클래스.static변수명

인스턴스 변수들을 호출할 때는, '인스턴스. 인스턴수 변수'를 사용한다.

하지만 클래스 변수들을 호출할 때는, '클래스. 클래스 변수'를 사용할 수 있다.

(클래스에서 공통으로 사용되는 값에 static이 붙은 거였으니!)

p1.이름; // 인스턴스 변수의 호출
서울시민.거주지; // 클래스 변수의 호출

 

2) 객체 생성 이전에 메모리에 할당된다

static이 붙은 변수들(즉, 클래스 변수)은 인스턴스들(예제에서 p1, p2)이 생성되기도 전에 메모리에 할당되어 있다.

반면, 인스턴스 변수들(예제에서 이름, 나이)은 객체가 생성된 다음 할당된다.

 

3) 메모리에 할당되는 개수

클래스 변수들은 공통되는 값이다. 따라서 단 1개만 생성되어 계속 공유, 소환된다.

반면, 인스턴스 변수들은 객체가 생성될 때마다 메모리에 할당된다. 따라서 객체가 생성된 개수만큼 메모리에 할당된다.

 

4) 자바 파일이 run 되면 실행되는 순서

[1] static 변수 또는 메서드를 메모리에 할당

[2] main 메서드에서 new 키워드를 만나면 객체 생성

 

5) main 메서드에도 static이 붙어있다.

public static void main(String[] args)

이렇게 시작되는 main 메서드에도 static이 붙어있다.

run을 했을 때 가장 먼저 실행되어야 하는 main 메서드 특성상, static을 사용하여 가장 먼저 메모리에 할당하기 위함이다.

 

6) static 메서드는 static 변수만을 사용한다.

static 메서드 : static 변수(클래스 변수)만 사용 가능

인스턴스 메서드 : 인스턴스 변수, 클래스 변수 모두 사용 가능

이런 이유는 앞서 설명했듯 메모리에 할당되는 시기가 다르기 때문에 발생한다.

 

7) static은 final과 궁합이 좋다.

클래스 변수(= static 변수)는 공통으로 사용하는 값이다.

따라서 클래스 변수에 값을 다시 준다면, 모든 인스턴스가 변경된 값으로 수정된다.

서울시민.거주시 = "부산시"; 
p1.거주시 = "부산시"; // 1, 2줄 코드 모두 동일한 결과를 보여준다.

이렇게 부산으로 바꾸게 된다면, p1, p2 인스턴스 모두 거주 시가 부산으로 바뀌게 된다.

 

따라서 static 변수는 변경에 유의해야 한다.

이런 경우 상수로 지정하여 한 번 지정된 값을 바꾸지 못하게 하는 final을 사용하여

클래스 변수를 잘못된 값으로 바꾸는 것을 막을 수 있다. (필수는 아니지만 궁합이 좋다)

 

 

출처: 자바의 정석(남궁 성 저), 멀티캠퍼스