πŸ’» BackEnd/🟨 Java

🟨 [Java] (static)정적 λ³€μˆ˜, λ©”μ†Œλ“œ

Dbswnstjd 2023. 4. 7. 12:04

Static μ΄λž€?

Javaμ—μ„œ Static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ λ©”λͺ¨λ¦¬μ— ν•œλ²ˆ ν• λ‹Ήλ˜μ–΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•Œ μ—†μ–΄μ§€λŠ” 것을 μ˜λ―Έν•œλ‹€.

λ©”λͺ¨λ¦¬ μ˜μ—­μ— λŒ€ν•΄ 이해λ₯Ό ν•˜κ³  μžˆλ‹€λ©΄ 쑰금 μ‰¬μšΈ 것이닀. 

 

μš°λ¦¬κ°€ μƒμ„±ν•œ ClassλŠ” Static μ˜μ—­μ— 생성이 되고, new 연산을 톡해 μƒμ„±ν•œ κ°μ²΄λŠ” Heapμ˜μ—­μ— 할당이 λœλ‹€.

μ΄λŸ¬ν•œ 이유 λ•Œλ¬Έμ— String 클래슀의 비ꡐλ₯Ό λ™λ“±μ—°μ‚°μž(==, !=) 이 μ•„λ‹Œ equal()을 톡해 비ꡐλ₯Ό ν•œλ‹€.

μŠ€νƒμ—μ„œ 클래슀의 μ£Όμ†Œλ₯Ό 가리킀기 λ•Œλ¬Έμ— 같은 λ¬Έμžμ—΄ 이더라도 λ™λ“±μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€λ₯΄λ‹€κ³  λ‚˜μ˜€λŠ” 것이닀. 

객체의 μƒμ„±μ‹œ ν• λ‹Ήλœ Heap μ˜μ—­μ˜ λ©”λͺ¨λ¦¬λŠ” GC(Garbage Collector)λ₯Ό 톡해 μˆ˜μ‹œλ‘œ 관리λ₯Ό λ°›λŠ”λ‹€.

ν•˜μ§€λ§Œ Static ν‚€μ›Œλ“œλ₯Ό 톡해 Static μ˜μ—­μ— ν• λ‹Ήλœ λ©”λͺ¨λ¦¬λŠ” λͺ¨λ“  객체가 κ³΅μœ ν•˜λŠ” λ©”λͺ¨λ¦¬μ΄λ‹€. μ΄λŸ¬ν•œ μž₯점이 μžˆμ§€λ§Œ GCκ°€ 관리해주지 μ•ŠκΈ° λ•Œλ¬Έμ— Static을 자주 μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ˜ λ©”λͺ¨λ¦¬ 효율이 λ–¨μ–΄μ§€κ²Œ 되며 μ‹œμŠ€ν…œμ˜ νΌν¬λ¨ΌμŠ€μ— μ•…μ˜ν–₯을 μ€€λ‹€.

 

Static λ³€μˆ˜ 

λ©”λͺ¨λ¦¬μ— κ³ μ •μ μœΌλ‘œ ν• λ‹Ήλ˜μ–΄, ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•Œ ν•΄μ œλ˜λŠ” λ³€μˆ˜ / λ©”μ†Œλ“œ

Static λ³€μˆ˜λŠ” 클래슀 λ³€μˆ˜μ΄λ‹€. 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ λ„ Static μžμ›μ— 접근이 κ°€λŠ₯ν•˜λ‹€.

λ©”λͺ¨λ¦¬μ— ν•œλ²ˆ 할당이 λ˜λ―€λ‘œ μ—¬λŸ¬ 객체λ₯Ό 생성해도 ν•΄λ‹Ή λ©”λͺ¨λ¦¬λ₯Ό κ³΅μœ ν•˜κ²Œ λœλ‹€.

public class Car{

    private String name = "Audi";
    
    public void printCarName(){
    	System.out.println(this.name);
    }
}

μ΄λŸ¬ν•œ Car λΌλŠ” ν΄λž˜μŠ€κ°€ μžˆλ‹€κ³  κ°€μ •ν•˜μž. 이 λ•Œ 100개의 Car μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ²Œ 되면 "Audi"λΌλŠ” 이름을 κ°–λŠ” λ©”λͺ¨λ¦¬κ°€ μ€‘λ³΅λ˜λŠ” κ±Έ μ•Œ 수 μžˆλ‹€. 이런 κ²½μš°μ— Static을 μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬ 객체가 ν•˜λ‚˜μ˜ λ©”λͺ¨λ¦¬λ₯Ό μ°Έμ‘°ν•˜κ²Œ ν•˜λ©΄ λ©”λͺ¨λ¦¬ λ‚­λΉ„κ°€ μ—†μ–΄μ§ˆ 것이닀. 그리고 μ•žμ— final ν‚€μ›Œλ“œκ°€ λΆ™μœΌλ©΄ λ³€ν•˜μ§€ μ•ŠλŠ” 값이 λœλ‹€. Audi λΌλŠ” νšŒμ‚¬ 이름은 λ³€ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 뢙일 수 μžˆλ‹€. 

public class Car{

    public static String name = "Audi";
    
    public static void printCarName(){
    	System.out.println(this.name);
    }
}

μœ„μ™€ 같은 이유둜 static λ³€μˆ˜λŠ” public / finalκ³Ό 함꼐 μ‚¬μš©λ˜μ–΄ public static final 둜 자주 쓰인닀. 

μœ„μ˜ μ½”λ“œμ—μ„œ printCarNameμ΄λΌλŠ” ν•¨μˆ˜ λ˜ν•œ static ν‚€μ›Œλ“œκ°€ λΆ™μ–΄ static λ©”μ†Œλ“œμ΄λ‹€. Static λ³€μˆ˜λŠ” static λ©”μ†Œλ“œλ₯Ό 톡해 μ ‘κ·Όν•˜λ„λ‘ ꢌμž₯ν•˜κΈ° λ•Œλ¬Έμ— μ΄λŸ¬ν•œ 방식을 μ‚¬μš©ν•œλ‹€.

Static λ©”μ†Œλ“œ

Static MethodλŠ” 객체의 생성 없이 호좜이 κ°€λŠ₯ν•˜κ³ , κ°μ²΄μ—μ„œλŠ” 호좜이 λΆˆκ°€λŠ₯ν•˜λ‹€.

이게 μ–΄λ–€ μ˜λ―ΈμΈμ§€ μ²˜μŒμ— 이 말이 잘 이해가 λ˜μ§€ μ•Šμ•˜λŠ”λ° 예λ₯Ό λ“€μ–΄μ„œ 보면 쉽닀.

public class Car{
    
    public static String name = "Audi";
    
    public static void printCarName(){
    	System.out.println(this.name);
    }
}
public class Test{
	public static void main(String[] args){
    	Car myCar = new Car();
        ...
    }
}

 

일반적으둜 객체λ₯Ό 생성해야 객체 μ•ˆμ— μžˆλŠ” λ©”μ†Œλ“œλ₯Ό μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. 

ν•˜μ§€λ§Œ μ•„λž˜μ˜ μ½”λ“œλ₯Ό 보면 객체λ₯Ό μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ printNameμ΄λΌλŠ” λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν–ˆλ‹€. (Mainν•¨μˆ˜λŠ” μƒλž΅)

public class Example{
    public String name1 = "World";
    public static String name2 = "Hello";
    
    public static void printName(){
    	System.out.println(this.name1); // λΆˆκ°€λŠ₯
    	System.out.println(this.name2);
    }
    
    public void printTest(){
    	System.out.println(this.name1);
    	System.out.println(this.name2);
    }
 }
 
 Math.max(1,2);
 Example.printName();

 

이것이 λ°”λ‘œ Static Method의 μž₯점이닀. μš°λ¦¬κ°€ ν”νžˆ μ‚¬μš©ν•˜λŠ” Scanner κ°μ²΄λŠ” import λ₯Ό ν•΄μ€˜μ•Ό μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€. 

ν•˜μ§€λ§Œ Math λŠ” importλ₯Ό 해주지 μ•Šμ•„λ„ λ°”λ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•œλ° μ΄λŠ” Math λŠ” λŒ€ν‘œμ μΈ Static λ©”μ†Œλ“œμ΄λ‹€.  

μ—¬κΈ°μ„œ μ£Όμ˜ν•΄μ•Ό ν•  점은 printName이닀.

Static λ©”μ†Œλ“œμ—μ„œλŠ” static이 μ„ μ–Έλ˜μ§€ μ•Šμ€ λ³€μˆ˜μ— 접근이 λΆˆκ°€λŠ₯ν•˜λ‹€. 쑰금만 깊게 생각해보면 μ‰¬μš΄ 문제인데 λ©”λͺ¨λ¦¬ 할당을 μƒκ°ν•΄λ³΄μž.

Example의 name1은 Example example = new Example(); 을 μ΄μš©ν•΄μ„œ 객체λ₯Ό 생성해쀀닀. 생성과 λ™μ‹œμ— name1이 λ©”λͺ¨λ¦¬μ— 할당이 λ˜λŠ” 것이닀.

ν•˜μ§€λ§Œ μœ„μ˜ μ½”λ“œλŠ” 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  static λ©”μ†Œλ“œλ₯Ό μ΄μš©ν•˜κΈ° λ•Œλ¬Έμ— ν• λ‹Ήλ˜μ§€ μ•Šμ€ λ©”λͺ¨λ¦¬ μ˜μ—­μ— 접근을 ν•˜κΈ° λ•Œλ¬Έμ— 였λ₯˜κ°€ λ°œμƒν•œλ‹€. λ”°λΌμ„œ static λ³€μˆ˜μ— μ ‘κ·Όν•˜κΈ° μœ„ν•œ λ©”μ†Œλ“œλŠ” λ°˜λ“œμ‹œ static λ©”μ†Œλ“œκ°€ λ˜μ–΄μ•Ό ν•œλ‹€. 

 

Static λ³€μˆ˜μ™€ λ©”μ†Œλ“œ ν™œμš©

일반적으둜 μƒμˆ˜λ“€λ§Œ λͺ¨μ•„μ„œ μ‚¬μš©ν•˜λ©° λŒ€λ¬Έμžμ™€ _λ₯Ό μ‘°ν•©ν•˜μ—¬ 이름을 μ§“λŠ”λ‹€.

λ˜ν•œ 상속을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ fincal class둜 선언을 ν•œλ‹€. 

public final class Application{

    public static final String APP_NAME = "MyApp";
    
}