복습.

Q. 정적과 동적 정말 많이 쓰이는데 난 과연 명확하게 알고 있는가 ?

A. 정적 동적은 여러가지 의미로 쓰이며 여러 분야에서 활용중이다. 그래서 명확하게 표현은 불가능하나, 큰 틀은 같다.

  1. 타입시스템 (언어) 정적 : 변수의 데이터 타입이 컴파일 시간에 결정되며, 컴파일러가 코드를 검사하여 타입 오류를 찾을 수 있다. (자바, 씨, 씨플플) 동적 : 변수의 데이터 타입이 실행 시간에 결정되며, 타입 오류는 실행중 발생가능. (파이썬, js)
  2. 할당 및 연결 정적 : 메모리 공간이 컴파일 시간에 할당되고 해제되며, 크기가 고정되어 있습니다. C 언어에서 정적 배열은 이에 해당합니다. 동적 : 모리 공간이 실행 시간에 동적으로 할당되고 해제되며, 크기가 가변적입니다. 동적 할당은 주로 힙(heap)에서 이루어집니다. C++의 newdelete 또는 C의 mallocfree 함수를 사용하여 할당됩니다.

정적 필드

정적 필드(Static Field)는 클래스의 모든 인스턴스가 공유하는 데이터 멤버를 의미합니다. 정적 필드는 static 키워드로 선언되며, 클래스의 모든 객체 간에 동일한 값이 유지되어야 하는 경우에 사용됩니다.

예를 들어, 다음은 정적 필드를 가진 간단한 자바 클래스의 예입니다:

public class ExampleClass {
    // 정적 필드
    static int staticField = 10;

    // 인스턴스 변수
    int instanceField;

    // 생성자
    public ExampleClass(int instanceFieldValue) {
        this.instanceField = instanceFieldValue;
    }

    public static void main(String[] args) {
        // 객체 생성
        ExampleClass instance1 = new ExampleClass(20);
        ExampleClass instance2 = new ExampleClass(30);

        // 정적 필드에 접근 (클래스명으로 접근)
        System.out.println("Static Field: " + ExampleClass.staticField);

        // 각 객체의 인스턴스 변수에 접근
        System.out.println("Instance 1 Field: " + instance1.instanceField);
        System.out.println("Instance 2 Field: " + instance2.instanceField);
    }
}

위의 코드에서 **staticField**는 클래스 **ExampleClass**에 속하며, 클래스의 모든 객체 간에 값을 공유합니다. 반면에 **instanceField**는 각 객체에 속하며, 객체마다 다른 값을 가질 수 있습니다.

정적 필드는 주로 상수, 공유 데이터, 또는 클래스 수준의 설정과 같은 경우에 활용됩니다. 클래스 변수로서의 특성 때문에 클래스가 로드될 때 생성되며, 클래스의 모든 인스턴스가 종속되어 공유하게 됩니다.

자바에서 "정적(Static)"과 "동적(Dynamic)"은 여러 맥락에서 사용되며, 주로 타입 시스템과 메모리 할당/연결 관점에서 설명됩니다.

1. 정적(Static) 타입 시스템

자바는 정적 타입 언어입니다. 이는 변수의 데이터 타입이 컴파일 시간에 결정되고, 컴파일러가 코드를 분석하여 타입 오류를 찾을 수 있다는 것을 의미합니다.

예를 들어

int x = 5; // 정적 타입 선언

컴파일러는 변수 x가 정수형(int)임을 알고 있으며, 컴파일 시에 타입을 확인하므로 잘못된 타입의 값을 할당하려고 하면 컴파일 오류가 발생합니다.

2. 동적(Dynamic) 할당/연결

2.1. 메모리 할당