공부 기록/Java with ChatGPT

[Java/ChatGPT] Day 16: static, final, 상수, 유틸리티 클래스

dev.jelee 2025. 6. 25. 00:50

[ 학습 목표 ]

  1. static, final 키워드의 개념과 차이를 이해하고 사용할 수 있다.
  2. 클래스에 공통적으로 쓰이는 데이터를 상수(static final)로 만들 수 있다.
  3. 객체 생성 없이 사용하는 유틸리티 메서드를 만들 수 있다.

[ 이론 ]

1. static : 클래스 변수 / 클래스 메서드

  • 인스턴스가 아니라 클래스 자체에 속한 변수와 메서드
  • static 키워드는 메모리에 딱 1번만 올라감
  • 모든 인스턴스가 같은 공간을 공유함
public class Counter {
    static int count = 0;

    Counter() {
        count++;
        System.out.println("현재 객체 수: " + count);
    }
}
public class Main {
    public static void main(String[] args) {
        new Counter(); // 1
        new Counter(); // 2
        new Counter(); // 3
    }
}

 

2. fianl : 변경 불가 (상수 or 상속 제한 등)

public class Example {
    final int MAX_USERS = 100;

    void tryChange() {
        // MAX_USERS = 200; // ❌ 오류! final 변수는 한 번만 값 설정 가능
    }
}

 

3. static final : 상수 (전역 고정값)

public class Constants {
    public static final double PI = 3.14159;
    public static final String APP_NAME = "MyApp";
}

 

사용 :

System.out.println(Constants.PI);
System.out.println(Constants.APP_NAME);

 

4. static 메서드 : 유틸리티 클래스 만들기

public class MathUtil {
    public static int square(int x) {
        return x * x;
    }

    public static int max(int a, int b) {
        return a > b ? a : b;
    }
}

 

사용 :

int result = MathUtil.square(5);  // 25
int bigger = MathUtil.max(3, 10); // 10

 

5. 핵심 요약

키워드 의미 사용 예
static 클래스 소속 공유 데이터, 유틸 함수
final 값 변경 불가 상수, 상속 제한
static final 전역 상수 MAX_SPEED, PI, VERSION 등

[ 실습 ]

✏️ 오늘의 실습 과제

1. MathUtil 클래스를 만들고 다음 메서드를 static으로 작성:
- add(int a, int b)
- subtract(int a, int b)
- multiply(int a, int b)
- divide(int a, int b)

2. Constants 클래스를 만들고:
- static final double PI = 3.14159
- static final int MAX_USER = 100
출력해보기

 

▼ 작성한 코드

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

  public static int subtract(int a, int b) {
    return a - b;
  }

  public static int multiply(int a, int b) {
    return a * b;
  }

  public static int divide(int a, int b) {
    return a / b;
  }
}
public class Constants {
  public static final double PI = 3.14159;
  public static int MAX_USER = 100;
}
public class Main {
  public static void main(String[] args) {
    int a = 10;
    int b = 5;

    System.out.println(MathUtil.add(a, b));
    System.out.println(MathUtil.subtract(a, b));
    System.out.println(MathUtil.multiply(a, b));
    System.out.println(MathUtil.divide(a, b));

    System.out.println("===============");

    System.out.println(Constants.PI);
    System.out.println(Constants.MAX_USER);
  }
}

[ 메모 ]

  • 좀 헷갈린다...
  • static 필드는 클래스에 속하고, 인스턴스 생성시 데이터를 공유한다. 메모리에 1번만 올라감.
  • final 키워드가 있으면 값 변경 불가. 한번 값이 정해지면 변경 x, 얘는 클래스에 속한게 아님.
  • static final 키워드는 전역 상수를 의미. 상수는 변하지 않는 값을 의미. 얘도 static이 있기 때문에 클래스에 속해서 인스턴스끼리 데이터 공유.