자바 프로그래밍을 배우면서 제일 먼저 static을 보는 것은 Main함수다.
public class WhileStatement {
public static void main(String[] args) {
// 입력값 받기
int startNum = Integer.parseInt(args[0]);
// 카운트 다운 출력
countDown(startNum);
}
위 예시에서 WhileStatement라는 클래스 안에 main함수가 static으로 선언되어 있다. WhileStatement는 그저 class이름과 파일이름(WhileStatement.java)을 나타내지만 이 클래스로 실행을하면 main함수만 실행된다.
main함수가 실행되면 countDown라는 메소드가 출력된다.
public class WhileStatement {
public static void main(String[] args) {
// 입력값 받기
int startNum = Integer.parseInt(args[0]);
// 카운트 다운 출력
countDown(startNum);
}
public static void countDown(int num) {
System.out.println("카운트 다운을 시작합니다..");
while (num > -1) {
System.out.printf("%d..\n", num);
num--;
}
System.out.println("발사!!");
}
}
여기서 의문인 것은 countDown는 static이 반드시 선언되어 있어야 실행이 가능하다는 것!
이것은 기존의 절차지향언어인 C와 객체지향언어인 JAVA의 차이점에서 발생한다. C는 파일이 시작될 때 위에서 그냥 읽는대로 실행하기 때문에 "어? 없는 메서드네"하고 해당 파일을 찾아가면 된다. 하지만 JAVA는 메모리에 미리 올려져 있지 않으면 어디서부터 시작해야하는지 알 수 없다.
C는 위에서 순서대로 읽고 실행하면 그만이지만, JAVA가 객체지향을 선택한 순간부터 "미리 선언된 함수", 즉 메모리에 이미 올려져 있는 static 메서드만 쓰기로 정한 것이다. 만약 countDown라는 함수가 전혀 다른 클래스 (= 다른 파일의 파일의 파일 안에 있는) 함수라면 우리는 매번 함수를 실행할 때마다 해당 파일을 찾아서 컴파일 후 실행을 해줘야할 것이다. 따라서 이는 객체지향 언어와는 맞지 않는다는 것이다.
위에서부터 순서대로 읽는 것이 아니기 때문에 사용할 함수와 변수는 미리 메모리에 올라와 있어야 객체지향언어라고 볼 수 있기 때문에 static이라는 예약어를 통해서 변수와 함수(메서드)를 메모리에 "미리" 올려놓는다.