1강에서 개발 환경을 세팅했다면, 2강에서는 자바라는 언어 자체에 대해 좀 더 깊이 들여다봤다. 강의 내용과 함께 스스로 떠오른 궁금증들을 정리해 두려고 한다.


1. 프로그램의 시작점, main 메서드

자바 프로그램이 실행되면 JVM은 가장 먼저 main 메서드를 찾는다. 이전 포스팅에서도 잠깐 다뤘지만, 이번 강의에서 실행 흐름이 더 명확해졌다.

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

실행 순서를 간단히 정리하면 이렇다.

자바 실행 → main 메서드 탐색 → main 블록 내 코드를 위에서 아래로 한 줄씩 실행

참고로 psvm은 IntelliJ에서 public static void main(String[] args)를 자동완성해주는 라이브 템플릿 단축키다.

클래스와 파일명은 반드시 일치해야 한다

자바는 대소문자를 엄격히 구분한다. 그리고 한 가지 더, public class의 이름과 파일명이 반드시 같아야 한다.

HelloJava.java  →  public class HelloJava  ✅
HelloJava.java  →  public class helloJava  ❌ (컴파일 에러)

클래스의 시작과 끝은 {} 블록으로 나타내며, main 메서드도 마찬가지로 {} 안에 실행할 코드를 담는다.


2. 자바란? — 표준 스펙과 구현의 분리

자바를 이해하는 데 있어 "표준 스펙"과 "구현체"의 개념을 아는 것이 꽤 중요하다.

자바 표준 스펙

자바는 "이렇게 만들어야 한다"는 설계 문서(표준 스펙)가 먼저 존재한다. 이 스펙은 자바 커뮤니티 프로세스(JCP) 를 통해 관리되며, 어떤 회사든 자바를 구현하려면 이 스펙을 반드시 따라야 한다.

표준 스펙에서 정의하는 주요 구성 요소는 다음과 같다.

  • 자바 컴파일러 — .java 파일을 .class 파일로 변환하는 규칙
  • 자바 실행 라이브러리 — 자바 프로그램이 사용하는 표준 API
  • 자바 가상 머신(JVM) — 바이트코드를 실제로 실행하는 가상 환경

다양한 자바 구현체

스펙을 기반으로 오라클, 아마존, Azul 등 여러 회사가 실제로 작동하는 자바를 직접 개발해 배포한다. 이들이 바로 JDK(Java Development Kit) 다.

배포판 제공사 특징

OpenJDK Oracle 자바의 레퍼런스 구현체
Amazon Corretto Amazon AWS 환경에 최적화
Azul Zulu Azul Systems 장기 지원(LTS) 버전에 강점

핵심은, 어떤 배포판을 사용하든 같은 스펙을 따르기 때문에 코드가 동일하게 동작한다는 점이다. 실무에서 오라클 OpenJDK를 쓰다가 Amazon Corretto로 바꿔도 대부분 문제가 없는 이유가 바로 이것이다.

이 개념은 나중에 "어떤 JDK 버전, 어떤 배포판을 선택할 것인가"를 결정해야 하는 상황이 올 때 큰 도움이 된다.


3. 컴파일과 실행 — .java에서 실행까지

파이썬은 .py 파일을 곧바로 실행할 수 있지만, 자바는 컴파일이라는 단계가 중간에 하나 더 들어간다.

Hello.java  →  (javac 컴파일)  →  Hello.class  →  (java 실행)  →  프로그램 동작
  • javac Hello.java : 소스 코드를 JVM이 이해할 수 있는 바이트코드(.class)로 변환한다. 이 과정에서 문법 오류도 함께 검출한다.
  • java Hello : 컴파일된 .class 파일을 JVM이 읽어 실행한다. (확장자 .class는 생략)

IntelliJ에서는 이 과정을 자동으로 처리한다

실행 버튼을 누르면 IntelliJ가 javac와 java 명령을 순서대로 대신 실행해준다. 1강에서 살펴봤던 out 폴더 안에 .class 파일이 생기는 것이 바로 컴파일의 결과물이다.

한 가지 눈여겨볼 점은, 컴파일된 .class 파일에는 소스 코드에서 작성했던 주석이 사라진다. 컴파일러가 최적화 과정에서 실행에 불필요한 정보를 제거하기 때문이다.


4. 자바와 운영체제 — "한 번 작성하면 어디서든 실행된다"

자바를 공부하다 보면 "OS 독립성" 이라는 표현을 자주 만나게 된다. 파이썬도 OS를 가리지 않는데 왜 자바만 유독 이를 강조하는지 궁금했다.

파이썬 vs 자바의 방식 차이

파이썬 자바

실행 방식 인터프리터가 코드를 직접 해석 JVM이 바이트코드를 실행
OS 독립성 구현 각 OS에 맞는 파이썬 인터프리터 설치 각 OS에 맞는 JVM 설치

둘 다 OS 독립적이지만, 방식이 다르다. 자바는 JVM이라는 별도의 추상화 계층을 통해 이를 구현한다.

왜 자바만 유독 강조하는가?

자바가 처음 등장한 1995년에는 프로그램이 특정 OS에 종속되는 것이 당연한 시대였다. 그 시절에 "JVM만 있으면 어디서든 동일하게 동작한다"는 Write Once, Run Anywhere(WORA) 철학을 내세웠고, 이것이 당시에는 혁명적인 개념이었기 때문에 지금까지도 자바의 상징처럼 언급된다.


5. 문자와 문자열 — ' vs " 는 완전히 다르다

파이썬에서는 'Hello'와 "Hello"를 구분 없이 사용하지만, 자바는 이 둘을 언어 명세(JLS) 수준에서 엄격하게 구분한다.

char String

분류 기본 자료형 (Primitive Type) 참조형 (Reference Type / 클래스)
표기 'A' (단일 따옴표) "ABC" (쌍따옴표)
저장 크기 2바이트 고정 내용에 따라 가변
빈 값 불가 (공백이라도 있어야 함) 가능 ("" 허용)
JLS 근거 §4.2.1, §3.10.4 §3.10.5

왜 이게 중요한가?

따옴표를 잘못 쓰면 컴파일 오류가 발생한다. 예를 들어 아래 코드는 에러다.

char c = "A";  // ❌ Incompatible types — "A"는 String 객체로 인식됨
char c = 'A';  // ✅ 정상

"A"는 문자가 하나뿐이어도 자바 컴파일러는 이를 java.lang.String 객체로 인식하기 때문이다. 파이썬의 유연함에 익숙하다면 처음에 실수하기 쉬운 부분이니 주의가 필요하다.

한 줄로 정리하면 이렇다.

자바에서 '는 문자 하나, "는 문자열. 용도가 다르면 타입이 다르다.


2강을 정리하면서 자바가 왜 "엄격하다"는 말을 듣는지 조금씩 체감되기 시작했다. 타입 하나, 따옴표 하나도 정확히 맞춰야 컴파일이 통과된다. 번거롭게 느껴지기도 하지만, 그 덕분에 실행 전에 오류를 잡아낼 수 있다는 점은 큰 장점이다.

다음은 본격적으로 변수와 자료형을 다뤄볼 예정이다.

'Java' 카테고리의 다른 글

Java 입문 1강 — 개발 환경 세팅하기  (0) 2026.05.11

+ Recent posts