본문 바로가기
IT/JAVA

Java의 static과 final 키워드 활용법

by ohukohoh 2025. 2. 25.
728x90
반응형

Java에서 staticfinal 키워드는 중요한 역할을 합니다. static클래스 레벨의 멤버를 정의할 때 사용되며, final변경할 수 없는(상수) 값이나 상속 및 오버라이딩을 제한하는 데 사용됩니다. 각각의 개념과 활용법을 살펴보겠습니다.


1. static 키워드 활용법

static이란?

  • static 키워드는 클래스 레벨에서 공유되는 변수나 메서드를 선언할 때 사용됩니다.
  • 객체(instance) 생성 없이 클래스 이름을 통해 직접 접근할 수 있습니다.
  • 메모리에 한 번만 로드되므로 메모리 사용이 효율적입니다.

static 변수 (클래스 변수)

  • 클래스에 속하며 모든 객체가 공유합니다.
  • 객체마다 별도의 값을 가지는 인스턴스 변수와 달리, 모든 객체가 동일한 값을 참조합니다.

예제:

class Counter {
    static int count = 0; // static 변수
    
    Counter() {
        count++;
    }
}

public class Main {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
        Counter c3 = new Counter();
        
        System.out.println("총 객체 수: " + Counter.count);
    }
}

출력 결과:

총 객체 수: 3

🔹 Counter.count는 모든 객체에서 공유되므로 객체가 생성될 때마다 증가합니다.

static 메서드 (클래스 메서드)

  • 객체를 생성하지 않고 클래스 이름으로 직접 호출할 수 있습니다.
  • 인스턴스 변수나 메서드에 접근할 수 없습니다.

예제:

class MathUtils {
    static int add(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        int sum = MathUtils.add(5, 10); // 객체 생성 없이 호출 가능
        System.out.println("합계: " + sum);
    }
}

출력 결과:

합계: 15

🔹 static 메서드는 객체를 생성하지 않고도 사용할 수 있어 유틸리티성 메서드(예: Math.sqrt())를 정의할 때 많이 활용됩니다.

static 블록 (정적 초기화 블록)

  • 클래스가 로드될 때 한 번만 실행되는 코드 블록입니다.
  • static 변수를 초기화하는 데 유용합니다.

예제:

class Example {
    static int value;
    
    static {
        value = 10;
        System.out.println("Static 블록 실행됨. 초기 값: " + value);
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println("value: " + Example.value);
    }
}

출력 결과:

Static 블록 실행됨. 초기 값: 10
value: 10

🔹 static 블록은 클래스가 로드될 때 단 한 번 실행됩니다.


2. final 키워드 활용법

final이란?

  • final 키워드는 변경할 수 없는 값이나 기능을 제한할 때 사용됩니다.
  • final 키워드는 변수, 메서드, 클래스에 적용될 수 있습니다.

final 변수 (상수)

  • final 키워드가 붙은 변수는 한 번만 값을 할당할 수 있습니다.
  • 일반적으로 상수 값을 정의할 때 사용됩니다.

예제:

class Constants {
    static final double PI = 3.141592;
}

public class Main {
    public static void main(String[] args) {
        System.out.println("원주율: " + Constants.PI);
    }
}

출력 결과:

원주율: 3.141592

🔹 final 변수는 한 번 값이 설정되면 변경할 수 없습니다.

final 메서드 (오버라이딩 방지)

  • final 메서드는 하위 클래스에서 오버라이딩할 수 없습니다.
  • 중요한 동작이 변경되지 않도록 보호할 때 사용됩니다.

예제:

class Parent {
    final void display() {
        System.out.println("부모 클래스 메서드");
    }
}

class Child extends Parent {
    // 오버라이딩 불가능 (컴파일 오류 발생)
    // void display() { 
    //     System.out.println("자식 클래스 메서드");
    // }
}

🔹 final 메서드는 하위 클래스에서 변경할 수 없습니다.

final 클래스 (상속 방지)

  • final 클래스는 상속할 수 없습니다.
  • 보안 및 데이터 보호를 위해 변경할 수 없는 클래스를 만들 때 사용됩니다.

예제:

final class Vehicle {
    void run() {
        System.out.println("차량이 움직입니다.");
    }
}

// 컴파일 오류 발생: 상속 불가능
// class Car extends Vehicle {}

🔹 final 클래스는 다른 클래스에서 확장(상속)할 수 없습니다.


3. staticfinal을 함께 사용하는 경우

  • static final을 함께 사용하면 클래스 레벨의 변경 불가능한 상수가 됩니다.
  • 이러한 값은 일반적으로 대문자로 선언합니다.

예제:

class Config {
    static final int MAX_USERS = 100;
    static final String APP_NAME = "MyApplication";
}

public class Main {
    public static void main(String[] args) {
        System.out.println("최대 사용자 수: " + Config.MAX_USERS);
        System.out.println("앱 이름: " + Config.APP_NAME);
    }
}

출력 결과:

최대 사용자 수: 100
앱 이름: MyApplication

🔹 static final 변수는 프로그램이 실행되는 동안 변경할 수 없는 고정된 값입니다.


결론

  • static 키워드는 클래스 레벨에서 공유되는 변수와 메서드를 정의할 때 사용되며, 객체 생성 없이 호출할 수 있습니다.
  • final 키워드는 값을 변경할 수 없도록 제한하거나, 상속 및 오버라이딩을 방지하는 역할을 합니다.
  • static final을 함께 사용하면 클래스 레벨에서 변경할 수 없는 상수를 정의할 수 있습니다.

적절한 상황에서 staticfinal을 활용하여 효율적이고 안정적인 Java 프로그램을 작성해 보세요! 🚀

728x90
반응형