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

파이썬 개발자로 일하다가 자바를 새로 공부하기 시작했다. 첫 강의에서는 IntelliJ 설치와 프로젝트 기본 구조를 다뤘는데, 파이썬과는 꽤 다른 부분들이 있어서 정리해 두려고 한다.


1. IntelliJ가 만들어주는 프로젝트 구조

프로젝트를 생성하면 IntelliJ가 자동으로 아래 세 폴더를 만들어준다.

  • src (Source) — 앞으로 작성할 .java 파일들이 모두 여기에 들어간다. 실제 비즈니스 로직이 위치하는 핵심 폴더다.
  • out — .java 파일을 컴파일한 결과물인 .class 파일이 저장되는 곳이다. 빌드할 때마다 자동으로 다시 생성되므로, 실수로 지워도 전혀 문제없다.
  • .idea — IntelliJ가 이 프로젝트를 관리하기 위한 설정 파일들이 담긴 폴더다. 직접 건드릴 필요 없고, 보통 Git에도 포함시키지 않는다 (.gitignore에 추가하는 게 일반적이다).

2. Main.java와 main 메서드 해부하기

프로젝트를 만들면 샘플 코드로 아래가 생성된다.

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

자바 프로그램이 실행되면 JVM(자바 가상 머신)은 가장 먼저 public static void main(String[] args) 시그니처를 찾는다. 이게 없으면 프로그램 자체가 실행되지 않는다.

각 키워드가 무엇을 의미하는지 하나씩 살펴보면 다음과 같다.

키워드 지금 단계에서의 의미 나중에 깊게 배울 개념

public 어디서든 이 메서드에 접근할 수 있다 접근 제어자
static 객체를 생성하지 않아도 바로 실행할 수 있다 정적 멤버, 메모리 영역
void 실행 후 반환할 값이 없다 리턴 타입
main 프로그램의 시작 지점이다 (메서드 이름) 메서드 정의
String[] args 프로그램 실행 시 외부에서 넘겨줄 수 있는 데이터 묶음 배열, 파라미터

지금 단계에서는 각 키워드의 역할 정도만 이해하고 넘어가도 충분하다. static이나 접근 제어자 같은 개념은 이후 강의에서 훨씬 자세히 다루게 된다.


3. 왜 모든 코드는 class 안에 있어야 할까?

파이썬은 .py 파일을 열고 바로 코드를 작성해도 실행된다. 하지만 자바는 "모든 코드는 반드시 클래스 안에 있어야 한다" 는 규칙이 언어 차원에서 강제된다.

파이썬 개발자 입장에서는 처음엔 다소 번거롭게 느껴질 수 있지만, 이 구조 덕분에 대규모 프로젝트에서 코드를 체계적으로 관리하기 쉬워진다고 한다.

한 가지 주의할 점은, 파일명과 클래스 이름이 반드시 일치해야 한다는 것이다.

Main.java  →  public class Main  ✅
Main.java  →  public class App   ❌ (컴파일 에러 발생)

첫 강의라 내용 자체는 가볍지만, 파이썬과의 차이를 의식하면서 보니 생각보다 흥미로웠다. 다음 강의부터는 본격적으로 자바의 자료형과 연산자를 다룰 예정이다.

+ Recent posts