Java 2-4 static

ν† μŠ€νŠΈλΉŒλŸ°Β·2025λ…„ 3μ›” 11일

Static

πŸ“šStatic μ΄λž€?

  • static ν‚€μ›Œλ“œλŠ” λͺ¨λ“  객체가 ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” λ³€μˆ˜λ‚˜ λ©”μ„œλ“œλ₯Ό λ§Œλ“€λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • 객체(μΈμŠ€ν„΄μŠ€)λ₯Ό λ§Œλ“€μ§€ μ•Šμ•„λ„ 클래슀 μ΄λ¦„λ§ŒμœΌλ‘œ λ°”λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • λͺ¨λ“  객체가 같은 값을 κ³΅μœ ν•©λ‹ˆλ‹€. β†’ 곡용 κ²Œμ‹œνŒμ΄λΌκ³  μƒκ°ν•˜μ‹œλ©΄ μ΄ν•΄ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.
  • static λ³€μˆ˜μ™€ λ©”μ„œλ“œλŠ” ν•œ 번만 μƒμ„±λ˜κ³  Method Area(λ©”μ„œλ“œμ˜μ—­) 에 μ €μž₯λ©λ‹ˆλ‹€.

Static ν™œμš©

πŸ’‘static ν‚€μ›Œλ“œλ₯Ό ν™œμš©ν•΄ λ΄…μ‹œλ‹€.

  • static ν‚€μ›Œλ“œλŠ” λ³€μˆ˜, λ©”μ„œλ“œμ— 뢙일 수 μžˆμŠ΅λ‹ˆλ‹€.
  • static ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜μ™€ λ©”μ„œλ“œλŠ” MethodArea 에 μ €μž₯λ©λ‹ˆλ‹€.
  • 각 객체(μΈμŠ€ν„΄μŠ€)λŠ” ν΄λž˜μŠ€μ˜μ—­μ— μ €μž₯된 데이터λ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class Person {
		// βœ… static λ³€μˆ˜
		static int population = 0; 
		
		// βœ… static λ©”μ„œλ“œ
		static void printPopulation() { 
				System.out.println("ν˜„μž¬ 인ꡬ 수: " + population);
		}
}
System.out.println("static λ³€μˆ˜: " + Person.population);
System.out.println("static λ©”μ„œλ“œ: " + Person.printPopulation);

μΈμŠ€ν„΄μŠ€ 멀버(μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ + μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ)

πŸ“šμΈμŠ€ν„΄μŠ€ λ©€λ²„λž€?

  • 객체λ₯Ό λ§Œλ“€λ•Œ λ§ˆλ‹€ μƒμ„±λ˜λŠ” λ³€μˆ˜μ™€ λ©”μ„œλ“œ μž…λ‹ˆλ‹€.
  • 객체(μΈμŠ€ν„΄μŠ€)λ₯Ό μƒμ„±ν•œ ν›„μ—λ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 각 객체가 κ°œλ³„μ μœΌλ‘œ 값을 κ°€μ§‘λ‹ˆλ‹€. (κ³΅μœ λ˜μ§€ μ•ŠμŒ)
  • μΈμŠ€ν„΄μŠ€λŠ” Heap μ˜μ—­μ— μœ„μΉ˜ν•©λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λž€

πŸ“šμΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ•Œμ•„λ΄…μ‹œλ‹€.

  • 객체가 생성될 λ•Œλ§ˆλ‹€ λ”°λ‘œ λ§Œλ“€μ–΄μ§€λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.
  • 객체λ₯Ό μƒμ„±ν•œ ν›„ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • name λ³€μˆ˜λŠ” 각 κ°μ²΄λ§ˆλ‹€ λ³„λ„λ‘œ μ €μž₯λ©λ‹ˆλ‹€.
class Person {
		String name; // βœ… μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
}
public class Main {
    public static void main(String[] args) {
        
        Person p1 = new Person(); // p1 객체 생성
        p1.name = "gygim"; // βœ… p1 객체의 데이터에 μ ‘κ·Ό
        
        Person p2 = new Person(); // p2 객체 생성
        p2.name = "Steve"; // βœ… p2 객체의 데이터에 μ ‘κ·Ό
    }
}

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλž€?

πŸ“šμΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό μ•Œμ•„ λ΄…μ‹œλ‹€.

  • 객체의 속성을 ν™œμš©ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
  • 객체가 μƒμ„±λœ ν›„μ—λ§Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
class Person {
		String name;
		
		void printName() { // βœ… μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ
				System.out.println("λ‚˜μ˜ 이름은 " + this.name + "μž…λ‹ˆλ‹€.");
		}
}
public class Main {
    public static void main(String[] args) {
        
        Person p1 = new Person(); 
        p1.name = "gygim";
        p1.printName(); // βœ… p1 객체의 λ©”μ„œλ“œ μ‹€ν–‰
        
        Person p2 = new Person();
        p2.name = "Steve";
        p2.printName(); // βœ… p2 객체의 λ©”μ„œλ“œ μ‹€ν–‰
    }
}

클래슀 멀버(클래슀 λ³€μˆ˜ + 클래슀 λ©”μ„œλ“œ)

πŸ“šν΄λž˜μŠ€ 멀버λ₯Ό μ•Œμ•„λ΄…μ‹œλ‹€.

  • 클래슀 μžμ²΄μ— μ†ν•˜λŠ” λ³€μˆ˜μ™€ λ©”μ„œλ“œλ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
  • static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ μ„ μ–Έν•©λ‹ˆλ‹€.
  • ν•΄λ‹Ή 클래슀둜 λ§Œλ“€μ–΄μ§„ 객체가 κ³΅μœ ν•΄μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν΄λž˜μŠ€κ°€ λ‘œλ“œλ λ•Œ Method Area 에 μ μž¬λ©λ‹ˆλ‹€.
  • 객체 생성 없이 μ‚¬μš© κ°€λŠ₯ν•©λ‹ˆλ‹€.

클래슀 λ³€μˆ˜λž€?

πŸ“šν΄λž˜μŠ€ λ³€μˆ˜λ₯Ό μ•Œμ•„λ΄…μ‹œλ‹€.

  • ν΄λž˜μŠ€κ°€ λ‘œλ“œλ  λ•Œ ν•œ 번만 μƒμ„±λ©λ‹ˆλ‹€.
  • λͺ¨λ“  객체가 κ³΅μœ ν•˜λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.
  • Heap 이 μ•„λ‹ˆλΌ Method Area 에 μ €μž₯λ©λ‹ˆλ‹€.
  • 객체λ₯Ό λ§Œλ“€μ§€ μ•Šμ•„λ„ 클래슀λͺ….λ³€μˆ˜λͺ…μœΌλ‘œ μ ‘κ·Όκ°€λŠ₯ν•©λ‹ˆλ‹€.
class Person {
		static int population = 0; // βœ… 클래슀 λ³€μˆ˜
}
public class Main {
    public static void main(String[] args) {
        
        // βœ… 객체 생성 전에도 클래슀 λ ˆλ²¨μ—μ„œ 직접 μ ‘κ·Όκ°€λŠ₯
        System.out.println("ν˜„μž¬ 인ꡬ 수: " + Person.population);
        
        Person p1 = new Person();
        Person p2 = new Person();
        
        // βœ… λͺ¨λ“  객체가 ν•˜λ‚˜μ˜ 값을 곡유
        System.out.println("ν˜„μž¬ 인ꡬ 수: " + Person.population);
    }
}

클래슀 λ©”μ„œλ“œλž€?

πŸ“šν΄λž˜μŠ€ λ©”μ„œλ“œλ₯Ό μ•Œμ•„λ΄…μ‹œλ‹€.

  • ν΄λž˜μŠ€μ— μ†ν•˜λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.
  • 객체 없이 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 클래슀 λ³€μˆ˜λ§Œ μ‚¬μš©ν•  수 있고 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
class Person {
		static int population = 0;
		
		public Person(String name) {
				this.name = name;
				population++; // μƒμ„±μž ν˜ΈμΆœμ‹œ populataion 1 증가
		}
		
		static void printPopulation() {
				System.out.println("ν˜„μž¬ 인ꡬ 수: " + population); // βœ… 클래슀 λ©”μ„œλ“œ
		}
}
public class Main {
    public static void main(String[] args) {
		    
		    // βœ… 객체생성 여뢀에 상관없이 μ‚¬μš© κ°€λŠ₯
        Person.printPopulation(); // ν˜„μž¬ 인ꡬ 수: 0

        Person p1 = new Person("gygim"); // μƒμ„±μ‹œλ§ˆλ‹€ population 1 증가
        Person p2 = new Person("Steve"); // μƒμ„±μ‹œλ§ˆλ‹€ population 1 증가

        Person.printPopulation(); // ν˜„μž¬ 인ꡬ 수: 2
    }
}

전체 μ½”λ“œ μ‚΄νŽ΄λ³΄κΈ°

πŸ’‘μ „μ²΄ μ½”λ“œμ™€ 그림으둜 μ•Œμ•„λ΄…μ‹œλ‹€.

  • static 으둜 μ„ μ–Έλœ λ³€μˆ˜μ™€ λ©”μ„œλ“œλŠ” κ°μ²΄μ—μ„œ 곡용으둜 μ‚¬μš©κ°€λŠ₯ν•©λ‹ˆλ‹€.
public class Person {
    static int population = 0; // 클래슀 λ³€μˆ˜ (λͺ¨λ“  객체가 곡유)
    String name; // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜

    public Person(String name) {
        this.name = name;
        population++; // μƒμ„±μž ν˜ΈμΆœμ‹œ populataion 1 증가
    }

    public void printName() {
        System.out.println("이름: " + name);
    }

    public static void printPopulation() { // 클래슀 λ©”μ„œλ“œ
        System.out.println("ν˜„μž¬ 인ꡬ 수: " + population);
    }

}
public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("gygim");
        Person p2 = new Person("Steve");

        p1.printName();  // μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œλŠ” 객체 μΈμŠ€ν„΄μŠ€ν™” 이후에 호좜 κ°€λŠ₯
        p2.printName();

        // 클래슀 λ©”μ„œλ“œλŠ” 클래슀 μ΄λ¦„μœΌλ‘œ 호좜 κ°€λŠ₯
        Person.printPopulation();  // "ν˜„μž¬ 인ꡬ 수: 2"
    }
}

Static μ‚¬μš©μ‹œ μ£Όμ˜μ‚¬ν•­

클래슀 λ³€μˆ˜ μ‚¬μš©μ‹œ 주의 사항

⚠️static 은 κ³΅μœ κ°€ ν•„μš”ν•œ 곳에 μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€.

public class Student {
    static String name; // ⚠️ λͺ¨λ“  객체가 λ™μΌν•œ name을 곡유 (μœ„ν—˜)

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

    public void printName() {
        System.out.println("이름: " + name);
    }

}
public class Main {

    public static void main(String[] args) {
        Student s1 = new Student("gygim");
        Student s2 = new Student("Steve");

        s1.printName();  // ⚠️ "이름: Steve"
        s2.printName();  // ⚠️ "이름: Steve"
    }
}

Static λ©”μ„œλ“œμ—μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— μ ‘κ·Ό

⚠️Static λ©”μ„œλ“œμ—μ„œλŠ” μΈμŠ€ν„΄μŠ€λ³€μˆ˜μ— μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

  • μΈμŠ€ν„΄μŠ€ 멀버λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € 객체가 μƒμ„±λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 객체 생성없이 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 접근도 λ‹Ήμ—°νžˆ μ•ˆλ©λ‹ˆλ‹€.
public class Person {
    String name;

    public static void staticMethod() {
        System.out.println(this.name);  // ⚠️ 였λ₯˜ λ°œμƒ
    }
}
public class Example {
    int instanceVar = 10;

    public static void main(String[] args) {
        Example ex = new Example();
        System.out.println(ex.instanceVar);  // βœ… 정상 좜λ ₯
    }
}

static 은 κΌ­ ν•„μš”ν•  λ•Œλ§Œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

⚠️static λ³€μˆ˜μ™€ λ©”λͺ¨λ¦¬λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ λ©”λͺ¨λ¦¬μ— μœ μ§€λ©λ‹ˆλ‹€.

  • λ„ˆλ¬΄ λ§Žμ€ static λ‚¨μš©ν•˜λ©΄ λ©”λͺ¨λ¦¬ λ‚­λΉ„λ‘œ μ΄μ–΄μ§‘λ‹ˆλ‹€.

0개의 λŒ“κΈ€