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 메소드에선 인스턴스변수의 사용을 가급적 허용하지 않는다.
'Languages > Java' 카테고리의 다른 글
[Java] 멀티스레드 환경에서의 동시성 문제와 대책 (0) | 2023.04.12 |
---|---|
[Java] equals(), hashCode()를 재정의 해야 하는 이유 (0) | 2023.04.12 |
[Java] 자바 Collection 개념 정리 & 예제 (0) | 2023.04.10 |
[Java] 상속과 인터페이스 개념 정리 (0) | 2023.04.10 |
[Java] 불변 객체(Immutable Object)란 무엇인가? (0) | 2023.04.09 |
댓글