Java 개발자라면 한번쯤은 봤을 Static 키워드이다.
Static 키워드로 선언된 필드, 메소드, 클래스는 프로그램이 실행될 때 생성 및 초기화가 된다.
즉, 프로그램이 시작될 때 메모리에 올라간다. 메모리에 올라가 같은 주소만을 바라보기 때문에
공유할 수 있어 공유해야 하는 필드에 보통 사용한다.
Static 키워드는 필드, 메소드, 클래스에 적용할 수 있다.
static 필드
public class Obo {
public String name = "obo";
}
public class Ok {
public static final int number = 123;
public static String name = "ok";
}
public class Test {
System.out.println("name : "+Ok.name);
Obo obo = new Obo();
System.out.println("name : "+obo.name);
}
위 Obo 클래스는 일반 String 멤버변수이며, Ok 클래스의 number 와 name 변수는 static 키워드를 사용한 전역변수이다.
위에서 설명했듯이 static 키워드를 사용하면 프로그램 실행과 동시에 메모리에 올라가 공유가 가능하다고 했다.
Test 클래스를 보면 Ok 클래스의 name 은 static 키워드를 붙여 메모리에 올라가 있기 때문에 new 키워드를
사용한 객체 생성을 할 필요가 없이 접근 가능하다.
하지만 Obo 클래스는 일반 멤버변수를 가지고 있기 때문에 name 변수에 접근하기 위해
new 키워드를 사용한 객체 생성을 해준 다음 접근해야 한다.
또한 Ok 클래스의 number 변수는 final 키워드까지 사용했다. final 키워드는 생성과 동시에
초기화를 해줘야 하는 변수로써 값을 변경할 수 없다. 즉, 단어 그대로 최종적이라는 뜻과 같이
한번 초기화하면 변경할 수 없는 변수이다.
Ok 클래스의 static 만 붙인 name 변수는 언제 어디서나 값을 변경할 수 있는 전역변수이다.
static 메소드
public class Ok {
public final static int number = 123;
public static String name = "ok";
public String address = "서울 특별시";
public static void print_name(){
// System.out.println("address : "+address); 컴파일 에러! 일반 멤버변수에는 접근할 수 없다!
System.out.println("name : "+name+" number : "+number);
}
}
public class Test {
Ok.print_name();
}
static 메소드도 static 필드와 비슷합니다. 메소드 앞에 static 키워드를 사용하면 되고 객체를 생성하지 않아도
메소드에 접근할 수 있습니다.
위 내용을 보면 Ok 클래스의 객체를 생성하지 않아도 Ok.print_name(); 메소드 호출을 할 수 있습니다.
주의할점은 static 메서드이지만 클래스 내부의 일반 멤버변수에 접근할 수 없고 this, super 같은 키워드를
사용할 수 없습니다.
static 클래스
public class Ok {
public String address = "서울 특별시";
public class Test {
public Test() {
System.out.println("address : "+address);
}
}
}
public class Test {
Ok.print_name();
}
Ok 클래스 안에 Test 라는 클래스를 생성했다. 이러한 클래스 안의 내부 클래스를 Inner 클래스라고 부른다.
이러한 Inner 클래스는 상위 클래스인 Ok 클래스의 내부 멤버변수에 접근이 가능하다.
상위클래스와 연결되어 있다고 볼 수 있다.
public class Ok {
public String address = "서울 특별시";
public static class Test {
public Test() {
// System.out.println("address : "+address); static 키워드로 내부 멤버변수 접근 불가
}
}
}
public class Test {
Ok.print_name();
}
하지만 위와 같이 Ok 클래스의 Test 클래스에 static 키워드를 붙이면 Ok 클래스와 Test 클래스는 분리가 된다.
즉, static 클래스로 인해 전역클래스가 되고 Ok 클래스와의 별도로 분리가 된다.