static
에 대해서
static
멤버는 JVM이 종료될때까지 메모리의 static영역에 배치된다.
그러므로 static
멤버를 많이 사용할수록 메모리를 많이 사용하게 된다.
- 장점
- 간결한 코드 작성 가능
- 어디서든 접근 가능
- heap영역에 생성 및 해제할 필요 없어 GC(가비지컬렉터) 오버헤드를 줄여줌
- 단점
- 무분별한 사용은 메모리 부족 야기
- 캡슐화(한 객체가 갖고있는 데이터들은 외부에서 함부로 접근하여 수정할 수 없는) 위배
static
메서드는 인터페이스를 구현하는데 사용될 수 없어 재사용성이 떨어짐- thread-safe하지 않아 멀티 스레드 동작에서 충돌 발생할 수 있음
static
은 언제 써야할까?
- 클래스 설계시, 공통적으로 사용되는 변수나 메서드에 붙인다.
- 인스턴스 변수(Non-static멤버 변수)를 사용하지 않는 메서드는 붙이는게 좋다.
- Non-static메서드는 호출 시 메서드를 찾는 과정이 추가적으로 필요하기 때문에 처리시간이 조금 더 걸린다.
static
멤버변수는 지양하고 static
메서드는 멤버 변수가 없는 클래스에 사용하면 괜찮을 것 같지만 애매해서 더 찾아봤다.
static
메서드는 언제 써야할까?
static
멤버 변수를 사용하는 메서드가 종료되도static
멤버 변수는 메모리에 남아있다.static
메서드는 클래스 로드 시점에 메모리에 한 번만 할당되며, 해당 클래스의 모든 인스턴스에서 공유되므로static
메서드를 반복적으로 호출하더라도 새로운 메모리 공간을 차지하지 않는다.static
메서드가 객체의 상태를 변경하지 않고, 주로 입력된 인자를 기반으로 계산이나 처리를 수행하기 때문이다.- 동일한
static
메서드가 여러 번 호출되더라도, 각 호출은 독립적인 스택 프레임을 가지며 이전 호출과 상태를 공유하지 않는다.
그럼 static
메서드의 로컬 변수들은 메모리의 어디에 저장될까?
바로 stack영역이다. 모든 메서드의 로컬 변수들은 메모리의 stack영역에 저장되고 메서드가 종료되면 가비지컬렉터 대상이 된다.
그래서 나만의 static
메서드 사용 기준을 정했다.
- 공통적으로 사용되는 변수나 메서드가 있는가?
- 메서드가 인스턴스 변수를 사용하지 않는가?
아래는 static사용을 고민했던 클래스다.
public class CalculateScore {
private static int countContains(List<Integer> computerNumbers, List<Integer> userNumbers) {
return (int) computerNumbers.stream()
.filter(userNumbers::contains)
.count();
}
public static int countStrike(List<Integer> computerNumbers, List<Integer> userNumbers) {
return (int) IntStream.range(0, Constants.BASEBALL_NUMBER_SIZE)
.filter(i -> computerNumbers.get(i).equals(userNumbers.get(i)))
.count();
}
public static int countBall(List<Integer> computerNumbers, List<Integer> userNumbers) {
return countContains(computerNumbers, userNumbers) - countStrike(computerNumbers,
userNumbers);
}
}
<공통적으로 사용되는 변수나 메서드가 있는가?>
- 공통적으로 사용되는 변수는 없다.
- 클래스 내부에서 한번 이상 사용되는 메서드들이 있다.
<메서드가 인스턴스 변수를 사용하지 않는가?>
- 이 클래스에는 인스턴스 변수가 없다.
기준에 부합한다고 여겨 static
메서드를 사용하기로 했다!
'Java' 카테고리의 다른 글
Java 기초 문법(1) (0) | 2023.12.20 |
---|---|
Java 구동 방식 (1) | 2023.12.20 |
팩토리 메서드 패턴을 적용해보자 (0) | 2023.10.26 |
템플릿 메서드 패턴을 적용해보자 (0) | 2023.10.26 |
일급 컬렉션을 어떻게 사용해야할까? (0) | 2023.10.26 |