메서드 앞에 static이 붙어 있으면 클래스 메서드, 아니면 인스턴스 메서드입니다.
클래스 메서드도 클래스 변수처럼, 객체 생성 없이
클래스이름.메서드리이름(매개변수)
같은 식으로 호출이 가능합니다.
Static method와 instace method의 특징을 알아볼까요.
- 클래스 변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있습
니다.
static이 붙은 변수는 클래스가 메모리에 올라갈 때 동시에 생성되기 때문입니다.
*클래스 메서드(static)는 인스턴스 메서드/변수를 사용할 수 없다.
Class TestClass {
void instaceMethod(){} // instance method
static void staticMethod () {} // Static Method
void instceMethod2(){
instanceMethod(); // Able to call other instace method
staticMethod();// Able to call static mothod
}
static void staticMethod2(){
instanceMethod(); // Error!!!
//Class method not possible to call insstace method
staticMethod(); // able to other class method
}
인스턴스 변수가 존재하지 않을 수도 있기 때문입니다.
그래서 클래스 메서드에서 인스턴스변수/메서드의 사용을 금지합니다. 반면에 인스턴스변수나 인스턴스메서드에서는 static이 붙은 멤버들을 사용하는 것이 언제나 가능합니다.
어떤 경우에 클래스 메서드를 어떤 경우에 인스턴스 메서드를 사용해야 할까요?
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에는 static을 붙인다.
생성된 각 인스턴스는 독립적이지만, 모든 인스턴스가 공통으로 가져야할 값은 static을 붙여 클래스 변수로 정의해야 합니다.
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
객체를 생성없이 사용할 수 있는 것이 static method의 큰 특징입니다.
그러므로 iv(인스턴스변수)나 im(인스턴스 메서드)를 사용한다는 것 자체가 이미 객체가 생성되었다는 것을 의미합니다.
반대로 iv와 im이 쓰이지 않았다면 static을 붙여보는 것을 고려합니다. 이는 이전의 어떤 객체의 생성 유무에 관계없이 호출가능하며, 메서드의 호출시간도 짧아지므로 성능이 향상되기 때문입니다.
참조 : 자바의 정석 static