[Java] Static 완전정복!! (1)

About Static

Posted by JongMin-Lee on June 15, 2019

들어가며

Java를 처음 접하고 가장 먼저 적었던 코드가 있습니다. 바로 public static void main(String[] args)입니다.

책으로나 youtube로 공부할 때도 가장 앞부분에 나와 시작부터 당황시켰던 녀석입니다. 그러나 일단 저렇게 시작을 한다 알아두기만 하라고 해서 넘어갔던 부분이기도 하죠…

이 후 Java를 공부하면서 static 이라는 단어가 심심치 않게 나오며 여러부분에서 사용되는 것을 볼 수 있었습니다. 또한 많은 곳에 설명이 되어 있지만 이해하기 어려운 글이 많기도 합니다. 도대체 이 static이 뭔지 나름대로 정리해봤습니다!!


1. main() method

처음 접하는 코드가 위에 말했던 것처럼 main method에서의 static 입니다. 그렇다면 먼저 main method에 대해 알아봅시다.

Java에서 main() method는 JVM(Java Virtual Machine)의 Java 프로그램 진입점입니다. 그말인 즉, JVM은 main()메소드를 호출하여 자바 프로그램을 시작한다는 것 입니다. (JVM이란?)


2. Static

static은 keyword입니다. 메서드 및 변수 앞에 static을 추가하면 instance 메소드 및 변수 대신 class 메소드 및 class 변수가 각각 만들어 집니다. 따라서 static 메소드 및 변수는 Class를 사용하여 직접 액세스 할 수 있습니다. 즉 static 메소드 또는 변수를 액세스 하기 위해 객체를 생성할 필요가 없다는 말입니다.

다른 말로 프로그램이 실행될 때 Java 메모리에 할당되며, 프로그램이 종료될 때 해제된다.라 말할 수 있습니다. 어떤 말인지 이해하기 힘든 부분들이 있으니 밑에서 코드를 보며 확인해 보겠습니다.

(1) static method

1
2
3
4
5
6
7
8
//static function
class Test{
  static void func(){

  }
}
// Calling a static function
Test.func();

메소드가 static키워드로 선언되면 이를 static 메소드(정적메소드)라고 합니다. Test.func()과 같이 개체를 참조하지 않고 액세스 할 수 있습니다.

(2) static main method

1
2
3
4
5
6
class Test{
  public static void main(String[] args){

  }
}

위에는 일반적인 main메소드 입니다. 이 main메소드에는 왜 static이 필요한지 봅시다

  • static main메소드는 JVM이 Java Application을 시작하기 위해 JVM을 호출하는 것을 명확하게 합니다. 그렇지 않으면 JVM이 응용프로그램을 시작하기 위해 각 Java응용프로그램 빌드에 대한 항목을 지정해야 합니다.

  • 이 static main메소드는 정적(static)인데 그렇지 않으면 생성자를 호출해야하는 모호성이 있기 때문입니다.

모호성에 대해 잠시 보겠습니다!

1
2
3
4
5
6
7
public class Test{
  protected Test(int t){}
  public void main(String[] args){

  }

}

위의 코드를 살펴봅시다. JVM은 새로운 Test(int t) 를 호출해야하는지 여부를 경정하는 모호성 상태에 들어갑니다. 그렇다면 t에 어떤 값을 전달해야 할까요? 그렇지 않다면 생성자를 실행하지 않고 JVM이 Test를 인스턴스화 해야 할까요?

진입점이 호출되기 전에 JVM이 클래스를 인스턴스화 해야하는 것은 너무많은 edge case와 모호성이 있습니다. 이것이 main메소드가 static(정적)인 이유입니다.

edge case란? 알고리즘이 처리하는 데이터의 값이 알고리즘의 특성에 따른 일정한 범위를 넘을 경우에 발생하는 문제를 가리킨다.

또 한가지, main메소드가 static이므로써 JDK(Java Development Kit)에 편의를 제공해 줍니다. 만약 main메소드가 static이 아니라면 여러 IDE에서 프로젝트의 ‘실행가능한’ 클래스를 자동감지하는 것이 더욱 어려워 집니다. 따라서 관례적으로 메인 메소드를 ‘public static void main(String[] args)’로써 사용하는 것 입니다.

여기까지가 main메소드에서의 static이었습니다. 다음에는 static에 대해 더 자세히 알아봅시다!!!