검색결과 리스트
글
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이 처음 실행할 메소드가 뭔지 알 수 있도록
정해놓은 규칙
이다.
- 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(제어자)는 추가할 수 있다.
-
-
synchronized
public synchronized static void main(String args[]){ ... }
-
-
-
final
public static final void main(String args[]){ ... }
-
-
-
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.6static block main method
-
Run
java Some
on Java 1.7static block main method
Reference - 참조
- Explain about public static void main(String[] args); ( PART- I ): https://www.youtube.com/watch?v=by58arnoV4c
- Explain about public static void main(String[] args); ( PART- II ): https://www.youtube.com/watch?v=L0SdH2Dtrnw
- Explain about public static void main(String[] args); ( PART- III ): https://www.youtube.com/watch?v=DzRSGCFz8rA
- DURGASOFT is INDIA's No.1 Software Training Center: http://www.durgasoft.com/
'LANGUAGE > Java & Groovy ' 카테고리의 다른 글
[Groovy] GString VS "A"+"B" VS StringBuilder (문자열조합 속도비교) (0) | 2020.03.16 |
---|---|
[Java] abstract class와 interface 차이점 (0) | 2020.03.15 |
[Groovy] try-with-resources ...... withCloseable{} 으로 대체한다? (0) | 2019.08.19 |
[Java] try-with-resources (가독성 높이기) (0) | 2019.08.19 |
[Java] Logback - EvaluatorFilter를 이용해서 경우에 따라 로그에 색입히기 예제 (0) | 2018.02.01 |