본문 바로가기
Java/Java Basic

[Java Basic] 1. Java 구성 및 Java 코드의 동작 과정

by Rosmary 2022. 6. 20.
728x90
반응형

 

 

 

 

 

Java는 프로그래밍 언어 중 하나이며 서버, 웹 프로그래밍 등 다양한 분야에서 활용되고 있다. 특히 국내 IT 업체의 경우 전자정부프레임워크라는 녀석으로 인해 공공기관에 들어가는 대부분의 어플리케이션이 Java와 Spring(웹 프레임워크)로 획일화되어, 개발자 양성 학원에서도 머신러닝이나 빅데이터처럼 특정 언어를 사용하는 과정이 아니라면 - 취업률 향상을 위해 - 대부분 Java를 기본으로 교육하고 있다.

 

여러 포스팅에서 밝혔듯이 필자는 최근 개발쪽으로 전직이 되었으나, 필자의 주력은 Linux Bash와 Python 이다. Java를 배우지 않아도 되는 환경이라면 상관이 없겠지만, 필자가 해외로 나갈 것이 아닌 이상 - 해외에서는 국내와 달리 다양한 언어 생태계가 존재한다 -  Java도 분명 익숙해져야 할 필요는 있다.

 

다행히 필자 개인적인 이유로 여유 시간이 약 한 두 달 정도 생겼다. 이 시간동안 필자도 다른 포스팅을 마무리하는 동시에 Java 학습도 병행해서 진행해보려한다. 물론 밀린게 많아서.. 남은 시간동안 다 끝내지는 못하겠지만 말이다. 

 

필자는 Python 때와 달리, IDE(통합개발환경, Integrated Development Environment)를 사용할 예정이다. 따라서 필자의 포스팅을 참고하고자 한다면 아래의 프로그램을 필히 설치하자.

 

-  Java 14.0.2 JDK

-  Eclipse  :  Java IDE 프로그램이다. 

 

두 프로그램을 윈도우에 설치하는 과정은 여기저기 널려있다. 굳이 필자가 포스팅하지 않더라도 자료는 많으니 설치하는데 큰 어려움은 없을 것이다. 

 

 

 

1. Java의 구성 

 

-  JDK = JRE + Java 명령어

-  JRE = JVM + Java 기본 클래스 라이브러리

-  JVM = Java 실행을 위한 가상머신(에뮬레이터)

 

(1) JDK

 

Java 설치 파일 명을 보면 JDK 라는 이름이 들어가 있다. 이 JDK 는 Java Development Kit로 말 그대로 개발 도구를 말한다. 이 프로그램이 정상적으로 설치되어야 Java로 만들어진 코드가 정상적으로 컴파일 및 실행된다.

 

이 JDK는 JRE와 Java 코드로 작성된 프로그램 실행을 위한 최소환경(명령어)을 제공한다.

 

 

(2) JRE

 

JRE는 Java Runtime Environment의 약자로 Java 실행환경을 의미한다. 이 JRE는 JVM이라고 불리는 가상머신과 기본 Java 클래스 라이브러리를 제공한다. 기본 클래스 라이브러리는 Python으로 예를 들면 os 패키지와 같이 pip로 별도의 설치 없이 사용할 수 있는 라이브러리라고 보면 된다. 

 

 

(3) JVM

 

JVM은 Java Virtual machine의 약자로 Java 가상 머신을 뜻한다. 보통의 프로그램이 OS와 직접 커뮤니케이션을 진행하면서 동작하는 것과 달리, Java 언어로 생성된 코드들은 JVM이 OS와 코드 사이에서 마치 통역자와 같은 역할을 한다고 보면 된다. Java 코드는 사람이 이해할 수 있는 언어인 반면 OS는 0, 1로 구성된 기계어만 인식할 수 있다. 따라서 사람이 작성한 언어를 Compile이라는 과정을 거쳐 기계어로 변환한 파일(Binary 파일이라고 하며 Java에서는 .class라는 확장자를 가진다)을 만들게 되며 이 class 파일을 JVM을 통해 실행함으로써 OS에서 프로그램을 구동할 수 있는 것이다. 


Python과 차이를 보면 쉬운데, Python은 인터프리터 언어로 코드 한 줄 한 줄을 기계어로 변환하면서 코드를 실행한다. 그래서 코드에 이상이 발생하기 전 단계까지는 무슨일이 있어서 코드가 수행된다. 하지만 Java의 경우 소스코드 전체를 통으로 기계어 번역(Compile)하는 컴파일 언어이기 때문에 컴파일러(compiler)라는 별도의 장치(?)가 설치되어야 한다. Java는 컴파일러가 JVM에 내장되어있기 때문에, 어떤 OS에서 만들어진 코드라도 JVM이 설치된 다른 OS에서 거의 문제없이 동작할 수 있다. 이 때문에 Java를 OS에 종속되지 않고 사용할 수 있는 언어라고 말하기도 한다. 

 

좌 - Java 아키텍쳐, 우 - 일반 프로그램 아키텍쳐

 

물론 JVM의 경우 OS에 종속적이다. 따라서 JDK의 경우 window나 Linux용으로 설치파일이 따로 구분되어 있다. 

 

 

 

 

(4) Java 명령어

 

Java를 설치하고 CMD 창에서 PATH 환경 변수 추가까지 완료했다면, 아래의 명령어 사용 시, CMD 창에서 명령어를 인식할 것이다.

 

-  javac    : Java 소스 코드를 binary class 파일로 변환하는 명령어

-  java      : 컴파일 완료된 binary class 파일의 실행 명령어

-  javap    : 컴파일을 통해 변환된 class 파일을 원래의 코드로 돌리는 역컴파일 명령어

-  javadoc: Java class 코드의 주석을 참고하여 Java API 문서를 생성하는 명령어.

-  jar         : Java 파일 압축 및 해제 명령어.

 

Java 명령어들의 사용은 추후 포스팅에서 예시를 통해 알아볼 예정이다. 우선 명령어가 정상적으로 동작하는지 확인하자.

 

 

 

 

2. Hello World 출력

 

타 프로그래밍 언어와 달리 Java는 Hello world 출력을 위해 진행해야 할 것이 상당히 많다. 코드 작성 길이도 길고 말이다. 왜 이렇게 장황하게(Verbose) 작성해야하는지는 추후 포스팅을 통해 언급하려 한다. 우선은 따라하자. 방법이 없다.

 

Eclipse 설치가 완료되었다면 Eclipse를 실행하자. Eclipse를 처음 실행했다면 다음과 같이 welcome 페이지가 나타날 것인데, 여기서 "Create a new Java project"를 선택하자. 만약 welcome 페이지가 나타나지 않는다면 메뉴에서 File -> New -> Java Project를 클릭하면 된다.

 

 

프로젝트 이름 및 프로젝트 파일의 경로를 지정해준다. 필자의 경우 Eclipse 프로젝트 경로를 미리 지정해주어 Default Location 경로를 사용한다.

 

 

지정한 프로젝트 폴더 경로로 이동하면 Project Name으로 지정한 Hello로 폴더가 생성된 것이 보이며, 해당 폴더 내에는 src, bin 등의 폴더가 자동 생성된 것을 확인할 수 있다.

 

 

 

src 폴더는 말 그대로 java로 작성한 소스 코드를 저장하는 경로고, bin은 소스코드의 컴파일로 생성된 Binary class 파일의 저장 경로다. Next 버튼을 누르면 이 두 경로에 대해 설정하는 창이 나타나는데, 우선 기본 값으로 지정하고 진행하려 한다. Finish를 눌러 프로젝트 생성 과정을 마무리하자.

 

 

Finish 버튼을 누르면 모듈을 만들것인지 묻는 창이 나타나는데, 모듈까지 쓰지는 않을 예정이니 Don't Create 버튼을 선택하여 마무리한다.

 

 

마무리가되면 프로젝트가 만들어지는데, 화면에 아무 것도 나타나지 않는다. 좌측 트리구조에서 src 파일을 열면 아무것도 없기 때문인데, 이제 src 폴더 내에 우리가 작성할 소스코드 파일을 생성해주어야 한다.

 

 

 

src 폴더를 우클릭한 뒤, New -> File 을 선택한다.

 

 

클릭하면 파일명을 작성하는 부분이 나타나는데, 첫 글자를 반드시 대문자로, 확장자는 .java로 지정한다. 필자는 프로젝트 명과 동일하게 파일명을 작성(Hello.java)하려 한다.

 

 

Finish를 누르면 src 폴더에 Hello.java 파일이 생성된 것이 보이며, 해당 파일에 코드를 작성할 수 있는 창이 나타나는 것을 확인할 수 있다. 이제 Hello, World를 출력하는 코드를 아래와 같이 작성하고 저장한다.

 

대/소문자 확인 및 주석을 잘 참고해서 작성하자. 주석(//) 부분은 작성하지 않아도 된다.

 

메뉴바를 보면 마치 재생 버튼과 비슷하게 생긴 아이콘이 보이는데, 이 아이콘을 클릭하면 필자가 작성한 Hello.java 파일의 컴파일과 실행이 동시에 진행된다. 

 

 

 

코드가 정상적으로 작성되었다면 다음과 같이 하단의 콘솔창에 Hello World가 출력된다.

 

 

만약 코드에 이상이 있다면 에러가 발생한다. 가령 class 이름이 파일명과 일치하지 않는 경우 아래와 같이 에러 발생 및 발생 원인이 콘솔에 표시된다.

 

파일명인 Hello와 일치하는 class 이름이 없어 나타난 에러다. 이 코드의 class 명은 hello다.

 

정상적으로 코드가 동작했다면 아래와 같이 Hello 폴더 아래 bin 폴더에 Hello.class 파일, 즉 소스코드로부터 컴파일이 완료된 Binary Class 파일이 생성되어 있을 것이다. 즉, Eclipse에서 필자가 'Run Hello' 아이콘, 즉 재생 버튼 아이콘을 클릭함으로써 필자가 작성한 Hello.java의 컴파일, Binary Class 파일 생성, Binary Class 파일 실행까지 한 번에 진행된 것이다.

 

 

이를 IDE가 아닌 CMD 창에서도 진행할 수 있다. src 폴더의 Hello.java 파일을 바탕화면으로 복사한 뒤 CMD 창에서 아래의 명령어를 입력해보자. 

 

#  javac Hello.java 

#  java Hello                               * class 명인 Hello 만 입력한다. 파일 확장자까지 입력하면 실행되지 않는다.

 

 

 

 

3. Java 코드의 동작 과정

 

소스코드로부터 컴파일 및 실행되는 과정은 다음과 같다.

 

(1) 소스 코드 작성(Hello.java 파일)

(2) 소스 코드 컴파일 (javac 명령어로 Hello.java 파일의 class명으로 .class 파일 생성, javac Hello.java)

(3) 컴파일 완료된 class 파일명과 함께 java 명령어 실행 (java Hello)

  -> 이 때 소스 코드의 main 함수를 먼저 참조한다. 따라서 class 내에 main 함수가 없다면 Hello World는 출력되지 않는다.

(4) Hello.class 내 Hello World 출력 진행

 

하나 특이한 점이 있는데, CMD를 통해 java 파일을 컴파일하는 경우, class 명이 반드시 .java 파일명과 일치하지 않아도 실행이 가능하다는 것이다. Eclipse에서는 위의 네 과정이 한 번에 진행되었기 때문에, class 이름이 파일명과 일치하지 않는 경우 실행되지 않았다. 하지만 .java의 class 이름을 hello로 변경한 뒤 CMD에서 컴파일을 진행하면 에러 없이 hello.class 파일이 생성된다. 그리고 java hello로 클래스 파일을 실행하면 에러 없이 Hello World가 출력되는 것을 확인할 수 있다.

 

 

 

4. java 파일의 작성 규칙

 

사실 .java 파일을 작성하기 위해서 접근제어자(access modifier)를 비롯하여 알아야 할 것이 한 두 가지가 아니다. 하지만 앞서 보았던 Java의 동작 과정을 복기하면서 기본적인 부분에 대한 내용만 간단히 짚으려 한다.

 

- .java 파일은 하나 이상의 Class를 정의하는 파일이다.

- 하나의 .java 파일은 main 함수를 포함하는 클래스를 반드시 가지고 있어야 한다. 

 

 

(1) .java 파일은 하나 이상의 Class를 정의하는 파일이다.

 

위의 예시를 자세히 봤으면 어느정도 짐작하겠지만, Java는 .java 파일에 정의된 class를 Binary 파일로 컴파일하며, 해당 class 내에 정의된 main 함수를 실행한다. 따라서 .java 파일은 반드시 하나 이상의 class가 정의되어 있어야 한다. 

 

필자가 만약 Hello.java 파일에 다음과 같이 class none이라는 클래스를 하나 더 추가한다고 해보자.

 

사실 클래스 명은 암묵적으로 대문자로 시작하게 되어 있다.

 

.class 파일이 .java에 정의한대로 Hello와 none 이라는 이름으로 두 개 생성된 것을 확인할 수 있다.

 

 

(2) 하나의 .java 파일은 main 함수를 포함하는 클래스를 반드시 가지고 있어야 한다. 

 

각각의 class 파일을 java 명령어로 실행하면 main 함수가 존재하지 않는 none 클래스는 에러가 발생하는 것을 알 수 있다. 만약 Hello 클래스를 정의한 부분에도 main 함수가 없다면, 당연히 Hello.java 코드 내용 역시 에러가 발생하게 된다.

 

 

컴파일과 실행이 동시에 일어나는 Eclipse의 경우, .java 파일명과 동일한 class에 main 함수가 정의된 경우에만 코드가 정상적으로 동작한다. 물론 필자가 추가로 정의한 none.class 파일도 같이 생성되나, 코드 내에서 사용되지 않기 때문에 사실상 쓸모없는 코드다.

 

class Hello의 main 함수명을 test로 변경하였을 때 발생하는 에러는 Hello Class의 main 함수가 없어 실행할 수 없다는 뜻이다.

 

** 참고로 none class의 none 출력 코드를 실행하기 위해 아래와 같은 방법을 사용하는데... 이건 한~~~참 뒤에 객체 지향 부분을 포스팅하면서 설명할 내용이다. .java 파일에 복수의 class 가 정의되어 있어도 사용이 가능하다고만 알아두자.

 

 

 

(3) 코드 마지막은 세미콜론(;)으로 마무리한다.

 

Python을 프로그래밍 시작 언어로 시작했다면 많이 실수할 수 있는 부분이며 에러 발생 시 가장 찾기 어려운 부분이다. Java의 경우 C로부터 파생된 언어라, C와 마찬가지로 모든 코드 라인의 마무리를 세미콜론(;)으로 끝내게 되어 있다. 별 것 아닌 것 같지만 필자의 경우 이 세미콜론 때문에 고생을 조금 많이 한 케이스다. Python에 익숙한 분들이라면 세미콜론에 익숙해지기까지 어느정도 시간이 걸린다. 

 

 

 


 

지금까지 window CMD와 Eclipse를 통해 Java의 구성과 Java 소스 파일의 실행까지의 동작 과정을 살펴보았다. 다음 포스팅에서는 Java의 변수 선언에 대해 알아보려 한다.

 

 

 

Fin.

반응형

댓글