여태껏 클래스 내에서 메서드를 선언할 때 static 한정자에 대한 고민을 해본 적이 없었는데, 이번에 자바의 정석을 읽는 도중 좋은 내용을 건진 것 같아 포스팅하여 정리하고자 한다.
public class Test {
int x;
int y;
int add() {
return x + y;
}
int add(int x, int y) {
return x + y;
}
}
class Practice {
public static void main(String[] args) {
Test t = new Test();
}
}
위와 같은 클래스가 있다고 가정하자.
매개변수가 없는 add() 메서드의 경우 인스턴스 변수를 사용하고 있으므로 static 한정자를 붙이게되면, 초기화 되지 않은 인스턴스 변수 x, y에 의해 컴파일 에러가 발생한다.
반면에 인스턴스 변수를 사용하고 있지 않은 매개변수가 있는 add() 메서드의 경우 static 한정자를 붙여도 컴파일 에러가 발생하지 않는다.
그렇다면 왜 static 한정자를 붙이는게 좋은가?
그 이유는 인스턴스 메서드와 클래스 메서드의 동작 방식을 이해할 필요가 있다.
인스턴스 메서드의 경우 객체(인스턴스)를 통해 호출되는 메서드이며, 호출할 때마다 객체 참조가 필요하다. 객체 참조가 메서드 호출에 필요하므로, 호출 과정에서 객체의 참조를 확인하고, 해당 객체가 메모리에 존재하는지 확인하는 등의 추가적인 처리가 발생한다.
클래스 메서드의 경우 객체가 아닌 클래스 자체에서 호출되는 메서드다. 객체 참조가 필요하지 않기 때문에 호출 시점에 추가적인 객체 참조나 상태 확인 과정이 필요없다. 또한 클래스 로딩 시점에 메모리에 올라가기 때문에, 메서드 호출 시 인스턴스 메서드보다 더 적은 오버헤드로 호출된다.
결론
즉 JVM에 의해 객체를 참조하는 과정이 있냐 없냐로 인해 호출시간이 짧아지거나 길어지게 되며, 성능에 영향이 발생할 수 있으므로 인스턴스 변수를 사용하지 않는 메서드라면 클래스 메서드로 생성하는 것이 좋다고 볼 수 있다.
딱히 크게 성능 이슈가 발생하는 것은 아니지만 이유가 있는 코딩을 할 수 있도록 하자.
public class Test {
// int add(int x, int y) {
// return x + y;
// }
static int add(int x, int y) {
return x + y;
}
}
class Practice {
public static void main(String[] args) {
// Test t = new Test();
// int result = t.add(5, 5);
int result = Test.add(5, 5);
}
}
'Language > Java' 카테고리의 다른 글
[Java] 객체 동등 비교 - equlas() (0) | 2024.10.05 |
---|---|
[Java] ArrayList.java (add 메서드 내부 동작) (0) | 2024.03.19 |
Java#1 - 자바공부를 시작하며.. (0) | 2023.04.29 |
개발 기술 블로그, Dev
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!