static 키워드
static 변수 (클래스 변수, 정적 변수)
public class Member {
private int count;
private String name;
private int weight;
} 위와 같이 Member 클래스에서 member 객체의 수를 저장하고 싶을 때 위와 같이 변수를 선언하면 각 객체가 생성될 때 마다 객체 내에서 count 변수를 생성하기 때문에 제대로 count가 동작하지 않을 것이다. 이를 해결하기 위해 Counter 클래스를 따로 생성하며 Member 클래스의 생성자에 주입하여 해결할 수 있을 것이다. 하지만, Member 클래스에 관련된 일인데, Counter라는 별도의 클래스를 추가해서 사용해야 한다는 점과 생성자의 매개변수가 추가되고, 이에 따라서 복잡해진다는 불편함을 느낄 수 있을 것이다.사용법
public class Member {
private static int count;
private String name;
private int weight;
}
위와 같이 사용 변수 타입 앞에 static을 붙혀 사용할 수 있다. 전에 자바의 메모리 구조를 설명하면서 메서드 영역에는 static을 위한 메모리 공간이 있다고 설명했는데 static 변수는 클래스의 객체가 공유하는 것임을 이해한다면 프로그램 종료 까지 살아있는 메서드 영역에 static 영역이 있어야 한다는 것을 알 수 있을 것이다. 마찬가지로 만들어진 인스턴스에서 static 변수의 접근은
위의 그림과 같이 이루어진다는 것을 알 수 있다.
static 변수 접근
static 변수를 접근하는 방법에는 인스턴스를 통한 접근과 클래스를 통한 접근 2가지가 있다.
System.out.println(member1.count);기존 인스턴스 변수 접근법과 똑같다.System.out.println(Member.count);클래스 접근을 통해 static 변수 접근이 가능하다.static 메서드 (클래스 메서드, 정적 메서드)
필요성
public class Utils {
public int add(int a, int b) {
return a + b;
}
}
위와 같이 클래스를 선언하여 add 메서드를 사용하고 싶다면
public static void main(String[] args) {
Utils util = new Utils();
int result = util.add(10, 5);
System.out.println(result);
}
와 같이 Uitls 인스턴스를 생성하고 add 메서드를 인스턴스를 통해 호출해야지 사용가능할 것이다. 하지만, 위와 같은 방법은 Utils 클래스는 메서드만 제공하기 때문에 굳이 인스턴스를 생성해야 할까? 라는 의문이 든다. 이 때, 사용할 수 있는 것이 static 키워드를 이용한 static 메서드이다.
사용법
public class Utils {
public static int add(int a, int b) {
return a + b;
}
}
와 같이 static 키워드를 메서드 반환 타입 앞에 사용하면 된다. static 메서드는 static 변수와 같이 자바 메모리 구조에서 메서드 영역에 존재한다.
또한, static 메서드 내에서 인스턴스 메서드에 접근은 불가능하다. 왜냐하면, static 메서드는 객체를 생성하지 않고 클래스를 통해 호출이 가능하기 때문에 인스턴스 메서드를 static 메서드에서 호출하게 된다면 컴파일 오류가 발생하기 때문이다.
static 메서드 접근
static 메서드 또한 접근 방법이 인스턴스를 통한 접근과 클래스를 통한 접근 2가지가 있다. 하지만, 인스턴스를 통한 접근은 static 메서드의 필요성을 부정하기 때문에 클래스를 통해 접근을 권장한다.
public static void main(String[] args) {
int result = Utils.add(5, 10);
System.out.println(result);
}static import
static 메서드를 자주 호출한다면 static import를 통해 호출하면 메서드를 간단하게 호출할 수 있다.
import static Utils.add;
public class Main {
public static void main(String[] args) {
int result = add(5, 10);
System.out.println(result);
}
}
정적 메서드의 활용
위의 필요성에서 잠깐 이야기 한 것 처럼 객체 생성이 필요 없이 메서드의 호출만으로 필요한 기능을 수행할 때 주로 사용한다.
static 클래스