Backend/JAVA

static ν‚€μ›Œλ“œ

dddzr 2025. 2. 26. 20:32

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

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

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

 

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

βœ… 2-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-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); // 였λ₯˜! (μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ ‘κ·Ό λΆˆκ°€)
    }
}

 
⭐ Static λ©”μ„œλ“œ vs μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 비ꡐ

πŸ”Ή μΈμŠ€ν„΄μŠ€ 생성이 ν•„μš”ν•œ 경우

  • 객체의 μƒνƒœ(ν•„λ“œ)λ₯Ό λ©”μ„œλ“œμ—μ„œ 써야 ν•  λ•Œ
  • 예: μ‚¬λžŒ 객체에 이름이 있고, κ·Έ 이름을 좜λ ₯ν•˜λŠ” λ©”μ„œλ“œ
  • sayHello()κ°€ name ν•„λ“œλ₯Ό μ°Έμ‘°ν•˜λ‹ˆκΉŒ, 객체 μ—†μ΄λŠ” 호좜 λΆˆκ°€.
public class Person {
    private String name; // μƒνƒœ(ν•„λ“œ)

    public Person(String name) {
        this.name = name;
    }

    public void sayHello() { // μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
        System.out.println("Hello, my name is " + name);
    }
}

// μ‚¬μš© 예
Person p = new Person("Alice");
p.sayHello(); // 객체의 μƒνƒœ(name)λ₯Ό μ‚¬μš© → μΈμŠ€ν„΄μŠ€ ν•„μš”

 

 

πŸ”Ή μΈμŠ€ν„΄μŠ€ 생성이 λΆˆν•„μš”ν•œ 경우

  • μƒνƒœλ₯Ό μ „ν˜€ μ•ˆ μ“°κ³ , μž…λ ₯κ°’λ§Œ λ°›μ•„μ„œ μ²˜λ¦¬ν•˜λŠ” λ©”μ„œλ“œ
  • 예: μˆ˜ν•™ 계산기
  • add()λŠ” ν•„λ“œ μ‚¬μš© 없이 λ™μž‘ → ꡳ이 객체λ₯Ό λ§Œλ“€ ν•„μš” μ—†μŒ.
public class MathUtils {

    public static int add(int a, int b) { // static λ©”μ„œλ“œ
        return a + b;
    }
}

// μ‚¬μš© 예
int sum = MathUtils.add(3, 5); // 객체 생성 없이 λ°”λ‘œ 호좜

 

 

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

 

βœ… 

 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 λΈ”λ‘μœΌλ‘œ!