Saturday, October 18, 2025

자바 개발 환경의 초석: JDK 설치부터 첫 코드의 탄생까지

프로그래밍의 세계에 첫발을 내딛는 것은 설레면서도 동시에 막막하게 느껴질 수 있습니다. 수많은 언어 중에서 '자바(Java)'는 지난 수십 년간 엔터프라이즈 시스템, 안드로이드 애플리케이션, 빅데이터 솔루션 등 다양한 분야에서 그 견고함과 안정성을 입증하며 개발자들의 꾸준한 사랑을 받아왔습니다. 자바의 철학인 "한 번 작성하면, 어디서든 실행된다(Write Once, Run Anywhere)"는 오늘날의 다양한 컴퓨팅 환경 속에서 더욱 빛을 발합니다. 이 글은 이제 막 자바의 세계로 뛰어들려는 여러분을 위한 첫 번째 이정표입니다.

단순히 "Hello, World!"를 출력하는 것을 넘어, 자바가 어떤 원리로 동작하는지, 개발 환경을 구성하는 JDK, JRE, JVM은 각각 어떤 역할을 하는지, 그리고 왜 특정 방식으로 코드를 작성해야 하는지에 대한 근본적인 이해를 돕는 데 초점을 맞출 것입니다. 명령 프롬프트의 검은 화면 위에서 첫 코드를 컴파일하고 실행하는 경험은 앞으로 여러분이 마주할 복잡한 프로젝트의 단단한 기초가 되어줄 것입니다. 이 여정을 통해 여러분은 단순한 코드 작성자가 아닌, 컴퓨터와 소통하는 원리를 이해하는 개발자로 성장하게 될 것입니다.

1. 자바 개발의 심장: JDK, JRE, JVM 파헤치기

자바 개발을 시작하기 전에, 우리는 세 가지 중요한 약어와 마주하게 됩니다: JDK, JRE, JVM. 이들은 서로 긴밀하게 연결되어 자바 생태계를 구성하는 핵심 요소입니다. 각각의 역할을 명확히 이해하는 것은 자바의 동작 방식을 파악하는 첫걸음입니다.

JVM (Java Virtual Machine, 자바 가상 머신)

JVM은 자바의 가장 핵심적인 개념이자 "한 번 작성하면, 어디서든 실행된다"는 철학을 가능하게 하는 주체입니다. JVM은 말 그대로 '가상의 컴퓨터'입니다. 우리가 작성한 자바 코드가 컴파일되면, 이는 특정 운영체제(Windows, macOS, Linux 등)가 직접 이해할 수 있는 기계어가 아닌, JVM만이 이해할 수 있는 중간 언어인 '자바 바이트코드(Java Bytecode)'로 변환됩니다. 그리고 각 운영체제에 맞게 설치된 JVM이 이 바이트코드를 해당 운영체제가 이해할 수 있는 기계어로 해석하고 실행합니다.

이러한 구조 덕분에 개발자는 운영체제별로 코드를 따로 작성할 필요 없이, 오직 자바 문법에만 집중하여 코드를 작성하면 됩니다. 운영체제와의 호환성 문제는 각 운영체제에 맞는 JVM이 알아서 처리해주는 것입니다. JVM은 이외에도 메모리 관리(Garbage Collection), 보안, 스레드 관리 등 자바 애플리케이션 실행에 필요한 중요한 작업들을 수행합니다.

JRE (Java Runtime Environment, 자바 실행 환경)

JRE는 자바 애플리케이션을 '실행'하는 데 필요한 모든 것을 담고 있는 패키지입니다. 만약 여러분이 개발자가 아니라, 다른 사람이 만든 자바 프로그램을 실행하기만 하면 되는 사용자라면 JRE만 설치하면 됩니다. JRE는 내부적으로 JVM을 포함하고 있으며, 그 외에 자바 프로그램이 실행될 때 필요한 핵심 라이브러리(Java API)들을 함께 제공합니다.

정리하자면, JRE = JVM + 핵심 라이브러리 (Java API) 입니다. JRE는 자바 프로그램을 실행할 수 있는 환경을 제공하지만, 새로운 프로그램을 '개발'하는 데 필요한 도구들은 포함하고 있지 않습니다.

JDK (Java Development Kit, 자바 개발 도구)

JDK는 자바 개발자를 위한 완전한 패키지입니다. 이름에서 알 수 있듯이 자바 애플리케이션을 '개발'하는 데 필요한 모든 도구를 포함합니다. 당연히 개발한 프로그램을 실행하고 테스트해야 하므로, JDK는 JRE를 완전히 포함하고 있습니다. JRE가 JVM과 핵심 라이브러리를 포함하므로, 결과적으로 JDK는 JRE와 JVM을 모두 포함하는 가장 상위의 개념입니다.

JDK에는 JRE 외에도 다음과 같은 중요한 개발 도구들이 포함됩니다:

  • javac: 우리가 작성한 자바 소스 코드(.java 파일)를 JVM이 이해할 수 있는 바이트코드(.class 파일)로 변환해주는 컴파일러입니다.
  • java: 컴파일된 바이트코드(.class 파일)를 JVM을 통해 실행시키는 런처(launcher)입니다.
  • javadoc: 소스 코드 내의 주석을 기반으로 API 문서를 자동으로 생성해주는 도구입니다.
  • jar: 여러 개의 .class 파일과 관련 리소스들을 하나의 .jar 파일로 묶어 배포를 용이하게 해주는 아카이버(archiver)입니다.
  • jdb: 자바 프로그램을 디버깅할 때 사용하는 도구입니다.

결론적으로, JDK = JRE + 개발 도구 (javac, javadoc 등) = (JVM + 핵심 라이브러리) + 개발 도구 입니다. 따라서 자바 개발을 하고자 하는 우리는 반드시 JDK를 설치해야 합니다.

2. 어떤 JDK를 선택해야 할까? Oracle JDK vs OpenJDK

JDK를 설치하려고 마음먹으면 또 다른 선택의 기로에 서게 됩니다. 바로 다양한 종류의 JDK 배포판입니다. 가장 널리 알려진 것은 Oracle JDK와 OpenJDK이며, 이 외에도 여러 기업과 커뮤니티에서 자체적인 OpenJDK 빌드를 제공합니다.

Oracle JDK와 OpenJDK의 관계

과거에는 이 둘의 차이가 명확했지만, 최근에는 그 경계가 많이 허물어졌습니다. OpenJDK는 자바 SE(Standard Edition)의 공식 오픈소스 참조 구현(Reference Implementation)입니다. 즉, 자바 표준의 기반이 되는 프로젝트입니다. Oracle JDK는 이 OpenJDK 소스 코드를 기반으로 하여 Oracle이 자체적인 추가 기능(예: Flight Recorder, Mission Control 등)을 포함하고 상업적 지원을 제공하는 빌드입니다.

과거 Oracle JDK는 특정 버전부터 상업적 용도로 사용할 경우 유료 라이선스가 필요하도록 정책을 변경하여 많은 논란이 있었습니다. 하지만 최신 LTS(Long-Term Support) 버전인 Java 17, Java 21 부터는 'No-Fee Terms and Conditions (NFTC)' 라이선스를 도입하여 프로덕션 환경을 포함한 모든 용도에 대해 무료로 사용할 수 있게 되었습니다.

초보자를 위한 추천: OpenJDK 배포판

그럼에도 불구하고, 초보자에게는 특정 벤더에 종속되지 않는 순수한 오픈소스 기반의 OpenJDK 배포판으로 시작하는 것을 권장합니다. 이는 커뮤니티의 지원을 받기 용이하고, 라이선스 문제에서 완전히 자유로우며, 다양한 기업들이 안정적인 빌드를 무료로 제공하기 때문입니다. 대표적인 OpenJDK 배포판은 다음과 같습니다.

  • Adoptium (구 AdoptOpenJDK): Eclipse 재단이 주도하는 프로젝트로, 가장 널리 사용되는 OpenJDK 빌드 중 하나입니다. 품질과 안정성에 대한 커뮤니티의 높은 신뢰를 받고 있습니다.
  • Amazon Corretto: 아마존 웹 서비스(AWS)에서 제공하고 내부적으로 사용하는 OpenJDK 빌드입니다. 장기적인 지원과 성능 최적화가 특징입니다.
  • Azul Zulu: Azul Systems에서 제공하는 인증된 OpenJDK 빌드로, 다양한 버전과 플랫폼을 지원합니다.
  • Microsoft Build of OpenJDK: 마이크로소프트에서 Azure 서비스 등 자사 제품에 사용하기 위해 빌드하고 유지 관리하는 OpenJDK입니다.

이 글에서는 가장 표준적이고 널리 사용되는 Eclipse Adoptium (Temurin) 배포판을 기준으로 설치를 진행하겠습니다. 또한, 버전 선택에 있어서는 LTS(Long-Term Support) 버전을 사용하는 것이 안정적인 학습과 개발에 유리합니다. 현재 시점에서는 Java 17 또는 Java 21이 좋은 선택입니다.

3. 운영체제별 JDK 설치 및 환경 설정

이제 본격적으로 여러분의 컴퓨터에 JDK를 설치하고, 자바 개발을 위한 환경을 구축해 보겠습니다. 운영체제에 따라 설치 과정이 조금씩 다르므로, 자신의 환경에 맞는 부분을 참고하시기 바랍니다.

3.1. Windows 환경에서 JDK 설치하기

단계 1: Adoptium 웹사이트에서 JDK 다운로드

  1. 웹 브라우저를 열고 Adoptium 공식 웹사이트에 접속합니다.
  2. 홈페이지에서 바로 최신 LTS 버전을 추천해줍니다. 운영체제(Operating System)는 'Windows', 아키텍처(Architecture)는 'x64' (대부분의 최신 PC)가 자동으로 선택되었는지 확인합니다.
  3. '.msi' 확장자를 가진 설치 파일을 다운로드합니다. .msi 파일은 Windows Installer 패키지로, 설치 과정을 그래픽 인터페이스를 통해 편리하게 진행할 수 있도록 도와줍니다.

단계 2: JDK 설치 프로그램 실행

  1. 다운로드한 .msi 파일을 더블 클릭하여 설치를 시작합니다.
  2. 설치 마법사가 나타나면 'Next'를 클릭하여 진행합니다.
  3. 사용권 계약 화면이 나타나면 동의(I accept the terms in the license agreement)에 체크하고 'Next'를 클릭합니다.
  4. 매우 중요한 단계: 'Custom Setup' 화면이 나타나면, 'Set JAVA_HOME variable'과 'Add to PATH' 옵션을 반드시 설정해야 합니다. 각 옵션의 아이콘을 클릭하여 'Will be installed on local hard drive'로 변경합니다.
    • Add to PATH: 이 옵션은 JDK의 `bin` 디렉터리 경로를 시스템의 `PATH` 환경 변수에 추가해줍니다. `PATH`는 운영체제가 명령어(예: `java`, `javac`)를 찾을 때 참조하는 경로들의 목록입니다. 여기에 등록되어야만 명령 프롬프트 어디에서든 `java`나 `javac` 명령어를 바로 실행할 수 있습니다. 만약 이 설정을 하지 않으면, 매번 `C:\Program Files\Eclipse Adoptium\jdk-21.0.1.12-hotspot\bin` 과 같은 전체 경로를 입력해야 하는 번거로움이 있습니다.
    • Set JAVA_HOME variable: 이 옵션은 `JAVA_HOME`이라는 새로운 환경 변수를 시스템에 생성하고, JDK가 설치된 최상위 디렉터리 경로(예: `C:\Program Files\Eclipse Adoptium\jdk-21.0.1.12-hotspot`)를 값으로 설정해줍니다. `JAVA_HOME`은 자바 기반으로 동작하는 다른 개발 도구(예: Maven, Gradle, Tomcat, Spring Boot)들이 JDK의 위치를 참조하기 위해 사용하는 표준적인 환경 변수입니다. 지금 당장 사용하지 않더라도, 향후 개발 생태계 확장을 위해 반드시 설정해두는 것이 좋습니다.
  5. 설정 확인 후 'Next'를 누르고, 마지막으로 'Install' 버튼을 클릭하여 설치를 완료합니다. 관리자 권한을 요구하는 창이 나타나면 '예'를 선택합니다.

단계 3: 설치 확인 및 환경 변수 검증

설치가 올바르게 완료되었는지 확인하는 것은 매우 중요합니다. '명령 프롬프트(Command Prompt)' 또는 'PowerShell'을 열고 다음 명령어를 차례대로 입력해 보세요.

1. 자바 런타임 버전 확인:

java -version

이 명령어를 입력했을 때, 다음과 같이 설치한 JDK의 버전 정보가 나타나면 성공입니다.

openjdk version "21.0.1" 2023-10-17
OpenJDK Runtime Environment Temurin-21.0.1+12 (build 21.0.1+12-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.1+12 (build 21.0.1+12-LTS, mixed mode, sharing)

2. 자바 컴파일러 버전 확인:

javac -version

마찬가지로, 컴파일러의 버전 정보가 `java -version`과 동일하게 출력되어야 합니다.

javac 21.0.1

3. 환경 변수 확인:

설정된 환경 변수 값을 직접 확인할 수도 있습니다. `echo` 명령어를 사용합니다.

echo %JAVA_HOME%

이 명령어는 `JAVA_HOME` 변수에 설정된 경로를 출력합니다. JDK가 설치된 경로가 정확히 나타나야 합니다.

C:\Program Files\Eclipse Adoptium\jdk-21.0.1.12-hotspot

만약 '명령어를 찾을 수 없습니다'와 같은 오류가 발생한다면, 환경 변수 설정이 제대로 되지 않은 것입니다. 이 경우, '시스템 환경 변수 편집'을 직접 열어 `PATH`와 `JAVA_HOME`을 수동으로 설정해야 합니다.

3.2. macOS 환경에서 JDK 설치하기

macOS에서는 Homebrew라는 패키지 관리자를 이용하는 것이 가장 편리하고 일반적인 방법입니다.

단계 1: Homebrew 설치 (이미 설치된 경우 생략)

터미널(Terminal) 앱을 열고, 다음 명령어를 복사하여 붙여넣기 한 후 실행합니다. 이 명령어는 Homebrew 공식 홈페이지에서 제공하는 설치 스크립트입니다.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

설치 과정에서 비밀번호를 묻거나 진행 여부를 확인할 수 있습니다. 안내에 따라 진행하면 됩니다.

단계 2: Homebrew를 이용하여 JDK 설치

Homebrew 설치가 완료되면, 다음 명령어를 통해 Adoptium OpenJDK를 설치할 수 있습니다.

brew install --cask temurin

이 명령어는 최신 LTS 버전의 Temurin JDK를 자동으로 다운로드하고 설치해줍니다. Homebrew Cask는 그래픽 인터페이스를 가진 애플리케이션을 설치할 때 사용됩니다.

단계 3: 설치 확인 및 환경 설정

Homebrew로 JDK를 설치하면 보통 자동으로 환경 변수 설정이 이루어지지만, 확인 및 수동 설정이 필요할 수 있습니다.

1. 설치된 자바 버전 확인:

터미널에서 Windows와 동일한 명령어를 실행합니다.

java -version
javac -version

설치한 버전 정보가 올바르게 출력되는지 확인합니다.

2. JAVA_HOME 환경 변수 설정:

Homebrew는 JDK를 `/Library/Java/JavaVirtualMachines/` 경로에 설치합니다. `JAVA_HOME`을 시스템에 알려주기 위해 쉘 설정 파일을 수정해야 합니다. 최신 macOS는 Zsh(Z shell)을 기본 쉘로 사용하므로, `~/.zshrc` 파일을 수정합니다. (만약 Bash를 사용한다면 `~/.bash_profile` 파일을 수정합니다.)

먼저, 설치된 JDK의 정확한 경로를 확인합니다.

/usr/libexec/java_home -V

이 명령어는 시스템에 설치된 모든 JDK 버전과 경로를 보여줍니다. 이 중에서 사용할 버전의 경로를 복사합니다. 예를 들어, 다음과 같이 출력될 수 있습니다.

Matching Java Virtual Machines (1):
    21.0.1 (arm64) "Eclipse Adoptium" - "Temurin-21.0.1" /Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home

이제 `~/.zshrc` 파일을 엽니다. `vim`이나 `nano` 같은 터미널 편집기를 사용하거나, VS Code 같은 그래픽 편집기를 사용할 수 있습니다.

nano ~/.zshrc

파일의 맨 아래에 다음 내용을 추가합니다. 위에서 확인한 경로를 `export JAVA_HOME` 부분에 붙여넣습니다.

# Java Environment Variables
export JAVA_HOME=$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/bin:$PATH

위와 같이 `/usr/libexec/java_home` 명령어를 직접 사용하는 것이 더 유연한 방법입니다. 시스템의 기본 JDK가 변경될 때마다 경로를 수정할 필요가 없기 때문입니다.

파일을 저장하고 닫은 후(nano의 경우 `Ctrl+X`, `Y`, `Enter`), 다음 명령어로 변경 사항을 즉시 적용합니다.

source ~/.zshrc

마지막으로, `JAVA_HOME`이 올바르게 설정되었는지 확인합니다.

echo $JAVA_HOME

JDK 경로가 정상적으로 출력되면 모든 설정이 완료된 것입니다.

4. 첫 번째 자바 프로그램: "Hello, World!"

모든 개발 환경 설정이 끝났습니다. 이제 프로그래밍 세계의 오랜 전통인 "Hello, World!"를 출력하는 프로그램을 작성하고 실행해볼 차례입니다. 이 과정은 단순히 글자를 출력하는 것 이상의 의미를 가집니다. 자바 코드 작성, 컴파일, 실행이라는 핵심적인 3단계를 직접 경험하며 자바의 동작 원리를 체감하는 중요한 과정입니다.

4.1. 소스 코드 작성

먼저, 소스 코드를 저장할 작업 디렉터리(폴더)를 하나 만듭니다. 예를 들어, `C:\javastudy` 또는 `~/javastudy` 와 같은 경로를 생성합니다.

그 다음, 메모장(Notepad), Visual Studio Code, Sublime Text 등 원하는 텍스트 편집기를 열고 다음 코드를 정확하게, 대소문자까지 똑같이 입력합니다.

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

코드를 입력했다면, 파일을 저장해야 합니다. 여기서 매우 중요한 규칙이 있습니다.

파일의 이름은 반드시 `public class` 뒤에 오는 클래스 이름과 정확히 일치해야 하며, 확장자는 `.java`여야 합니다.

따라서, 위 코드는 `HelloWorld.java` 라는 이름으로 앞서 만든 작업 디렉터리에 저장해야 합니다. `helloworld.java` 나 `HelloWorld.txt` 와 같이 저장하면 오류가 발생합니다.

4.2. 소스 코드 심층 분석

단순히 코드를 따라 치는 것을 넘어, 각 라인이 어떤 의미를 가지는지 자세히 살펴보겠습니다.

  • public class HelloWorld { ... }
    • class HelloWorld: 자바는 객체 지향 프로그래밍(OOP) 언어이며, 모든 코드는 '클래스(class)'라는 기본 단위 안에 존재해야 합니다. `HelloWorld`는 우리가 정의한 클래스의 이름입니다. 자바의 명명 규칙(naming convention)에 따라 클래스 이름은 대문자로 시작하는 것이 일반적입니다(PascalCase).
    • public: '접근 제어자(access modifier)'라고 부릅니다. `public`은 '공개된'이라는 의미로, 이 `HelloWorld` 클래스는 어디서든 접근하고 사용할 수 있다는 것을 나타냅니다.
    • { ... }: 중괄호는 클래스의 시작과 끝을 나타내는 영역(scope)을 정의합니다. `HelloWorld` 클래스의 모든 내용은 이 중괄호 안에 작성되어야 합니다.
  • public static void main(String[] args) { ... }
    • 이 라인은 '메서드(method)'를 정의하는 부분이며, 자바 프로그램의 시작점(entry point)이 되는 매우 특별한 약속입니다. `java` 명령어로 프로그램을 실행하면, JVM은 가장 먼저 이 `main` 메서드를 찾아 실행합니다.
    • public: 이 `main` 메서드 역시 외부(JVM)에서 호출할 수 있어야 하므로 `public`으로 선언됩니다.
    • static: '정적' 메서드임을 의미합니다. `static`으로 선언된 메서드는 클래스의 인스턴스(객체)를 생성하지 않고도 `클래스이름.메서드이름` 형태로 바로 호출할 수 있습니다. JVM이 프로그램을 시작할 때 `HelloWorld` 객체를 만들지 않고 바로 `main`을 실행해야 하므로 이 키워드는 필수적입니다.
    • void: 이 메서드가 작업을 수행한 후 아무런 값도 반환(return)하지 않는다는 의미입니다. 만약 메서드가 정수 값을 반환해야 한다면 `int`, 문자열을 반환해야 한다면 `String` 등을 사용합니다.
    • main: JVM과 약속된 메서드의 이름입니다. 다른 이름으로 바꾸면 JVM이 프로그램의 시작점을 찾지 못해 오류가 발생합니다.
    • (String[] args): '매개변수(parameter)' 부분입니다. 프로그램 실행 시 외부에서 정보를 전달받을 때 사용됩니다. `String[]`은 문자열(String)의 배열(array)을 의미하며, `args`는 그 배열의 변수명입니다. 예를 들어 `java HelloWorld apple banana` 와 같이 실행하면, `args` 배열에는 "apple"과 "banana"라는 두 개의 문자열이 담기게 됩니다. 지금은 사용하지 않지만, `main` 메서드의 표준적인 형식에 포함되어 있습니다.
  • System.out.println("Hello, World!");
    • 이것이 실제로 콘솔에 "Hello, World!"를 출력하는 코드입니다.
    • System: 자바의 표준 라이브러리에서 제공하는 클래스입니다. 시스템의 표준 입출력 장치와 관련된 기능을 제공합니다.
    • out: `System` 클래스 안에 있는 `static` 필드(변수)로, 표준 출력 스트림(콘솔)을 나타냅니다.
    • println(...): `out`이 참조하는 객체(`PrintStream` 타입)가 가지고 있는 메서드입니다. 괄호 안의 내용을 콘솔에 출력하고, 줄을 바꾸는(line new) 역할을 합니다. `print` 메서드도 있는데, 이는 줄바꿈을 하지 않습니다.
    • "Hello, World!": 출력할 실제 문자열 데이터입니다.
    • ;: 세미콜론은 자바에서 하나의 문장(statement)이 끝났음을 알리는 중요한 문법입니다. 모든 실행문 끝에는 반드시 세미콜론을 붙여야 합니다.

4.3. 컴파일과 실행: 바이트코드의 탄생

이제 우리가 작성한 '인간의 언어'에 가까운 자바 소스 코드(`HelloWorld.java`)를 'JVM의 언어'인 바이트코드로 변환할 시간입니다. 이 과정을 **컴파일(compile)**이라고 합니다.

단계 1: 컴파일 (javac 명령어)

  1. 명령 프롬프트 또는 터미널을 엽니다.
  2. `cd` 명령어를 사용하여 `HelloWorld.java` 파일을 저장한 작업 디렉터리로 이동합니다.
    cd C:\javastudy   (Windows의 경우)
    cd ~/javastudy    (macOS/Linux의 경우)
  3. 다음 명령어를 입력하여 컴파일을 수행합니다.
    javac HelloWorld.java

아무런 메시지 없이 다음 프롬프트가 나타나면 컴파일에 성공한 것입니다. 만약 오류 메시지가 나타난다면, 코드에 오타가 있거나 파일 이름이 클래스 이름과 다른 경우일 가능성이 높습니다. 오류 메시지를 차분히 읽고 코드를 수정하세요.

컴파일에 성공했다면, 작업 디렉터리를 확인해보세요. `HelloWorld.class` 라는 새로운 파일이 생성된 것을 볼 수 있습니다. 이 파일이 바로 JVM이 실행할 수 있는 바이트코드 파일입니다. 텍스트 편집기로 열어보면 인간이 알아볼 수 없는 기호들로 가득 차 있을 것입니다.

단계 2: 실행 (java 명령어)

이제 컴파일된 바이트코드를 JVM을 통해 실행할 차례입니다. 이 과정을 **런(run)** 또는 **실행(execute)**이라고 합니다.

  1. 컴파일을 진행했던 터미널에서 다음 명령어를 입력합니다.
    java HelloWorld

여기서 주의할 점은, `java` 명령어를 사용할 때는 `.class` 확장자를 붙이지 않는다는 것입니다. 단지 실행하고자 하는 클래스의 이름만 적어주면 됩니다.

명령어를 실행하면, 드디어 콘솔 화면에 다음과 같은 결과가 출력됩니다.

Hello, World!

축하합니다! 여러분은 성공적으로 첫 번째 자바 프로그램을 만들고 실행했습니다. 이 간단한 과정 속에는 '소스 코드 작성 → 컴파일러(javac)를 통한 바이트코드(.class) 생성 → JVM(java)이 바이트코드를 해석하여 실행' 이라는 자바의 핵심 동작 원리가 모두 담겨 있습니다.

5. 더 나은 개발 경험을 위하여: IDE 소개

지금까지 우리는 텍스트 편집기와 명령줄 도구(javac, java)를 이용해 자바 프로그램을 개발했습니다. 이는 자바의 기본적인 동작 원리를 이해하는 데 매우 좋은 학습 방법입니다. 하지만 실제 프로젝트는 수십, 수백 개의 파일로 구성되며 훨씬 더 복잡합니다. 이런 상황에서 메모장과 명령 프롬프트만으로 개발을 진행하는 것은 매우 비효율적입니다.

이때 필요한 것이 바로 IDE(Integrated Development Environment, 통합 개발 환경)입니다. IDE는 코드 편집, 컴파일, 실행, 디버깅 등 개발에 필요한 모든 기능을 하나의 애플리케이션으로 통합하여 제공하는 강력한 도구입니다.

IDE가 제공하는 주요 기능은 다음과 같습니다.

  • 지능형 코드 자동 완성: 변수명, 메서드명을 일부만 입력해도 전체를 추천해주어 오타를 줄이고 생산성을 높입니다.
  • 실시간 오류 검사: 코드를 작성하는 동안 문법 오류나 잠재적인 문제를 즉시 빨간 줄 등으로 표시해줍니다. 컴파일 버튼을 누르기 전에 미리 오류를 발견하고 수정할 수 있습니다.
  • 리팩토링: 변수나 메서드의 이름을 한 번에 안전하게 변경하거나, 코드 구조를 개선하는 작업을 손쉽게 할 수 있습니다.
  • 디버깅: 코드 중간에 중단점(breakpoint)을 설정하고, 프로그램이 실행되는 동안 변수의 값이 어떻게 변하는지 실시간으로 추적하며 오류의 원인을 찾을 수 있습니다.
  • 빌드 및 의존성 관리: Maven, Gradle과 같은 빌드 도구와 연동하여 복잡한 프로젝트의 라이브러리 의존성을 손쉽게 관리할 수 있습니다.

대표적인 자바 IDE

자바 개발자를 위한 훌륭한 IDE는 여러 가지가 있지만, 현재 가장 널리 사용되는 세 가지는 다음과 같습니다.

  1. IntelliJ IDEA: JetBrains사에서 개발한 IDE로, 강력한 기능과 뛰어난 사용자 경험으로 많은 개발자들의 사랑을 받고 있습니다. 무료인 Community 버전과 유료인 Ultimate 버전이 있습니다. 초보자는 Community 버전으로도 충분히 학습할 수 있습니다.
  2. Eclipse: 오랜 역사를 가진 오픈소스 IDE입니다. 다양한 플러그인을 통해 기능을 무한히 확장할 수 있으며, 완전 무료입니다.
  3. Visual Studio Code (VS Code): Microsoft에서 개발한 경량 코드 편집기이지만, Java Extension Pack과 같은 확장 프로그램을 설치하면 강력한 자바 IDE로 활용할 수 있습니다. 가볍고 빠른 실행 속도가 장점입니다.

초보자에게는 직관적인 인터페이스와 강력한 코드 지원 기능을 제공하는 IntelliJ IDEA Community Edition으로 시작하는 것을 추천합니다. IDE를 사용하면 `javac`, `java` 명령어를 직접 입력할 필요 없이, 단축키나 버튼 클릭 한 번으로 컴파일과 실행을 모두 처리할 수 있어 개발 과정이 훨씬 편리해집니다.

6. 초보자가 흔히 겪는 오류와 해결 방법

처음 프로그래밍을 배우다 보면 수많은 오류 메시지와 마주하게 됩니다. 오류는 실패가 아니라, 무언가 잘못되었음을 알려주는 친절한 신호입니다. 오류 메시지를 읽고 원인을 파악하는 능력은 훌륭한 개발자가 되기 위한 필수 소양입니다. 다음은 초보자들이 자주 겪는 대표적인 오류와 그 해결책입니다.

1. `javac: command not found` 또는 `'javac'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다.`

  • 원인: 운영체제가 `javac`라는 명령어를 어디서 찾아야 할지 모르는 상황입니다. 대부분 `PATH` 환경 변수 설정이 잘못되었거나, 설정 변경 후 터미널/명령 프롬프트를 재시작하지 않았기 때문입니다.
  • 해결책:
    1. JDK 설치 과정에서 `Add to PATH` 옵션을 제대로 선택했는지 다시 확인합니다.
    2. 환경 변수를 수동으로 설정했다면, 경로에 오타가 없는지, 특히 JDK 설치 경로 아래의 `bin` 폴더까지 정확히 포함했는지 확인합니다. (예: `C:\Program Files\Java\jdk-21\bin`)
    3. 환경 변수를 변경한 후에는 반드시 열려있던 모든 명령 프롬프트나 터미널 창을 닫고 새로 열어야 변경 사항이 적용됩니다.

2. `error: class HelloWorld is public, should be declared in a file named HelloWorld.java`

  • 원인: 자바의 규칙, 즉 'public 클래스의 이름은 파일 이름과 반드시 같아야 한다'는 규칙을 위반한 경우입니다.
  • 해결책:
    1. 소스 코드의 클래스 이름(`public class HelloWorld`)과 파일 이름(`HelloWorld.java`)이 대소문자까지 정확히 일치하는지 확인합니다. 예를 들어 클래스 이름은 `HelloWorld`인데 파일 이름이 `helloworld.java`라면 이 오류가 발생합니다.
    2. 파일 확장자가 `.java`가 맞는지 확인합니다. 간혹 메모장에서 저장할 때 `HelloWorld.java.txt` 와 같이 저장되는 경우가 있습니다.

3. `Error: Could not find or load main class HelloWorld`

  • 원인: `java` 명령어로 클래스를 실행하려고 할 때, JVM이 해당 `.class` 파일을 찾지 못하거나, 파일은 찾았지만 그 안에 `public static void main(String[] args)` 메서드가 없는 경우입니다.
  • 해결책:
    1. `javac HelloWorld.java` 컴파일이 성공적으로 완료되었는지, 그래서 `HelloWorld.class` 파일이 현재 디렉터리에 생성되었는지 확인합니다.
    2. `java` 명령어를 실행하는 위치가 `.class` 파일이 있는 디렉터리가 맞는지 확인합니다.
    3. `java` 명령어 뒤에 클래스 이름만 정확히 입력했는지 확인합니다. `java HelloWorld.class` 와 같이 확장자를 붙이면 이 오류가 발생합니다.
    4. 소스 코드에서 `main` 메서드의 선언(`public static void main(String[] args)`)에 오타가 없는지 꼼꼼히 확인합니다. `Main`, `string`, `ArgS` 등 대소문자 하나만 틀려도 JVM은 `main` 메서드를 찾지 못합니다.

4. 각종 컴파일 오류 (Syntax Errors)

예를 들어, `error: ';' expected`, `error: cannot find symbol`, `error: unclosed string literal` 등 다양한 문법 오류가 있습니다.

  • 원인: 자바 언어의 문법을 지키지 않은 경우입니다. 세미콜론(;) 누락, 중괄호({}) 짝이 맞지 않음, 변수나 메서드 이름의 오타 등이 주된 원인입니다.
  • 해결책:
    1. 오류 메시지를 자세히 읽어보세요. 대부분 오류가 발생한 라인 번호와 오류의 원인을 알려줍니다.
    2. 오류가 발생한 라인과 그 주변 코드를 중심으로 문법적 실수가 없는지 확인합니다.
    3. 가장 흔한 실수는 문장 끝에 세미콜론(;)을 빠뜨리는 것입니다.
    4. 여는 중괄호 `{`가 있으면 반드시 짝이 맞는 닫는 중괄호 `}`가 있는지 확인합니다.

오류 해결 과정(디버깅)은 프로그래밍의 일부입니다. 좌절하지 말고, 오류 메시지를 단서 삼아 문제를 해결해나가는 과정을 즐기시기 바랍니다. 이 경험이 쌓여 여러분을 더 나은 개발자로 만들어 줄 것입니다.

마치며: 새로운 여정의 시작

지금까지 우리는 자바 개발 환경을 구성하는 핵심 요소들을 이해하고, 직접 JDK를 설치했으며, 터미널의 검은 화면 위에서 첫 번째 자바 프로그램을 성공적으로 실행했습니다. "Hello, World!"라는 간단한 문장을 출력했을 뿐이지만, 이 과정에는 자바의 철학과 동작 원리가 고스란히 담겨 있습니다. 여러분은 이제 어떤 컴퓨터에서든 자바 코드를 실행할 수 있는 기본적인 능력을 갖추게 된 것입니다.

이것은 긴 여정의 첫걸음에 불과합니다. 앞으로 여러분은 변수, 자료형, 연산자, 제어문, 배열과 같은 프로그래밍의 기초를 배우고, 클래스와 객체를 통해 객체 지향 프로그래밍의 세계를 탐험하게 될 것입니다. 그리고 상속, 다형성, 인터페이스, 예외 처리 등 더 깊이 있는 개념들을 익히며 복잡한 문제를 해결하는 능력을 키워나갈 것입니다.

오늘의 경험을 발판 삼아 꾸준히 나아가시길 바랍니다. 코드를 직접 작성하고, 실행하고, 오류를 해결하는 과정을 반복하세요. 궁금한 점이 생기면 주저하지 말고 공식 문서나 개발자 커뮤니티를 찾아보세요. 프로그래밍은 지식을 쌓는 것만큼이나 경험을 통해 체득하는 것이 중요합니다. 여러분의 손끝에서 탄생할 무한한 가능성을 응원합니다.


0 개의 댓글:

Post a Comment