static
이 붙지 않은 멤버 메서드static
이 붙은 멤버 메서드static
메서드 등으로 불린다.static
이 붙지 않은 멤버 메서드는 인스턴스를 생성해야 사용할 수 있고, 인스턴스에 소속되어 있다. 따라서 인스턴스 메서드라 한다.
static
이 붙은 멤버 메서드는 인스턴스와 무관하게 클래스에서 바로 접근할 수 있고, 클래스 자체에 소속되어 있다. 따라서 클래스 메서드라 한다.
정적 메서드는 객체 생성이 필요 없이 메서드의 호출만으로 필요한 기능을 수행할 때 주로 사용한다.
예를 들어 간단한 메서드 하나로 끝나는 유틸리티성 메서드에 자주 사용한다.
예) 수학의 여러가지 기능을 담은 클래스
인스턴스 변수 없이 입력한 값을 계산하고 반환하는 것이 대부분이다. 이럴 때 정적 메서드를 사용해서 유틸리티성 메서드를 만들면 좋다.
static
메서드는 static
변수와 마찬가지로 클래스를 통해 바로 접근할 수 있고 인스턴스를 통해서도 접근할 수 있다.
// 추가
// 인스턴스를 통한 접근
DecoData data3 = new DecoData();
data3.staticCall();
// 클래스를 통한 접근
DecoData.staticCall();
data3.staticCall()
정적 메서드의 경우 인스턴스를 통한 접근은 추천하지 않는다. 왜냐하면 코드를 읽을 때 마치 인스턴스 메서드에 접근하는 것처럼 오해할 수 있기 때문이다.
DecoData.staticCall()
정적 메서드는 클래스에서 공용으로 관리하기 때문에 클래스를 통해서 접근하는 것이 더 명확하다. 따라서 정적 메서드에 접근할 때는 클래스를 통해서 접근하자.
정적 메서드를 사용할 때 해당 메서드를 다음과 같이 자주 호출해야 한다면 static import
기능을 고려하자.
DecoData.staticCall();
DecoData.staticCall();
DecoData.staticCall();
이 기능을 사용하면 다음과 같이 클래스 명을 생략하고 메서드를 호출할 수 있다.
staticCall();
staticCall();
staticCall();
package static2;
// import static static2.DecoData.staticCall;
import static static2.DecoData.*;
public class DecoDataMain {
public static void main(String[] args) {
System.out.println("1. 정적 호출");
staticCall(); // 클래스 명 생략 가능
...
}
특정 클래스의 정적 메서드 하나만 적용하려면 다음과 같이 생략할 메서드 명을 적어주면 된다.
import static static2.DecoData.staticCall;
특정 클래스의 모든 정적 메서드에 적용하려면 다음과 같이 *
을 사용하면 된다.
import static static2.DecoData.*;
참고 :
import static
은 정적 메서드 뿐만 아니라 정적 변수에도 사용할 수 있다.
인스턴스 생성 없이 실행하는 가장 대표적인 메서드가 바로 main()
메서드이다.
main()
메서드는 프로그램을 시작하는 시작점이 되는데, 객체를 생성하지 않아도 main()
메서드가 작동한다. main()
메서드가 static
이기 때문이다.
정적 메서드는 정적 메서드만 호출할 수 있다. 따라서 정적 메서드인 main()
이 호출하는 메서드에는 정적 메서드를 사용했다.
물론 더 정확히 말하자면 정적 메서드는 같은 클래스 내부에서 정적 메서드만 호출할 수 있다. 따라서 정적 메서드인 main()
메서드가 같은 클래스에서 호출하는 메서드도 정적 메서드로 선언해서 사용했다.
public class ValueDataMain {
public static void main(String[] args) {
ValueData valueData = new ValueData();
add(valueData);
}
static void add(ValueData valueData) {
valueData.value++;
System.out.println("숫자 증가 value = " + valueData.value);
}
}