`지식인 펌`

아래는 애플릿 소스인데요 여기서 class 앞에 public을 안쓰면 왜 안될가요? 실행시키면 애플릿창에

start를 초기화시키지 않았다고  나와요..public을 쓰면 접근제한이 없다는건 아는데 여기서 쓰는거랑

안쓰는거랑 뭐가 다른거죠?  자꾸 헛갈리네요~~

import java.applet.*;
import java.awt.*;
 
public class DrawingLines extends Applet {
 
 
   int width, height;
 
     public void init() {
          width = getSize().width;
      height = getSize().height;
        setBackground( Color.black );
   }
 
    public void paint( Graphics g ) {
          g.setColor( Color.green );
          for ( int i = 0; i < 10; ++i ) {
                g.drawLine( width, height, i * width / 10, 0 );
      }
   }
}

그리구요 public static void main(String[]  args){}이 무엇을 의미하는지도 가르쳐주세요...

 

답변 부탁드립니다~~


---------------------------------------------------------
애플릿를 사용하실때는 반드시 public를 사용하셔야 합니다.

자바에는 전부 4가지의 접근제한자가 있는 것은 아실것입니다.

 

public , protected , private , 아무것도 쓰지 않는 default 입니다.

 

예를 들어 default 같은 경우 패키지내에서는 public 이고 다른 패키지에서는 private로 간주합니다.

 

그러므로 애플릿에서 public이 아닌 다른 제한자를 사용하면

해당 애플릿은 그 서버에서만 실행되고 다른 사용자들 즉 어떠한 웹 브라우저등을 사용하여

접근하려하는 사람들은 실행이 불가능 하게 되겠죠.

이럴때 해당 애플릿은 쓸모가 없는 것이 되고 말아 버리겠죠.

때문에 애플릿은 반드시 public으로 선언되야 합니다.

 

그리고...

public static void main(String[]  args){} 의 의미를 질문하셨는데요.

보통 이것은 메인 메소드라고 부르죠.

모든 프로그램마다 그 프로그램이 어디에서 부터 시작되어야 하는지를 알려줘야

시작점을 알고 프로그램을 실행시킬수 있겠죠.

 

길게 소스를 썼다고 가정했을때 그 프로그램에서 시작이 어딘지 알수 없으면

실행이 되지 않을테니까요.

이렇게 시작점을 알려주는 포인트를 엔트리 포인트 ( entry point ) 라고 합니다.

바로 이 엔트리포인트가 main메소드가 되는것이죠.

 

자 이젠 본격적으로 public static void main(String[]  args){} 에 대한 설명을 해보자면...

 

어려운 설명들은 버리고 쉽게 말하자면...

 

위에서도 언급했다시피 메인메소드는 엔트리포인트입니다.

그러므로 반드시 public 이어야만 하겠죠.

시작점이기 때문에 어디에서든지 접근이 가능해야만 합니다.

시작점인데 어딘가에서 접근을 제한해버리면 문제가 발생할수도 있겠죠.

그래서 이렇게 정해 놓은 것입니다.

 

그리고 자바에서 메인메소드는 static 이어야합니다. 

static 키워드에대해서는 잘 알고 계시겠지만

메인 메소드는 항상 정적이어야 하기 때문입니다.

 

이부분에 대해서는 여러가지 설명들이 많은데요

일단 클래스는 메모리에 로딩된 다음에 사용할수 있는데요

static 은 자동으로 로드 됩니다.

메인메소드는 엔트리포인트입니다. 클래스로딩 없이 호출을 할수 있어야 겠죠.

그러므로 메인메소드에 반드시 사용되야 합니다. 

클래스가 실행되기 위해선 그 클래스를 동작하게 해줄 메소드가 있어야 하니까요.

 

어떤 책에는 static 키워드는 정적의 의미로 컴파일단계에서 알아서 생성을 해주기 때문에

가장 먼저 생성이 된다고 나온것도 있더군요. 그러므로 엔트리포인트에 해당하는

메인메소드에서 사용이 된다고 말이죠.

 

void는 리턴타입이 없다는 의미입니다.

생각해보면 너무 당연하겠지만 메인메소드는 엔트리포인트 입니다.

그리고 프로그램의 끝이기도 하겠죠.

메인에서 시작해서 메인이 끝나면 그 프로그램도 끝입니다.

그러므로 리턴하는 값 자체가 불필요 하겠죠.

프로그램이 끝났는데 마지막에 어떤값을 리턴해봤자 아무런 소용도 없는 행동이니까요.

그래서 메인은 void입니다.

 

자 이제 인자부분에 String[]  args 이 왜 있는 것일까 생각해 보겠습니다.

String[]  args 라는 매개변수를 왜 사용했을까요

엔트리 포인트인데 어떻게 매개변수를 넘겨줄수 있을까요

자바에서는 실행시에 스트링형식으로 매개변수를 보내서 실행을 시킬수도 있습니다.

1개만 쓸수도 있고 여러개를 사용할수도 있겠죠 그래서 배열을 사용합니다.

이렇게 실행할때 인자값을 줄수도 있기때문에

String[]  args 를 사용해야 하는것이죠.

처음 실행시에는 인자를 보내지 않아도 됩니다.

그럴때에는 알아서 매개변수 부분을 무시해줍니다.

그리고 args는 그냥 매개변수의 이름일 뿐입니다. 그냥 a라고 써도 되고 aaa라고 써도 무방합니다.

 

마지막으로 왜 꼭 순서가 public static void main(String[]  args){}이 되야 할까요.

사실 public 과 static 은 순서가 바뀌어도 됩니다.

하지만 void는 리턴타입이므로 반드시 메소드명 앞에 와야 합니다.

 

예를들면 ...

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

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

public static void main(String[]  a){}

static public void main(String[]  abc){}

public static void main(String aa []){}

static public void main(String ab []){}

 

이런것들이 전부 맞는것이죠.

 

'📌 java > Object-oriented Programming' 카테고리의 다른 글

java - accesor, mutator  (0) 2020.03.31
java - method call  (0) 2020.03.31
Homework_W2-02  (0) 2020.03.27
Employee.java  (0) 2020.03.27
LotteryDrawing.java  (0) 2020.03.26
복사했습니다!