LANGUAGE/Java & Groovy 2020. 3. 14. 02:11

public static void main(String[] args) 갖고 놀기 🤹‍♂️

이번 Post는 전적으로 특정 영상을 보고 정리한 노트이다.

인도의 넘버 1 소프트웨어 훈련소 DURGASOFT에서 공개하는 Youtube 영상이다.

쓸 데 없다는 시각도 있겠지만, 한편으로는 이 주제로 이렇게까지 컨텐츠가 나온다는 것도 신기하고..

Java의 원리를 깊게 살펴볼 수 있는 너무 훌륭한 내용이라고 생각한다.

내가 모든 영어 엑센트를 다 간파할 정도로 영어를 잘하진 못하지만, 호기심에 봤는데 너무 흥미롭고 재밌어서 글로 옴겨본다!

여유가 된다면 중간 중간에 삽입해 놓은 영상도 같이 시청하길 권한다 :D

값진 지식을 설파해주신 Mr. DURGA님 감사합니다!

( 목차 )

1. 실행

2. 이유

3. 변경

4. 제어자

5. 오버로딩

6. 상속

7. Method Hiding

8. Error Message

9. static block


PART- I

https://www.youtube.com/watch?v=by58arnoV4c

1. 실행

자바를 처음 시작할 때 알게 되는 또는 알아야만 하는 것이 main 메소드이다.

우선 class 부터 하나씩 살펴보자.

public class Some {



}

Terminal에서 위 Class를 컴파일실행 하게 되면

javac Some
java Some

JVM은 Class 안에 정의된 public static void main(String[] args) 메소드를 찾아서 실행하게 된다.

이때 만약 main 메소드가 없다면 다음 Error가 발생한다.

  • Java 1.6

      RuntimeException: NoSuchMethodError:main
  • Java 1.7

      Error: Main method not found in class Some, please define main method as public static void main(String[] args)

다음의 경우 java Some 을 실행한다면 정상적으로 실행된다.

public class Some {

    public static void main(String[] args){
        //Implements..
    }    

}

※ 만약 args에 값을 전달하고 싶다면 Terminal에서 다음처럼 실행한다.

java Some apple sagwa ringo

args[0]는 "apple"

args[1]은 "sagwa"

args[2]는 "ringo"

이렇게 args 파라미터에 전달 할 수 있다.

2. 이유

"어째서 public static void main(String[] args) 일까?"
간단히 말하면 JVM 때문이다.

  • public: To call by JVM
    • JVM이 호출 할 수 있도록
  • static: Without existing object also JVM has to call this method & main method no way related to any object
    • JVM이 어느 객체와 상관없이 어디서든 호출할 수 있도록 해야한다.
  • void: main() method won't return anything to JVM.
    • JVM한테 줄 게 없다.
  • main: This is name which is configured inside JVM.
    • JVM이 처음 실행할 메소드가 뭔지 알 수 있도록 정해놓은 규칙이다.
  • (String[] args): command line arguments
    • Command Line으로 부터 인자값을 전달 받기 위해 존재한다.

3. 변경

이 구조를 바꾸면 main 메소드를 찾지(인식하지) 못해서 다음 Error가 발생할 것이다.

Error: Main method not found in class Some, please define main method as public static void main(String[] args)

하지만 쉽게 짐작할 수 있겠지만 Parameter 정도는 이름이 바뀐다고 다른 곳에서 호출하는 데 영향을 주지 않는다.

public static void main(String[] bananas){ ... }

또한 여러 배열선언 방법들을 사용할 수 있다.

public static void main(String[] args){ ... }
public static void main(String []args){ ... }
public static void main(String args[]){ ... }

그리고 이방법도 main 메소드애서 사용할 수 있다.

public static void main(String... args){ ... }

또한! public과 static의 위치도 Java문법상 바뀌어도 상관없다.

static public void main(String[] args){ ... }

4. Modifier - 제어자

Access Modifier(접근제어자)는 건들지 못해도 Modifier(제어자)는 추가할 수 있다.

    1. synchronized

      public synchronized static void main(String args[]){ ... }
    1. final

      public static final void main(String args[]){ ... }
    1. strictfp

      public strictfp static void main(String args[]){ ... }

그렇다면 이건 가능할까?

public final synchronized strictfp void main(String args[]){ ... }

정답은

...
..
.

땡!이다 ㅎㅎㅎ

늘어난 제어자에 속지말자!

static이 지워져 있다!

맞췄다면! 정말 예리한 사람이다!? 대단하다! :)

난 속았다는.. ㅠ

public static final synchronized strictfp void main(String args[]){ ... }

이것은 가능하다! :D


PART- II

https://www.youtube.com/watch?v=L0SdH2Dtrnw

5. Overloading - 오버로딩

public class Some {
    public static void main(String[] args){
        //Implements..
    }
    public static void main(int[] args){
        //Implements..
    }
}

별반 다를 것 없이 실행은 String[] 를 Parameter로 받는 method로부터 시작된다.

이 예제는 단순히 main 메소드도 Overloading이 가능하다는 것을 보여준다.

6. Inheritance - 상속

public class Some {
    public static void main(String[] args){
        System.out.println("parent main");
    }    
}
public class SomeItem extends Some {
    //Nothing..
}
  • Run java Some

      parent main
  • Run java SomeItem

      parent main

7. Method Hiding - not overridding

public class Some {
    public static void main(String[] args){
        System.out.println("parent main");
    }    
}
public class SomeItem extends Some {
    public static void main(String[] args){
        System.out.println("child main");
    }    
}
  • Run java Some

      parent main
  • Run java SomeItem

      child main

PART- III

https://www.youtube.com/watch?v=DzRSGCFz8rA

8. Error Message

public class Some {
    //Nothing..
}
  • Java 1.6 에서는 NoSuchMethodError RuntimeException 오류를 뿜뿜한다.

      RuntimeException: NoSuchMethodError: main
  • Java 1.7 에서는 더 자세한 오류정보를 뿜뿜한다.

      Error: Main method not found in class Some, please define main method as public static void main(String[] args)

누가 main 메소드도 없이 호출하겠냐만..

이런 부분까지 상세하게 오류메세지를 만들다니!..

Java가 인기 개발언어 로서의 위엄을 뿜뿜하는 것으로 보인다.

9. static block

public class Some {
    static {
        System.out.println("static block");        
    }
}
  • Java 1.6 에서는 static block을 출력한 후 NoSuchMethodError RuntimeException 오류를 뿜뿜한다.

      static block
      RuntimeException: NoSuchMethodError: main
  • Java 1.7 에서는 main 메소드는 필수이다. main 메소드부터 검사한다!

      Error: Main method not found in class Some, please define main method as public static void main(String[] args)

그렇다면 강제로 종료시켜보자.

public class Some {
    static {
        System.out.println("static block");
        System.exit(0);
    }
}

...

위와 마찬가지다.

그렇다면 main 메소드를 만들어 보자.

public class Some {
    static {
        System.out.println("static block");        
    }

    public static void main(String[] args){
        System.out.println("main method");
    }
}
  • Run java Some on Java 1.6

      static block
      main method
  • Run java Some on Java 1.7

      static block
      main method

Reference - 참조