Backend/JAVA

static ν‚€μ›Œλ“œ

dddzr 2025. 2. 26. 20:32

πŸ“Œ 1. static ν‚€μ›Œλ“œμ˜ 의미

static은 "정적인"μ΄λΌλŠ” 의미둜,  static을 뢙이면 객체(instance)와 관계없이 클래슀(class) λ‹¨μœ„λ‘œ κ΄€λ¦¬λœλ‹€λŠ” λœ»μ΄λ‹€!

즉, ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ  λ•Œ ν•œ 번만 μƒμ„±λ˜λ©°, λͺ¨λ“  객체가 κ³΅μœ ν•œλ‹€.

 

βœ… 2. static ν‚€μ›Œλ“œμ˜ μ‚¬μš©

1️⃣ static λ³€μˆ˜ (클래슀 λ³€μˆ˜)

  • λͺ¨λ“  객체가 κ³΅μœ ν•˜λŠ” λ³€μˆ˜! (μΈμŠ€ν„΄μŠ€μ™€ 관계 μ—†μŒ)
  • 클래슀λͺ….λ³€μˆ˜λͺ…μœΌλ‘œ μ ‘κ·Ό κ°€λŠ₯
  • 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šμ•„λ„ μ‚¬μš© κ°€λŠ₯

πŸ“– 예제

class Counter {
    static int count = 0; // λͺ¨λ“  객체가 κ³΅μœ ν•˜λŠ” λ³€μˆ˜

    Counter() {
        count++; // 생성될 λ•Œλ§ˆλ‹€ count 증가
    }
}

public class Main {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();

        System.out.println(Counter.count); // 좜λ ₯: 2
    }
}

 

βœ” countλŠ” static λ³€μˆ˜μ΄λ―€λ‘œ λͺ¨λ“  Counter 객체가 곡유
βœ” c1, c2κ°€ 생성될 λ•Œλ§ˆλ‹€ count 값이 증가

βœ” Counter.count처럼 클래슀λͺ…μœΌλ‘œ 직접 μ ‘κ·Ό κ°€λŠ₯

 

2️⃣ static λ©”μ„œλ“œ (클래슀 λ©”μ„œλ“œ)

  • 객체 없이 호좜 κ°€λŠ₯! (μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ ❌)
  • 클래슀λͺ….λ©”μ„œλ“œλͺ…()으둜 호좜 κ°€λŠ₯
  • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜/λ©”μ„œλ“œμ— μ ‘κ·Ό λΆˆκ°€
  • 주둜 μœ ν‹Έμ„± λ©”μ„œλ“œ, νŒ©ν† λ¦¬ λ©”μ„œλ“œμ—μ„œ μ‚¬μš©

πŸ“– 예제

class MathUtils {
    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
    }
}

 

❌ 주의 : static λ©”μ„œλ“œ λ‚΄λΆ€μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(this.λ³€μˆ˜λͺ…)λ₯Ό μ‚¬μš©ν•  수 μ—†μŒ!

⭐ 객체(μΈμŠ€ν„΄μŠ€)κ°€ 생성될 λ•Œλ§ˆλ‹€ κ°œλ³„μ μœΌλ‘œ μƒμ„±λ˜λŠ” 것.

 

πŸ“– 예제

class Example {
    int x = 10; 
    static void printX() {
        System.out.println(x); // 였λ₯˜! (μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ ‘κ·Ό λΆˆκ°€)
    }
}

 

3️⃣ static 블둝 (클래슀 μ΄ˆκΈ°ν™” 블둝)

  • ν΄λž˜μŠ€κ°€ λ‘œλ“œλ  λ•Œ ν•œ 번만 싀행됨!
  • 주둜 static λ³€μˆ˜ μ΄ˆκΈ°ν™” μš©λ„λ‘œ μ‚¬μš©
  • main() 보닀 λ¨Όμ € 싀행됨

πŸ“– 예제

class Config {
    static String appName;

    static { // ν΄λž˜μŠ€κ°€ λ‘œλ“œλ  λ•Œ ν•œ 번 싀행됨
        appName = "My App";
        System.out.println("Config Loaded!");
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(Config.appName); // My App
    }
}

 

βœ” static {} 블둝은 ν΄λž˜μŠ€κ°€ λ‘œλ“œλ  λ•Œ ν•œ 번 싀행됨
βœ” λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° μ„€μ •, μƒμˆ˜ μ΄ˆκΈ°ν™” 등에 μ‚¬μš©

 

4️⃣ static λ‚΄λΆ€ 클래슀 (쀑첩 클래슀)

  • λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€ 없이 μ‚¬μš© κ°€λŠ₯!
  • static ν΄λž˜μŠ€λŠ” μ™ΈλΆ€ 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ‚¬μš© λΆˆκ°€
  • λ°”κΉ₯클래슀.λ‚΄λΆ€ν΄λž˜μŠ€ ν˜•νƒœλ‘œ μ ‘κ·Ό

πŸ“– 예제

class Outer {
    static class Inner {
        void display() {
            System.out.println("Hello from static inner class");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Outer.Inner obj = new Outer.Inner(); // 객체 생성 κ°€λŠ₯
        obj.display();
    }
}

 

πŸš€ κ²°λ‘ 

 

static은 정적(클래슀 λ‹¨μœ„ 관리)λΌλŠ” 곡톡점이 μžˆμ§€λ§Œ, 각각 μ μš©λ˜λŠ” 방식이 닀름!

static μš”μ†Œ μ„€λͺ… νŠΉμ§•
static λ³€μˆ˜ λͺ¨λ“  객체가 κ³΅μœ ν•˜λŠ” λ³€μˆ˜ 클래슀 λ‘œλ“œ μ‹œ 1번만 생성
static λ©”μ„œλ“œ 객체 없이 호좜 κ°€λŠ₯ν•œ λ©”μ„œλ“œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ‚¬μš© λΆˆκ°€
static 블둝 클래슀 λ‘œλ“œ μ‹œ 1번 μ‹€ν–‰λ˜λŠ” μ΄ˆκΈ°ν™” 블둝 main()보닀 λ¨Όμ € μ‹€ν–‰
static λ‚΄λΆ€ 클래슀 λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€ 없이 μ‚¬μš© κ°€λŠ₯ λ°”κΉ₯ 클래슀의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ ‘κ·Ό ❌

βœ” κ³΅μœ ν•΄μ•Ό ν•˜λŠ” λ°μ΄ν„°λŠ” static λ³€μˆ˜λ‘œ!
βœ” 객체 없이 ν˜ΈμΆœν•  λ©”μ„œλ“œλŠ” static λ©”μ„œλ“œλ‘œ!
βœ” 클래슀 λ‘œλ”© μ‹œ μ΄ˆκΈ°ν™”ν•  μž‘μ—…μ€ static λΈ”λ‘μœΌλ‘œ!