Kyu Today at 8:58 PM
질문:
같은 패키지 안에 여러 메인클래스가 있을때요.
예를들어서, class1, class2, class3이 있고 모두 메인클래스입니다
class1에 실행되지 않는 코드가 있다고 칩시다.
class3의 로직을 실행시키기 위해서 class3을 Run했는데 왜 class1때문에 실행이 되지 않는거죠?
모두 메인메소드이기때문에 모두 독립적으로 작동한다고 생각했는데 제가 틀렸나요?
7 replies
Shion 40 minutes ago
Run을 하게 되면 전체 소스코드를 컴파일하고 실행하게 되는데, class1에 있는 실행되지 않는 코드가 문법에 어긋난 코드라면, 컴파일 단계에서 오류가 발생하기 때문에 실행으로 넘어가지 못하는게 아닐까요??
Kyu 31 minutes ago
하나의 프로젝트 파일이 있으면, 프로젝트 하위에 있는 모든 파일을 컴파일하기 때문에 그런거죠? 애초에 한 프로젝트 안에 두개 세개 이상의 다른 목적을 가진 프로그램을 돌릴 이유가 없으니..그런거죠? 연습할때는 한 디렉토리에 저장하려다보니 이런 궁금증이 생기는걸까요? 근데 적다보니까 이상한게 애초에 왜 프로젝트는 한개인데 메인메소드가 여러개가 생성되도 에러가 안날까요?
Shion 22 minutes ago
제 생각에는 여러 클래스에 메인메소드가 있어도 결국 하나의 클래스 파일만 Run해서 그 안에 있는 메인메소드를 실행하는 것이기 때문에 자바에서 여러 클래스가 각각 메인메소드를 가지는 것을 허용하는 것 같습니다. (edited)
Shion 21 minutes ago
물론 한 클래스 안에 메인메소드가 여러개 있으면 안되겠죠.
Kyu 12 minutes ago
근데 메인메소드인 class3을 실행했는데 또다른 메인메소드인 class1 에 에러가 있으면 실행하지 않는걸 보면 class1을 실행하진 않아도 에러가 있는지 여부를 이걸 실제로 실행하는 거와 관계없이 컴파일하면서 먼저 전부 체크해서일까요?
Shion 9 minutes ago
큐가 하신 말씀이 맞아요! 컴파일 단계에서 먼저 에러가 발견되서 실행조차 안되는 거죠
Kyu 6 minutes ago
오늘 JK 프레젠테이션에서 본건데 기억이 안나네요. 여튼 시온이랑 계속 대화하니까 결론에 닿았습니다 감사합니다!ㅋㅋㅋ
Pyro(고정완) 8 hours ago
Class1, Class2, Class3 가 독립된 자바 파일로 분리가 되어있다면,
각각의 main 메소드를 실행하는데 문제가 되지 않습니다.
컴파일 때도, Class의 코드를 실행하는게 아니라, 객체단위로 컴파일을 하는 작업만 하기에,
독립된 자바 파일에 main 메소드들이 있어도 컴파일이 잘 되어야 합니다.
컴파일이 안되는건 main 메소드 때문은 아닌 것 같습니다.
Pyro(고정완) 8 hours ago
컴파일 후, 자바 코드를 run 할 때 어떤 클래스의 main 메소드를 실행할 것인지 지정하지 않으면 위와 같은 상황에서 실행해주는 프로그램이 혼란에 빠질 수는 있습니다.
실행 시 어떤 클래스가 main 인지 지정하시나요?
Kyu 4 hours ago
@Pyro(고정완) 넵, 어떤 클래스의 main 메소드를 실행한지 지정한거 같은데, 혹시 제가 잘못이해하고 있는거 같아서 영상녹화로 한번 설명해봤습니다 1분까지만 보시면됩니다.
Kyu 4 hours ago
소리가 좀 작네요 소리좀 키워주세요 죄송합니다;;
Pyro(고정완) 41 minutes ago
확인했습니다
Pyro(고정완) 40 minutes ago
영상에서 Class1 이 컴파일 불가능한 파일로 만든 후, Class3 가 실행되지 않는다고 했는데
Pyro(고정완) 40 minutes ago
당연한 이야기지만, IntelliJ 에서 빌드는 패키지 단위로 이루어집니다.
Pyro(고정완) 40 minutes ago
저 에러 메시지는 빌드가 실패했다고 뜨고 있습니다.
Pyro(고정완) 39 minutes ago
빌드에 실패해서 빌드한 결과물이 없으니, 실행을 할 수 없고 실행된 결과가 아니라, 왜 빌드를 실패했는지 결과를 IDE 에서 알려주는 것이죠
Pyro(고정완) 38 minutes ago
만약 IntelliJ 가 아니라, 터미널 창에서 java 컴파일 명령에서 직접 옵션을 주어가며 Class1을 배제하고 빌드하도록 하면 당연히 잘 실행될겁니다
Pyro(고정완) 37 minutes ago
패키지 단위로 빌드를 하는 IntelliJ 개발환경의 특성이라고 이해해주세요. 덕분에 개발자는 패키지의 문제점을 미리미리 캐치해낼 수 있습니다.
Pyro(고정완) 37 minutes ago
왜냐하면 자바는 본인이 개발해낸 결과물이 패키지 단위로 배포되기 때문입니다. 빌드조차 되지 않는 패키지를 미리 방지하는 것이죠
Pyro(고정완) 36 minutes ago
반대로 자바스크립트 같은 경우에는 코드간의 의존성이 없다면, 위와 같은 상황에서 IDE 가 에러 메시지를 띄워주지 않습니다.
Pyro(고정완) 29 minutes ago
중간에 컴파일을 단어를 쓰다가 빌드라는 용어를 쓰게 되어서 헷갈릴 여지를 없애기 위해 추가로 말씀드리면
Pyro(고정완) 29 minutes ago
컴파일은 작성한 코드를 기계어로 바꾸는 작업을 뜻하고
Pyro(고정완) 28 minutes ago
빌드는 개발자가 작업해낸 패키지를 작동가능한 프로그램으로 만드는 작업을 뜻합니다
Pyro(고정완) 28 minutes ago
패키지안에 이미지나 동영상 같은 파일이 포함될 수도 있고
Pyro(고정완) 27 minutes ago
이미지는 코드가 아니지만, 잘못된 이미지를 참조하여도 마찬가지로 빌드가 실패해서 IDE 가 에러메시지를 띄워주므로
Pyro(고정완) 27 minutes ago
패키지 단위를 이야기할 때는 빌드를 실패했다는 표현을 썼습니다.
현재와 같은 상황에서는 빌드를 실패한 이유가 잘못된 자바 문법으로 인한 컴파일 실패지만요
Kyu 2 minutes ago
읽고 이해한 것을 한번 확인하기 위해서 제 식대로 다시 정리해볼게요.
인텔리제이에서 실행Run을 누르면 인텔리제이가 내가 만든 패키지(들)를 빌드한다.
빌드한다는 말은 자바는 패키지 단위로 배포되는데 인텔리제이에서는 빌드조차 되지 않는 패키지를 미리 방지한다.
지금 Class1,2,3 의 예제의 경우에는 Class1에 코드에 문제가 있기때문에 빌드가 되지 않는다는 것을 인텔리제이에서 출력한 것이다.
만약에 터미널에서 이런저런 옵션을주어서 Class1은 빼고 빌드하도록 한다면 정상적으로 작동할 것이다.
이런 이유로 이미지는 코드가 아니지만 이미지를 잘못참조해도 빌드가 실패하고 인텔리제이가 에러메시지를 출력할것이다.
그리고 이런 특성때문에 개발자는 패키지의 문제점을 미리 파악할 수 있어서, (나중에 회사에서 안깨질수있다.)
참고: 컴파일은 코드를 기계어로 바꾸는 작업, 빌드는 개발자가 작업해낸 패키지를 작동가능한 프로그램으로 만드는 작업
읽다보니깐 저도 궁금증이 생겼는데 덕분에 이해하고 넘어갑니다👏👏