공부 기록/Java with ChatGPT

[Java/ChatGPT] Day 6: static 키워드와 클래스 변수/메서드 이해하기

dev.jelee 2025. 6. 15. 01:07

[ 학습목표 ]

  1. static 키워드의 의미와 역할 이해
  2. 인스턴스 변수 vs 클래스 변수의 차이 학습
  3. static 메서드의 특징과 사용법 익히기

 

[ 이론 ]

1. static 키워드란?

  • 클래스에 속한 변수, 메서드를 의미함
  • 객체를 만들지 않고도 사용할 수 있음

 

2. 인스턴스 변수와 클래스 변수 차이

  • 인스턴스 변수: static 없이 선언. 객체마다 개별 저장.
  • 클래스 변수: 클래스에 하나만 존재. 모든 인스턴스가 공유

 

3. static을 사용하는 이유

  • 공용 데이터 공유: 모든 인스턴스가 같은 값을 가져야 할 때 (예: 상수, 카운터)
  • 유틸리티 메서드 작성: 객체와 무관한 기능 (예: Math.pow(), Collections.sort())
  • 클래스 초기화: static 블록을 이용해 한 번만 초기화가 필요할 때
    => class Config 처럼 어플리케이션 정보(앱이름, 정보 등)를 설정하는 클래스를 사용할 때
  • 메모리 절약: 인스턴스 마다 생성되지 않으므로 효율적임

 

4.실무에서 static을 언제 사용하는가

  • 상수 정의: public static final String APP_NAME = "MyApp";
  • 유틸리티 클래스: Math, Collections 처럼 기능만 제공할 때
  • 공통 설정값: 설정 클래스에 static 변수로 저장
  • 로그 객체 공유: private static final Logger logger = ... ;
  • 싱글톤 패턴 공유: 인스턴스를 static으로 관리
    => 싱글톤 패턴은 아래 메모에 작성

 

5. 사용 방법

  • 클래스명.변수명
  • 클래스명.메서드명()

 

6. static 변수 예시

public class Counter {
  static int count = 0; // 클래스 변수

  public Counter() {
    count++;
  }

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

    c1.printCount(); // 3
    c2.printCount(); // 3
    c3.printCount(); // 3
  }
}

 

7. static 메서드 예시

public class MathUtils {
  public static int square(int x) {
    return x * x;
  }
}
public class Main {
  public static void main(String[] args) {
    int result = MathUtils.square(5); // 객체 생성 없이 사용
    System.out.println(result); // 25
  }
}

 

[ 실습 ]

✅ 실습 1: User 클래스 만들기

public class User {
  private String name;
  static int userCount = 0;

  public User(String name) {
    this.name = name;
    userCount++; // 인스턴스 만들 때마다 userCount++ 됨
  }

  public String getName() {
    return name;
  }

  public static void printUserCount() {
    System.out.println("총 사용자 수: " + userCount);
  }
}

 

✅ 실습 2: Main에서 사용

public class Main {
  public static void main(String[] args) {
    User u1 = new User("홍길동");
    User.printUserCount(); // static 메서드 호출
    User u2 = new User("김철수");

    System.out.println("사용자 1: " + u1.getName());
    System.out.println("사용자 2: " + u2.getName());

    User.printUserCount(); // static 메서드 호출
  }
}

 

 

 

 

 


[ 메모 ]

  • 싱글톤 패턴: 프로그램 전체에서 오직 하나의 인스턴스만 존재하게 하는 디자인 패턴
  • 필요 이유: 객체가 하나만 필요하고, 모든 곳에서 그 하나를 써야 할 때
  • 장점: 중복 생성 방지, 일관성 유지, 자원 절약, 어디서든 쉽게 접근 가능 (클래스명.getInstance() )
  • 실제 사용 예:
사용처 이유
설정 클래스 (Config) 앱 전체에서 공통 설정값 사용 — 하나만 있으면 충분
DB 연결 관리 (ConnectionManager) 커넥션을 여러 번 만들면 비효율적이기 때문에 한 객체로 관리
로그 시스템 (Logger) 로그 기록은 한 군데에서 일관되게 관리해야 함
캐시 관리자 (CacheManager) 데이터 캐싱은 하나의 저장소로 일관되게 처리
스레드 풀 관리자 (ThreadPoolManager) 여러 개 만들면 성능에 악영향, 하나로 통합 관리
게임 매니저, 앱 상태 매니저 등 앱 상태를 전역에서 공유하고 관리할 필요가 있을 때