Backend/Java

Static

AIHYEONJI 2025. 5. 20. 12:37

1. static

static은 자바에서 클래스에 속하는 멤버(변수나 메서드)를 정의할 때 사용하는 키워드입니다. static으로 선언된 변수나 메서드는 객체를 생성하지 않고도 클래스 이름으로 직접 접근할 수 있으며, 모든 객체가 공유하는 공통된 데이터로 사용됩니다. 예를 들어, static int count는 생성된 모든 객체가 같은 count 값을 공유하게 되며, static 메서드는 인스턴스 변수에 직접 접근할 수 없고 this 키워드도 사용할 수 없습니다. 주로 유틸리티 함수나 공통 속성을 정의할 때 사용됩니다.

혼자 따로 노는 녀석...

 

1. static 변수(정적 변수)

모든 객체가 공유하는 변수입니다. 보통 객체 수 카운트 등에 사용됩니다.

class Car {
    static int count = 0;  // 클래스 변수 (공용)

    public Car() {
        count++;  // 객체가 생성될 때마다 count 증가
    }
}

public class Main {
    public static void main(String[] args) {
        new Car();
        new Car();
        new Car();
        System.out.println("총 생성된 자동차 수: " + Car.count);  // 출력: 3
    }
}

 

2. static 메서드 (정적 메서드)

객체를 생성하지 않고 사용할 수 있는 클래스 메서드입니다. 대표적인 예는 Math 클래스입니다.

class Calculator {
	// heap에 올라감 --> static이 없으면 따로 작용한다.
    public static int add(int a, int b) {
        return a + b;
    }
}

public class Main {
    public static void main(String[] args) {
        int result = Calculator.add(5, 3);  // 객체 생성 없이 사용
        System.out.println("결과: " + result);  // 출력: 8
    }
}

 

3. static 블록( = static initializer)

클래스가 처음 로딩될 때 딱 한 번 실행되는 초기화 블록입니다. 복잡한 static 변수 초기화에 사용됩니다.

  • 클래스가 JVM에 의해 처음 로딩될 때 자동으로 실행됩니다.
  • 주로 static 변수의 복잡한 초기화에 사용됩니다.
  • 생성자보다 먼저, 단 한 번만 실행됩니다.
  • static initializer 안에서는 인스턴스 변수나 메서드 사용 불가합니다.
class Config {
    static int maxUsers;

    static {
        // 복잡한 초기화 코드
        maxUsers = 100;
        System.out.println("Config 클래스가 로딩되면서 초기화됨!");
    }
}

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

 

class ServerConfig {
    static int port;
    static String mode;

    static {
        System.out.println("static initializer 실행됨");
        // 보통은 외부파일에 받아서 함
        port = 8080;
        mode = "production";
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println("포트: " + ServerConfig.port);
        System.out.println("모드: " + ServerConfig.mode);
    }
}

 

4. static import

static import를 사용하면 클래스명을 생략하고 static 멤버를 직접 쓸 수 있습니다.

import static java.lang.Math.*;

public class Main {
    public static void main(String[] args) {
        System.out.println(sqrt(16));  // Math.sqrt(16) → sqrt만 사용 가능
        System.out.println(pow(2, 3)); // Math.pow(2, 3)
    }
}

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Math.html

** java.lang.Math.* 에 대해 검색해보기~

 

Math (Java SE 17 & JDK 17)

public final class Math extends Object The class Math contains methods for performing basic numeric operations such as the elementary exponential, logarithm, square root, and trigonometric functions. Unlike some of the numeric methods of class StrictMath,

docs.oracle.com

  • Java SE ( Standard Edition )
  • Java ME ( Moblie Edition )
  • Java EE ( Enterprise Edition ) : 기업용 서버 만드는 용도

 

2. 싱글톤(Singleton) 패턴이란?

하나의 클래스에 대해 오직 하나의 인스턴스만 생성되도록 보장하는 디자인 패턴입니다.

  • 공통된 설정, 리소스, 서비스 등을 한 객체로 공유하고 싶을 때 사용
  • 예: 설정 클래스, 로깅, DB 연결 관리자 등

cf. 디자인 패턴

  • 자주 반복되는 문제 해결 방법을 재사용 가능한 코드 형태로 정리해 놓은 설계
  • 객체 지향 원칙을 기반으로 설계

사용이유?

  • 유지보수가 쉬운 코드를 만들기 위해
  • 재사용 가능하고 확장성 있는 구조를 만들기 위해
  • 여러 개발자가 협업할 때 일관성 있는 코드 설계를 위해 

디자인 패턴 3가지

  • 생성 패턴 : 객체 생성 방식에 관련된 패턴
  • 구조 패턴 : 클래스나 객체를 조합하여 더 큰 구조를 만드는 패턴
  • 행위 패턴 : 객체들 간의 책임 분배와 메세지 교환 방식을 정의하는 패턴

GoF 디자인 패턴 ( Gang of Four ) - 23가지 패턴 분류

  • 생성(Creational) 패턴 (객체 생성 방식을 캡슐화)
    • Singleton, Factory Method, Abstract Factory, Builder, Prototype
  • 구조(Structural) 패턴 (클래스나 객체 조합해서 더 큰 구조를 형성)
    • Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy
  • 행동(Behavioral) 패턴 (객체 간 책임 분배 및 상호작용 정의)
    • Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method, Visitor
class Singleton {
    // 1. 클래스 내부에서 static으로 단 하나의 인스턴스 생성
    private static final Singleton instance = new Singleton();

    // 2. 생성자는 private으로 외부에서 생성 못 하게 막음
    private Singleton() {
        System.out.println("싱글톤 객체 생성됨");
    }

    // 3. 외부에서 instance에 접근할 수 있는 static 메서드 제공
    public static Singleton getInstance() {
        return instance;
    }

    // 예시 기능
    public void printMessage() {
        System.out.println("싱글톤 패턴으로 실행 중입니다!");
    }
}

 

public class Main {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();

        s1.printMessage();

        System.out.println(s1 == s2); // true → 같은 객체
    }
}