참고:
https://www.quora.com/What-are-command-line-arguments-1
Java를 처음 사용하기 시작했다면
이런 에러를 종종 볼 수 있다.

원인은 여러가지가 있다.
1. main메소드를 선언하지 않았을 때
자바 프로그램이 실행되면 가장 먼저 하는 일이 main 메소드를 찾는 것이기 때문에,
이 에러가 발생하면 어떤 수행도 진행되지 않는다.
2. public static void main(String[] args)에 오타가 있거나 임의로 수정했을 때.
위의 문장은 하나하나 의미가 있기 때문이다.
public: 가장 먼저 호출해야하므로 접근에 제한이 있으면 안되므로 무조건 public이어야만 가능하다.
생략하는 것도 안된다. 생략하면 접근제어자가 default(같은 패키지에서만 접근 가능)가 적용되기 때문이다.
static: 아까 말했듯이, 어떤 코드보다 가장 먼저 실행되어야 하므로 객체를 만드는 코드 이전에 작동하기 위해선
static을 붙여야한다. 그렇게하면 인스턴스 생성이 되지 않아도 접근이 가능하기 때문이다. static을 붙이면 인스턴스에 속해 있지 않고 클래스 범위로 소속되기 위해 JVM메모리의 method 영역에 정보가 올라간다.
void: main메소드가 가장 먼저 시작했기 때문에 main이 반환한 값을 처리할 메소드는 없기 때문에 반환형은 void이어야만 한다.
main: main이란 키워드로 메소드를 찾기 때문에 그대로 써줘야한다.
String args[]: 나는 처음에 String args[]를 써야하는 이유에 대해 궁금했었다.일단 위치는 매개변수 자리이다. 즉, 이 클래스 파일을 실행할 떄 문자열 배열 정보를 함께 준다는 것이다. 그 말은 즉, 프로그램을 모듈화 할 수 있다는 뜻이다. 예를 들어서, 하나의 메인 메소드가 실행될 때 args에 담긴 문자열이 "삭제"라면 삭제에 관한 함수를 실행시키도록 하는 것이다. 추가로 주는 정보에 따라서 여러 동작을 수행할 수 있도록 모듈화 하는 것이다. 일반적인 메소드에서의 매개변수를 떠올리면 되지만, main의 매개변수는 이런 모듈화 성격이 더 짙다.
커맨드라인(이클립스 IDE가 아닌 cmd창에서 텍스트 기반으로 프로그램을 만드는 경우)에서는 바로 명령어를 args에 넣을 수 있다. 하지만 이클립스 IDE에서는 GUI 기반으로 Run Configurations..->Arguments->Program arguments에서 원하는 명령어를 넣을 수 있다.
처음 JAVA로 프로젝트를 할 때, 오픈소스를 사용하는데 입력 받는 함수가 없을 때 인풋(입력값)을 어디에 넣어야 하는지 헤맨 적이 있었다. 그때 찾은 간단히 해결하는 방법이 이것이다.
3. 수정된 파일을 저장하지 않고 컴파일 했을 때
초보일 때 이 에러의 가장 많은 원인이라고 생각한다. 나도 아직 초보이긴 하지만.. 프로젝트를 할 때 종종 main을 찾을 수 없다고도 나오고, 이전에 작성한 코드의 결과값이 출력되는 경우가 더러 있었다.
당시에 검색을 했을 때는 이클립스에서의 에러보단 콘솔에서의 코드 오탈자로 설명하는 글이 많았다. 콘솔에서 main을 찾을 수 없는 문제는 대부분 .java 파일을 컴파일 할 때 확장자까지 모두 써줬던 것처럼 .class파일 또한 끝까지 다 쓴 경우 생기는 에러였다. (클래스파일은 실행만 바로 하면 되는 .exe 프로그램이기 때문에 이름만 써주면 된다!)

하지만 이클립스에서는 코드를 저장하지 않아서 생기는 문제이다. 정확히는, 컴파일을 하지 않고 run을 해서 생기는 문제이다. 이클립스에서 컴파일은 단축키가 ctrl+s이다. main을 작성하지 않고 저장한 상태에서 main을 작성하고 곧바로 run을 하면 에러가 발생한다.

여기서 ctrl+s로 저장 및 컴파일을 하고나서 실행을 하면 잘 실행이 된다.

만약 main을 찾을 수 없는 상황이더라도, 같은 프로젝트에서 main이 존재하는 클래스가 있다면 에러 메시지를 출력하지 않고 그 클래스의 main 메소드를 실행하게 된다.
그러니 실행 전엔 항상 저장을 하는 습관을 들이자!
'Skill > Java' 카테고리의 다른 글
객체 지향 프로그래밍이란? cmd에서 메모장으로 자바 코딩? JAVA 동작 과정? (0) | 2019.08.27 |
---|