본문 바로가기

카테고리 없음

자바에서 static 키워드의 의미와 사용법에 대해 알아보자.

1. static 키워드의 의미

Static 키워드는 자바에서 변수, 메서드, 블록에 사용되며 다음과 같은 의미를 가지고 있습니다.

  • 클래스 변수: static으로 선언된 변수는 클래스 수준의 변수로서, 해당 클래스의 모든 인스턴스들에 의해 공유됩니다.
  • 정적 메서드: static으로 선언된 메서드는 클래스 수준의 메서드로서, 특정 인스턴스에 속하지 않고 클래스 이름을 통해 직접 호출됩니다.
  • 정적 블록: static으로 선언된 블록은 클래스가 로드될 때 실행되는 블록으로서, 클래스 변수의 초기화 또는 클래스 수준의 작업 수행에 사용됩니다.

Static 키워드는 객체를 생성하지 않고도 해당 멤버들에 직접 접근할 수 있으며, 메모리의 효율적인 사용과 코드의 가독성 향상을 위해 사용됩니다.

2. static 변수와 메서드의 사용법

2.1 Static 변수

Static 변수는 클래스 수준의 변수로서, 모든 인스턴스들에 의해 공유됩니다. static 변수는 해당 클래스로 생성된 모든 객체들이 동일한 값을 공유하게 됩니다.

public class Example {
    static int count = 0;

    public Example() {
        count++;
    }

    public static void main(String[] args) {
        Example obj1 = new Example();
        Example obj2 = new Example();
        Example obj3 = new Example();

        System.out.println("Count: " + Example.count); // 3
    }
}

위의 예시에서 count 변수는 static으로 선언되었으므로, Example 클래스로 생성된 모든 객체들에 의해 공유됩니다. 따라서 obj1, obj2, obj3를 생성할 때마다 count 변수가 증가되고, 마지막에 count 값을 출력하면 3이 됩니다.

2.2 Static 메서드

Static 메서드는 클래스 수준의 메서드로서, 특정 인스턴스에 속하지 않고 클래스 이름을 통해 직접 호출됩니다. static 메서드는 인스턴스 변수에 접근할 수 없고, 오직 static 변수나 다른 static 메서드만 접근할 수 있습니다.

public class Example {
    int num;
    static String name = "John";

    public static void display() {
        System.out.println("Name: " + name);
    }

    public void setNum(int num) {
        this.num = num;
    }

    public void printNum() {
        System.out.println("Num: " + num);
    }

    public static void main(String[] args) {
        Example example = new Example();
        example.setNum(5);
        example.printNum(); // Num: 5
        Example.display(); // Name: John
    }
}

위의 예시에서 display 메서드는 static으로 선언되어 클래스 이름을 통해 직접 호출할 수 있습니다. 그리고 setNum과 printNum 메서드는 인스턴스 메서드로서, 객체를 생성하여 접근해야 합니다.

3. static 블록의 활용 예시

Static 블록은 클래스가 로드될 때 실행되는 블록으로서, 클래스 변수의 초기화 또는 클래스 수준의 작업 수행에 사용됩니다. 다음은 static 블록의 활용 예시입니다.

public class Example {
    static int maxNum;
    static int minNum;

    static {
        maxNum = Integer.MIN_VALUE;
        minNum = Integer.MAX_VALUE;
    }

    public static void findMinMax(int[] nums) {
        for (int num : nums) {
            if (num > maxNum) {
                maxNum = num;
            } 
            if (num < minNum) {
                minNum = num;
            }
        }
    }

    public static void main(String[] args) {
        int[] nums = { 3, 1, 5, 7, 2 };

        findMinMax(nums);

        System.out.println("Max: " + maxNum); // 7
        System.out.println("Min: " + minNum); // 1
    }
}

위의 예시에서 static 블록은 maxNum과 minNum 변수를 초기화하는 역할을 수행합니다. static 블록은 클래스가 로드될 때 단 한 번 실행되므로, maxNum과 minNum은 초기화된 상태로 사용됩니다.

main 메서드에서는 배열 nums를 파라미터로 전달하여 findMinMax 메서드를 호출하고, 해당 메서드에서는 배열 내의 최대값과 최소값을 찾아 maxNum과 minNum을 업데이트합니다. 마지막으로 maxNum과 minNum 값을 출력하면 7과 1이 출력됩니다.