본문 바로가기

개발/Java

[JAVA] 메인메소드 public static void main(String[] args) 를 이해하자


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


자 다이해가 되셨나요? 처음에는 이해하기 어렵다더라도 현재 

나온 내용들은 나중에 다시한번 자세히 나오기때문에

현재에는 이 정도만 알면 충분하다 생각합니다.


잘못된 정보 공유시 바로 수정하도록 하겠습니다.


다음엔 더 자세한 내용으로 찾아뵙겠습니다.