본문 바로가기
Languages/Java

[Java] static, static method 개념 정리

by 젊은오리 2023. 4. 9.
728x90

Static이란?

Java에서 static 키워드를 사용한다는 것은 어떠한 값이 메모리에 한번 할당되어 프로그램이 끝날 때 까지 그 메모리에 값이 유지된다는 것을 의미한다. 즉, static제어자를 사용하면, 객체를 생성하지 않고도 클래스 변수나 메서드를 호출할 수 있다.

static의 사용 예시로 과일명과 가격을 변수로 갖는 과일 클래스를 생성해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Fruit {
 
    private String fruitName;
    private int price; 
    
    public int getPrice(){
        return price;
    } 
    
    public void setPrice(int price){
        this.price = price;
    }
    
    public String getFruitName(){
        return fruitName;
    }
    
    public void setFruitName(String fruitName){
        this.fruitName = fruitName;
    }
}
cs
 

다음으로 과일 가격을 계산하는 클래스를 생성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Calculate {
 
    public int plusPrice(int price1, int price2){
        return price1 + price2;
    }
    
    public static void main(String[] args) {
 
        Fruit fruit1 = new Fruit();
        fruit1.setFruitName("Apple");
        fruit1.setPrice(1000);
 
        Fruit fruit2 = new Fruit();
        fruit2.setFruitName("Banana");
        fruit2.setPrice(3000);
        
        Calculate calculate = new Calculate();
        calculate.plusPrice(fruit1.getPrice(), fruit2.getPrice());
        
    }
}
cs

 

여기서 가격의 합을 계산하는 메서드인 plusPrice는 static을 선언하지 않았으므로, 위와 같이 new를 사용해서 Calculate객체를 생성 후, plusPrice메서드를 호출하는 모습을 볼 수 있다.

만약 static으로 선언하여 사용한다면, 아래와 같이 Calculate클래스에 직접 함수를 사용하여 간단하게 표현할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Calculate {
 
    public static int plusPrice(int price1, int price2){
        return price1 + price2;
    }
 
    public static void main(String[] args) {
 
        Fruit fruit1 = new Fruit();
        fruit1.setFruitName("Apple");
        fruit1.setPrice(1000);
 
        Fruit fruit2 = new Fruit();
        fruit2.setFruitName("Banana");
        fruit2.setPrice(3000);
 
        Calculate.plusPrice(fruit1.getPrice(), fruit2.getPrice());
 
    }
}
cs

 

Static을 사용했을 때 장단점은 뭘까?

😊장점

▶ 간결한 코드 작성이 가능하다.
   - new 키워드를 통해 객체 생성없이 호출할 수 있기에 코드를 간결하게 작성할 수 있다.

어디서든 접근이 가능하다.
   - 어느 클래스든 static으로 선언된 변수나 메서드를 불러와 사용할 수 있다.

GC 오버헤드를 줄여줄 수 있다.
   - 공통으로 사용해야하는 메서드를 10,000번 호출한다고 가정해보자. new 키워드를 통해 객체를 생성 후 동작하도록 작성하였다면, 반복되는 동안 객체를 Heap영역에 생성하고 사용이 끝나면 메모리를 해제해야 한다. 그러나 이러한 동작을 10,000번 하게 되면 GC에 오버헤드가 발생된다. Static은 Heap영역에 생성 및 해제를 할 필요없이 사용가능하다.

🥹단점

▶ 무분별한 Static의 사용은 Memory Leak의 원인이 될 수 있다.
- Static으로 선언된 모든 것들은 프로그램이 시작될 때 메모리를 할당받는다. 메모리를 해제하기 위해선 프로그램을 종료해야하는데, 만약 무분별하게 Static을 사용하게 된다면 GC가 메모리 해제를 하지 못해 메모리 부족현상이 발생될 수 있다.

▶ 객체지향적이지 않다.
- 캡슐화란 한 객체가 가지고 있는 데이터들은 외부에서 함부로 접근하여 수정할 수 없도록 하는 원칙이다. 그러나 Static을 사용할 경우 어디서든 접근이 가능하기 때문에 캡슐화의 원칙을 위배하게 된다.

▶ Static은 Thread-safe하지 않다.
- Static은 Thread-safe하지 않기 때문에 멀티 스레드 동작에서 충돌이 발생될 수 있다.

 

그래서 static의 올바른 사용법은 뭔데?

클래스 설계시, 공통적으로 사용되는 변수나 메소드는 static을 붙인다.

Static 메소드 생성을 고려할 때, 인스턴스 변수를 사용하는지 확인한다.

- Static 메서드는 인스턴스 생성없이 호출이 가능하다. 하지만 인스턴스 변수는 인스턴스를 생성해야만 값이 존재한다. 만약 Static 메서드를 호출할 때 생성되지 않은 인스턴스 변수를 사용하면 어떻게 될까? 당연히 NullPointer문제가 발생될 것이다. 따라서 Static 메소드에선 인스턴스변수의 사용을 가급적 허용하지 않는다.

Reference : https://medium.com/@ehd8266/static%EC%9D%98-%EC%98%AC%EB%B0%94%EB%A5%B8-%EC%82%AC%EC%9A%A9%EB%B2%95%EC%9D%80-d95a7b91c6f8

728x90

댓글