public static void main(String[] args)
java 를 한번이라도 배워보신분들은 다들 알고계신 메인 메소드 에대해서
얘기해보도록 하겠습니다. 정말 기본적인 내용이니 어느정도 알고계신분들한테는 뻔한 내용이지만 이제 막 시작하시는분들위한 내용이니 이해 부탁드립니다. ^^
처음 프로젝트 생성하고 class 를 생성하면 아래와같은 창이 뜹니다.
그리고 아래에 보면 체크란이있는데 클래스 생성시 main메소드를 생성할것이냐 말것이냐의 대한 내용입니다.
선택후 Finish 를 선택하면 java 파일이 생성이 되는데 아래와 같이 초기코드가 보일겁니다.
package testJava; public class SampleProject { public static void main(String[] args) { } }
매우 썰렁한 모습인데.
중요한것은 java application 의 시작은 이곳에서 시작됩니다.
왜 그런지는 JAVA 와의 약속이라고 생각하면 될것같네요..
JAVA 는 어플리케이션이 실행되면 제일먼저 메인(main)메소드를 실행한다 입니다.
그렇다면 public static void 는 무엇이며 괄호() 안에 들어간 String[] args 는 무엇인가 궁금하겠죠..
지금 처음하시는 분들이라면 잘이해가 안되실테니 자세한 내용은 나중에 올리고 지금은 간단하게만 설명하겠습니다.
public 은 접근제어자입니다.
접근제어자는 외부에서 접근할수 있는 일종의 제약입니다. 종류는 제약이 강한순서대로 private -> protected -> public 이 있으며 defualt 는 클래스 내부와 동일 패키지에서 접근할 수 있습니다.
public 은 어느곳에서든 해당 객체를 참조할수있다는 의미입니다.
그렇다면 아무곳에서나 메인메소드를 호출하면 되는건가요?
라는 생각을 해볼수있는데. 위를 보면 자바 어플리케이션이 실행되면
제일먼저 메인메소드를 실행한다고 알려드렸습니다
따라서 프로그램의 시작은 메인이기때문에 난 메인메소드에서는 정의만 하고 다른곳에서 이것을 호출할거야 라는 의미는 사용할수 없습니다.
만약 main 메소드에서는 hello world 만 출력하고 다른 클래스 호출하여 메인메소드를 사용했을경우 무한히 hello world 출력이 반복되는 장면을 볼수있습니다.
static 은 이 함수가 정적 함수임을 의미합니다. 즉 가만히 있어도 되는? 라는 의미로 해석이 되는데요..
static 으로 함수 또는 클래스를 선언했을 경우에 해당 객체는 자바가 컴파일 되는 순간 정의가 됩니다. 그리고 이후 static 이 아닌 객체가 정의가 되죠
따라서 일단 static 객체에서 static 이 아닌 객체를 호출하는것은 불가능합니다.
static 이 먼저 정의가 되기때문에 아직 정의되지 않은 객체는 호출할수 없기때문입니다. 순서를 생각해보면 금방 이해될 내용입니다.
자세한 내용은 나중에 다시한번 설명드리겠습니다.
void 는 나는 그냥 실행만 할뿐.. 나에게 다른걸 바라지마.. 너에게 아무것도 돌려주지않아.. 라고 장난 치듯 얘기할수있겠네요..
말그래도 void 는 리턴되는 값이 없습니다. 단지 해당 함수가 종료된후 호출한 부분으로 이동할뿐입니다.
더쉽게 이해하자면 void 자리에 int 를 넣을경우 어떠한 처리를 실핸한후 정수형 데이터를 돌려보내겠다는 뜻이며 String 이 들어갈경우 문자형 데이터를 돌려보내겠다는 의미입니다.. 이해되셨나요?
자! 지금까지 거의다 도착했습니다. 지금까지 이야기 한것을 종합해보면
이 메인메소드는 자바 어플리케이션 실행시 제일먼저 동작하며 어느 객체에서든 접근할수 있으며 자바가 컴파일 되는 순간 정의되는 돌려주는 값이없는 함수구나~~~~
정도로 의미했으면 전부는 아니더라도 어느정도 다 온것같습니다..
쉽게쉽게 생각하자고요 우리가 만든 프로그램이 아니잖아요 ^^
마지막으로 괄호() 안에 들어가는 String[] args 는 무엇일까요
이건 매개변수의 의미와 배열과 String 클래스를 배워야 아는부분이라서
지금상태에서 전부다 이해할순없어도 간단하게 설명해보겠습니다.
String 은 문자열을 의미합니다. " " 쌍다음표 안에들어가는 문자들의 집합 즉
"Hello World" 와 같은 데이터의 형태를 String 이라는 클래스변수로 정의하겠다는 의미이며
[] 는 배열을 의미합니다.
연속적인 데이터를 하나의 변수에 넣고싶을때 즉 배열에는 인덱스가 있고
[0] , [1], [2] 와같이 인덱스로 구분되는 공간에 데이터를 넣겠다는 의미이며
args 는 단순한 변수명입니다. 아무변수명이나 넣어도 상관없죠~
이걸 조합하면
연속적인 문자열 데이터가 들어가는 저장공간 이라고 생각하며 됩니다.
public class SampleProject { public static void main(String[] args) { args = new String[3]; //3개의 저장공간을 가진 배열 초기화 args[0] = "안녕"; //배열의 첫번째 공간에 데이터입력 args[1] = "반가워"; //배열의 두번째 공간에 데이터입력 args[2] = "버물리라고해"; //배열의 세번째 공간에 데이터입력 System.out.println(args[0]); System.out.println(args[1]); System.out.println(args[2]); } }
실제로 사용은 위의 예제 처럼 사용하지 않습니다. 자세한 내용은 생략하였으나 커맨드라인(command-line) 에서 클래스 호출시
넘겨받는 argumets 입니다. 사용은 아래처럼 할 수 있습니다.
public class SampleProject { public static void main(String[] args) { if( args.length < 3 ){ System.out.println("전달되는 argumets 의 갯수가 3개 이상이어야 합니다."); return; } for( int i=0; i < args.length; i++ ){ System.out.println(args[i]); } }
1. 커맨드라인 ( [ windows키 ] +[ r ] -> cmd ) 에 들어간다음 현재 클래스가 있는 경로로 이동합니다.
2. javac 자바클래스명.java 를 입력하고 [ Enter ] 를 치면 .class 파일이 생성됩니다.
3. java 클래스명 문자열1 문자열2 문자열3 를 입력하고 [ Enter ]
> javac SampleProject.java > java SampleProject 문자열1 문자열2 문자열3 문자열1 문자열2 문자열3 > java SampleProject 문자열1 문자열2 전달되는 argumets 의 갯수가 3개 이상이어야 합니다.
주로 이클립스가 실행환경이다 보니 위처럼 사용하는 경우가 드물지만
별도의 모듈로 분리하여 사용할 경우에 전달되는 값에 따라 다르게 동작할 필요가 있을 수 있습니다.
그럴때 위처럼 사용합니다.
위 예제 실행시 만약 컴파일 과정에서
unmappable character for encoding MS949
와 같은 에러 발생시 옵션으로 인코딩 타입을 지정해주어야 합니다.
> javac SampleProject.java -encoding UTF-8
자 다이해가 되셨나요? 처음에는 이해하기 어렵다더라도 현재
나온 내용들은 나중에 다시한번 자세히 나오기때문에
현재에는 이 정도만 알면 충분하다 생각합니다.
잘못된 정보 공유시 바로 수정하도록 하겠습니다.
다음엔 더 자세한 내용으로 찾아뵙겠습니다.
'개발 > Java' 카테고리의 다른 글
[JAVA/자바] SFTP 파일업로드/다운로드 (2) | 2017.04.06 |
---|---|
[JAVA/자바] 파일압축하기 ( jazzlib, apache.commons.compress ) (5) | 2017.04.06 |
[JAVA] 이클립스 프로젝트 생성 및 실행 방법 (0) | 2015.02.24 |
[JAVA] 이클립스 설치방법 (0) | 2015.02.24 |
[JAVA] JDK 환경변수 설정 (0) | 2015.02.23 |