1. 동적 로딩


# 프로그램을 실행할 때, 필요할 때마다 동적으로 메모리를 생성하고, 필요없는 메모리는 자동으로 메모리에서 소멸시킨다.


1) 대표적인 예: Java (웹과 같은 유동적, 가변적인 프로그램)

2) 장점

- 필요한 기능만 메모리에 불러와 사용하기 때문에, 큰 프로그램도 작은 메모리에서 실행이 가능하다.


3) 단점

- 프로그램의 실행 속도가 느려질 수 있다.

* 때문에 static 키워드를 사용하는 것이다. 

  정적 로딩처럼 바로 메모리에 올릴 수 있도록 도와주기 때문이다. 



2. 정적 로딩


# 프로그램을 실행할 때, 모든 실행파일이 메모리에 로드된다.


1) 대표적인 예: C언어 (자주 변하지 않는 소프트웨어 등)

2) 장점

- 모든 기능이 메모리에 존재하므로, CPU가 필요로하는 기능을 빠르게 메모리에서 가져와 사용할 수 있다.


3) 단점

- 메모리를 많이 차지한다. 



3. static 키워드




# 선언된 자원들을 고정시키는 기능

(1) static 키워드를 사용해서 선언한 자원들은 JVM 메모리 안에 오직 하나만 생성된다. 

(2) 메모리 로딩 과정에서 static으로 선언된 자원들은 인스턴스화 과정 없이 실행 가능한 형태로 메모리에 바로 생성된다. 

(3) static으로 선언된 모든 자원들은 클래스 로딩시에 생성되고, JVM이 종료되면 그 값은 메모리에서도 종료된다.

(4) static 키워드가 없는 메소드를 사용하기 위해서는 반드시 클래스를 인스턴스화 해야 메모리에 실행 가능한 상태가 된다. 

즉, new 키워드를 이용하여 객체를 생성하고 객체에 대한 접근을 해야 실행할 수 있다. 

그러므로 JVM 메모리에는 객체의 숫자만큼 인스턴스화한 메소드가 존재한다. 


1) static 변수

- 변수의 값을 여러 객체들이 공유할 때 사용


2) static 메서드

- 메서드의 기능이 프로그램에서 자주 사용될 때, static 키워드를 붙이면 실행 속도를 높일 수 있다. 

- ex. public static void main(String[] args)


3) static 메서드 내에서는 static 멤버(변수, 메서드)만 호출 가능하다. 

4) instance 메서드 내에서는 모든 멤버(변수, 메서드)를 호출 가능하다. 


5) static 키워드의 특징

(1) static 키워드는 메소드와 클래스 속성에 대해서만 선언할 수 있다. 

(2) static 키워드로 선언된 자원은 객체를 생성하지 않고 사용할 수 있다.

(3) static 메소드는 오직 static 변수와 메서드만 접근할 수 있다.

(4) 모든 객체에서 공통적으로 사용되는 메소드 혹은 클래스 속성에 대해서 static 키워드를 사용



# static 사용 예제(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package staticex;
 
public class StaticTest02 {
    
    static int x = 100;
    static int y = x;
    int z = x;
    
    int a = 100;
    // static int b = a;
    static int c = new StaticTest02().a;
    
    static void showInfo() {
        // System.out.println(a);
        System.out.println(x);
    }
}

cs

# 설명 

Line 10: static 변수는 바로 메모리에 올라가는데, 인스턴스 변수 a는 인스턴스화를 거쳐야하기 때문에 static 변수에 대입할 수 없다. 

Line 11: 대신 일회용 메모리 개념으로는 사용할 수 있는데, 클래스를 new를 통해 인스턴스화 한 후 a값을 참조하는 형식이다. 

Line 14: 클래스(static) 메서드도 마찬가지로 바로 메모리에 올라가는데, 인스턴스화를 거쳐야하는 a값을 바로 참조할 수 없다. 

Line 15: 클래스(static) 메서드에서는 클래스(static) 변수만 사용할 수 있다. 



# static 사용 예제(2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package staticex;
 
public class StaticEx01 {
 
    // static 키워드로 선언된 클래스 변수들 
    static int RT_SUCCESS;
    static int RT_ERROR;
    static String ERR_MSG;
    
    // static 초기화 블록 
    static {
        RT_SUCCESS = 0;
        RT_ERROR = -1;
        ERR_MSG = "Found error";
    }
    
    // static 메소드 
    public static String getCurrentTime() {
        return "getCurrentTime()";
    }
    
    public static void main(String[] args) {
 
        System.out.println("RT_SUCCCESS: " + StaticEx01.RT_SUCCESS);
        System.out.println("RT_ERROR: " + StaticEx01.RT_ERROR);
        System.out.println("ERR_MSG: " + StaticEx01.ERR_MSG);
        
    }
}
cs

# 설명

Line 24~26: 클래스 변수를 참조하기 위해서는 '클래스명.클래스변수' 로 사용한다.