public class DecoUtil1 {
public String deco(String str) {
String result = "*" + str + "*";
return result;
}
}
public class DecoUtil2 {
public static String deco(String str) {
String result = "*" + str + "*";
return result;
}
}
메서드 앞에도 static을 붙일 수 있다. 이것을 정적 메서드 또는 클래스 메서드라 한다. 정적 메서드는 static의 문자 그대로 의미이고, 클래스 메서드라는 용어는 인스턴스 생성없이 마치 클래스에 있는 메서드를 바로 호출 하는 것처럼 느껴지기 때문이다.
static이 붙지 않은 메서드는 인스턴스를 생성해야 호출할 수 있다. 이것을 인스턴스 메서드라 한다.
public class DecoData {
private int instanceValue;
private static int staticValue;
public static void staticCall() {
//instanceValue++; //인스턴스 변수 접근, compile error
//instanceMethod(); //인스턴스 메서드 접근, compile error
staticValue++; //정적 변수 접근
staticMethod(); //정적 메서드 접근
}
public void instanceCall() {
instanceValue++; //인스턴스 변수 접근
instanceMethod(); //인스턴스 메서드 접근
staticValue++; //정적 변수 접근
staticMethod(); //정적 메서드 접근
}
private void instanceMethod() {
System.out.println("instanceValue=" + instanceValue);
}
private static void staticMethod() {
System.out.println("staticValue=" + staticValue);
}
}
public static void main(String[] args) {
System.out.println("1. 정적 호출");
DecoData.staticCall();
System.out.println("2. 인스턴스 호출1");
DecoData data1 = new DecoData();
data1.instanceCall();
System.out.println("3. 인스턴스 호출2");
DecoData data2 = new DecoData();
data2.instanceCall();
//추가
//인스턴스를 통한 접근
DecoData data3 = new DecoData();
data3.staticCall();
//클래스를 통한 접근
DecoData.staticCall();
}
정적 메서드는 클래스의 이름을 통해 바로 호출할 수 있다. 그래서 힙영역에 위치하지 않고, 인스턴스처럼 참조값의 개념이 없다.
특정 인스턴스의 기능을 사용하려면 참조값을 알아야 하는데, 정적 메서드는 참조값 없이 호출된다. 따라서 정적 메서드 내부에서 인스턴스 기능을 사용할 수 없다.
그러나 동일 클래스 내부에서 이용하는 것이 아닌 외부에서 받은 매개변수를 이용하게 된다.
public static void staticCall(DecoData data) {
data.instanceValue++;
data.instanceMethod(); //인스턴스 메서드 접근
}
정적 메서드는 간단한 메서드 하나로 끝나는 유틸리티성 메서드에 자주 사용된다. 수학의 여러가지 기능을 담은 클래스를 만든다면 인스턴스 변수 없이 입력한 값을 계산하고 반환하는 것이 대부분이다. 이럴때 정적 메서드로 만들면 좋다.
인스턴스를 통한 접근과 클래스를 통한 접근(클래스명.메소드명()) 방법이 있다. 클래스를 통한 접근이 더 명확하므로 클래스를 통해 접근하자.
정적 메서드를 사용할때 해당 메서드를 자주 호출해야 한다면 static import 기능을 고려하자. 이기능을 사용하면 클래스명을 생략하고 메서드를 호출할 수 있다. 정적 변수에도 사용가능하다.
import static static2.DecoData.staticCall;
//import static static2.DecoData.*; staticCall 외 모든 정적 메소드 호출시
public class DecoDataMain {
public static void main(String[] args) {
System.out.println("1. 정적 호출");
staticCall();
인스턴스 생성없이 실행하는 가장 대표적인 메서드가 바로 main() 메서드이다.
main() 메서드는 프로그램을 시작하는 시작점이 되는데, static 이기 때문에 객체를 생성하지 않아도 메서드가 동작했던 것이다.
main() 메서드가 같은 클래스에서 호출하는 메서드도 정적 메서드로 선언해서 사용해야 한다.