이번에는 static 이 붙은 메서드에 대해 알아보자.
이해를 돕기 위해 간단한 예제를 만들어보자.
특정 문자열을 꾸며주는 간단한 기능을 만들어보자.
예를 들어서 "hello"라는 문자를 꾸미면 앞 뒤에 "*" 을 붙여서 "*hello*" 와 같이 꾸며주는 기능이다.
지금까지 학습한 방식을 통해 해당 기능을 개발해보자.
DecoUtil1
package static2;
public class DecoUtil1 {
public String deco(String str) {
return "*" + str + "*";
}
}
DecoMain1
package static2;
public class DecoMain1 {
public static void main(String[] args) {
DecoUtil1 decoUtil = new DecoUtil1();
System.out.println(decoUtil.deco("Hello Java"));
}
}
*Hello Java*
앞서 개발한 deco() 메서드를 호출하기 위해서는 DecoUtil1 의 인스턴스를 먼저 생성해야 한다. 그런데 deco() 라는 기능은 맴버 변수도 없고, 단순히 기능만 제공할 뿐이다. 인스턴스가 필요한 이유는 맴버 변수(인스턴스 변수)등을 사용하는 목적이 큰데, 이 메서드는 사용하는 인스턴스 변수도 없고 단순히 기능만 제공한다.
DecoUtil2
package static2;
public class DecoUtil2 {
public static String deco(String str) {
return "*" + str + "*";
}
}
DecoUtil2 는 앞선 예제와 비슷한데, 메서드 앞에 static 이 붙어있다. 이 부분에 주의하자. 이렇게 하면 정적 메서드를 만들 수 있다. 그리고 정적 메서드는 정적 변수처럼 인스턴스 생성 없이 클래스 명을 통해서 바로 호출할 수 있다.
DecoMain2
package static2;
public class DecoMain2 {
public static void main(String[] args) {
System.out.println(DecoUtil2.deco("Hello Java"));
}
}
*Hello Java*
[ 용어 정리 ]
클래스 메서드: 메서드 앞에도 static 을 붙일 수 있다. 이것을 정적 메서드 또는 클래스 메서드라 한다. 정적 메서드라는 용어는 static 이 정적이라는 뜻이기 때문이고, 클래스 메서드라는 용어는 인스턴스 생성 없이 마치 클래스에 있는 메서드를 바로 호출하는 것 처럼 느껴지기 때문이다.
인스턴스 메서드: static 이 붙지 않은 메서드는 인스턴스를 생성해야 호출할 수 있다. 이것을 인스턴스 메서드라 한다.
정적 메서드는 객체 생성없이 클래스에 있는 메서드를 바로 호출할 수 있다는 장점이 있다.
하지만 정적 메서드는 언제나 사용할 수 있은 것이 아니다.
정적 메서드 사용법
예제를 통해 정적 메서드의 사용법을 확인해보자
DecoData
package static2;
public class DecoData {
private int instanceValue;
private static int staticValue;
public static void staticCall() {
// instanceValue++; 인스턴스 변수 접근 (오류)
// instanceMethod(); 인스턴스 메소드 호출 (오류)
staticValue++; // 정적 변수 접근
staticMethod(); // 정적 메소드 호출
}
public void instanceCall() {
instanceValue++; // 인스턴스 변수 접근
instanceMethod(); // 인스턴스 메소드 호출
staticValue++; // 정적 변수 접근
staticMethod(); // 정적 메소드 호출
}
public void instanceMethod() {
System.out.println("instanceMethod:instanceValue => " + instanceValue);
}
private static void staticMethod() {
System.out.println("staticMethod: staticValue => " + staticValue);
}
}
DecoDataMain
package static2;
public class DecoDataMain {
public static void main(String[] args) {
System.out.println("1. 정적 호출");
DecoData.staticCall();
System.out.println("2. 인스턴스 호출");
DecoData decoData = new DecoData();
decoData.instanceCall();
}
}
1. 정적 호출
staticMethod: staticValue => 1
2. 인스턴스 호출
instanceMethod:instanceValue => 1
staticMethod: staticValue => 2