[Java] Java란?

 

김영한의 자바 입문 강의 내용을 정리한 글이다.

1. 개발 환경

자바 IDE는 IntelliJ IDEA와 Eclipse가 많이 사용된다. 과거에는 Eclipse가 주류였지만, 최근에는 IntelliJ가 대부분의 회사에서 표준처럼 자리잡았다. 강의는 IntelliJ 기준으로 진행한다.

IntelliJ는 무료·유료 버전이 통합되었다. 자바를 학습하는 단계에서는 두 버전 간 차이가 없다.

JDK, JRE, JVM — 세 가지 개념의 관계

자바를 처음 설치하면 JDK, JRE, JVM이라는 용어가 함께 등장한다. 세 개념은 포함 관계로 이루어져 있다.

JDK (Java Development Kit)javac + 개발 도구 + JREJRE (Java Runtime Environment)표준 라이브러리 + JVMJVM (Java Virtual Machine)바이트코드 실행 엔진
  • JVM(Java Virtual Machine)은 컴파일된 바이트코드(.class)를 읽어 실행하는 가상 머신이다. OS마다 다른 JVM 구현이 제공되며, 이 덕분에 동일한 바이트코드가 여러 플랫폼에서 실행된다.
  • JRE(Java Runtime Environment)는 JVM + 자바 표준 라이브러리로 구성된 실행 환경이다. 자바 프로그램을 "실행만" 하고 싶을 때 필요하다.
  • JDK(Java Development Kit)는 JRE + 개발 도구(컴파일러 javac, 디버거, 프로파일러 등)를 포함하는 개발 키트다. 코드를 작성하고 컴파일하려면 JDK가 필요하다.

Java 11부터는 독립적인 JRE 배포가 사라졌다. JDK를 설치하면 JRE와 JVM이 함께 포함된다.

JDK 설치

자바를 별도로 설치할 필요 없이, IntelliJ 프로젝트 생성 시 Add SDK → Download JDK에서 바로 내려받을 수 있다.

항목 비고
Version 21 17 이상이면 가능
Vendor Oracle OpenJDK 없으면 Eclipse Temurin 선택
Architecture aarch64 Apple Silicon(M1/M2/M3) 한정
Build system IntelliJ Maven/Gradle 미사용
Add sample code 선택 기본 코드 자동 생성

2. 자바 프로그램 실행

첫 번째 코드

public class HelloJava { public static void main(String[] args) { System.out.println("hello java"); } }

실행하면 콘솔에 hello java가 출력된다. 짧은 코드지만 자바 프로그램의 기본 구조가 모두 들어 있다. 각 구성 요소를 하나씩 살펴보면 아래와 같다.

코드 구조 분석

구성 요소 이름 역할
public class HelloJava 클래스 파일 단위. 파일명(HelloJava.java)과 반드시 일치해야 한다
public static void main(...) main 메서드 자바가 찾아서 실행을 시작하는 진입점
System.out.println(...) 출력문 괄호 안 값을 콘솔에 출력한다
"hello java" 문자열 리터럴 큰따옴표(")로 감싼다
; 세미콜론 문장의 끝 표시. 필수
{ } 블록 클래스·메서드의 범위 시작과 끝

자바는 대소문자를 구분한다. Systemsystem으로 쓰면 컴파일 오류가 발생한다.

main 메서드 시그니처 분석

public static void main(String[] args)는 자바가 프로그램 시작 시 반드시 찾는 약속된 형태(시그니처)다. 지금 당장 전부 외울 필요는 없지만, 각 키워드가 왜 필요한지 알아두면 이후 학습에서 자연스럽게 연결된다.

키워드 의미 왜 필요한가
public 접근 제어자 JVM이 클래스 외부에서 이 메서드에 접근해야 하므로 공개(public)여야 한다
static 정적 메서드 JVM은 객체를 생성하지 않고 클래스 단위로 바로 호출한다. 인스턴스 없이 실행해야 하므로 static이 필요하다
void 반환 타입 없음 프로그램의 진입점이자 종료점이므로 값을 돌려줄 대상이 없다
String[] args 커맨드라인 인수 터미널에서 java Hello arg1 arg2처럼 실행할 때 전달되는 문자열 배열이다. 이름(args)은 관례일 뿐 변경 가능하다

이 시그니처 중 하나라도 빠지거나 다르면 JVM이 진입점을 찾지 못해 프로그램이 시작되지 않는다.

블록과 들여쓰기

{}는 블록(block)으로, 코드의 범위를 나타낸다. 블록이 중첩될수록 들여쓰기 깊이가 늘어난다. 들여쓰기는 보통 스페이스 4칸을 사용하며, IntelliJ에서는 Tab 키를 누르면 자동으로 적용된다.

public class HelloJava { // 클래스 블록 시작 public static void main(String[] args) { // 메서드 블록 시작 System.out.println("hello java"); } // 메서드 블록 끝 } // 클래스 블록 끝

들여쓰기를 하지 않아도 프로그램은 정상적으로 컴파일되고 실행된다. 하지만 들여쓰기가 없는 코드는 블록의 시작과 끝을 눈으로 구분하기 어렵고, 중첩이 깊어질수록 읽기가 극도로 힘들어진다. 들여쓰기는 사람이 코드를 읽기 위한 관례이지만, 사실상 필수다.

실행 순서

프로그램은 main() 메서드의 첫 번째 줄부터 시작해서 위에서 아래로 한 줄씩 순차적으로 실행된다. 조건문이나 반복문이 없는 한, 작성한 순서 그대로 실행된다고 생각하면 된다.

public class HelloJava2 { public static void main(String[] args) { System.out.println("hello java1"); // 1번째 실행 System.out.println("hello java2"); // 2번째 실행 System.out.println("hello java3"); // 3번째 실행 } } // 출력: // hello java1 // hello java2 // hello java3

3. 주석(comment)

소스 코드가 복잡해질수록 코드만으로는 의도를 파악하기 어려운 부분이 생긴다. 또는 특정 코드를 삭제하지 않고 잠시 실행을 막아두고 싶을 때도 있다. 이때 주석을 사용한다.

주석은 자바 컴파일러가 완전히 무시하는 영역이다. .class 바이트코드에도 포함되지 않으므로 프로그램 실행에 아무런 영향을 주지 않는다. 오직 사람이 소스 코드를 읽을 때를 위해 존재한다.

종류 문법 적용 범위 주 용도
한 줄 주석 // 내용 // 이후 해당 줄 끝까지 짧은 설명, 코드 라인 비활성화
여러 줄 주석 /* 내용 */ /**/ 사이 전체 긴 설명, 여러 줄 비활성화

한 줄 주석 //는 두 가지 방식으로 사용할 수 있다. 줄의 처음에 쓰면 해당 줄 전체가 주석이 되고, 코드 뒤에 이어 쓰면 코드는 실행되고 // 이후의 설명만 주석 처리된다.

System.out.println("hello java1"); // 코드 뒤에 붙인 한 줄 주석 — 코드는 실행됨 // System.out.println("hello java2"); // 줄 전체가 주석 — 코드가 실행되지 않음

여러 줄 주석 /* *//**/ 사이의 모든 내용이 주석으로 처리된다. 여러 줄에 걸친 설명을 작성하거나, 디버깅 중 여러 줄의 코드를 한꺼번에 비활성화할 때 사용한다.

public class CommentJava { /* * 주석을 설명하는 부분이다. */ public static void main(String[] args) { System.out.println("hello java1"); // 출력됨 // System.out.println("hello java2"); // 실행 안 됨 /* 여러 줄 주석 System.out.println("hello java3"); // 실행 안 됨 System.out.println("hello java4"); // 실행 안 됨 */ } } // 실행 결과: hello java1

위 코드에서 hello java2, hello java3, hello java4는 모두 주석 안에 있으므로 컴파일러가 무시한다. 실행 결과는 hello java1만 출력된다.


4. 자바란?

표준 스펙과 구현

자바는 표준 스펙구현으로 나뉜다는 점이 다른 언어와 구별되는 특징이다.

표준 스펙은 "자바 컴파일러는 이렇게 동작해야 하고, 이런 라이브러리를 제공해야 하며, JVM은 이런 규칙으로 바이트코드를 실행해야 한다"는 설계 문서다. 이 스펙은 JCP(Java Community Process)라는 공식 프로세스를 통해 관리된다. JCP에서는 JSR(Java Specification Request)이라는 제안 문서를 통해 새로운 기능과 변경사항을 논의하고 확정한다.

이 표준 스펙을 기반으로 여러 회사가 실제 작동하는 자바를 만든다. 이것이 구현체다.

자바 표준 스펙 (JCP)컴파일러 · 실행 라이브러리 · JVM 스펙구현 (실체화)Oracle OpenJDK공식 레퍼런스 구현Eclipse Temurin커뮤니티 빌드 (TCK 통과)Amazon CorrettoAWS 환경 최적화
구현체 제공자 특징
Oracle OpenJDK Oracle 자바의 공식 레퍼런스 구현이다. 다른 구현체들은 이 소스 코드를 기반으로 빌드한다
Eclipse Temurin Eclipse Foundation (Adoptium) 과거 AdoptOpenJDK를 계승한 커뮤니티 빌드다. TCK(Technology Compatibility Kit) 테스트를 통과하여 호환성이 보장된다. IBM, Red Hat, Microsoft 등이 후원한다
Amazon Corretto AWS AWS 환경에 최적화된 빌드다. 자체 암호화 프로바이더 최적화와 상위 버전 버그 수정의 백포트가 특징이다

모든 구현체는 동일한 표준 스펙에 맞게 개발된다. Oracle OpenJDK를 사용하다가 Amazon Corretto로 바꿔도 대부분 문제 없이 작동하는 이유가 여기에 있다. 학습 단계에서는 어떤 구현체를 선택하든 차이가 없다.

컴파일과 실행

자바 프로그램은 컴파일과 실행, 두 단계를 거친다. C/C++처럼 소스 코드를 바로 기계어로 변환하는 것이 아니라, 중간 형태인 바이트코드를 거친다는 것이 자바의 핵심 설계다.

Hello.java소스 코드javacHello.class바이트코드java + JVM실행OS 무관

컴파일 — 개발자가 작성한 .java 소스 파일을 javac(Java Compiler)로 컴파일하면 .class 파일이 생성된다. 이 .class 파일에는 바이트코드가 들어있다. 바이트코드는 특정 CPU가 직접 실행하는 기계어가 아니라, JVM이 이해할 수 있는 중간 형태의 명령어 집합이다. 컴파일 과정에서 문법 오류(세미콜론 누락, 타입 불일치 등)도 검출된다.

실행java 명령으로 프로그램을 실행하면 JVM이 .class 파일의 바이트코드를 읽는다. JVM 내부의 인터프리터가 바이트코드를 한 줄씩 해석하여 실행하고, 자주 실행되는 코드(핫스팟)는 JIT(Just-In-Time) 컴파일러가 네이티브 기계어로 변환하여 성능을 높인다.

Write Once, Run Anywhere — 이 설계의 핵심 가치다. C/C++는 소스 코드를 컴파일하면 특정 OS·CPU에 종속된 기계어가 나온다. Windows에서 컴파일한 실행 파일은 Mac에서 실행할 수 없다. 하지만 자바는 중간에 바이트코드라는 플랫폼 독립적인 계층이 있다. 동일한 .class 파일을 Windows, Mac, Linux 어디서든 해당 OS의 JVM이 실행해 준다. 개발자는 소스 코드를 한 번만 작성하면 된다.

IntelliJ에서 실행 버튼을 누르면 javac 컴파일과 java 실행이 자동으로 처리된다. 터미널에서 수동으로 컴파일/실행할 필요는 없지만, 내부적으로 이 과정이 일어난다는 것은 알아두면 좋다.

'Study > Java' 카테고리의 다른 글

[Java] 스코프, 형변환  (0) 2026.04.04
[Java] 반복문  (0) 2026.04.04
[Java] 조건문  (0) 2026.04.04
[Java] 연산자  (0) 2026.04.04
[Java] 변수  (1) 2026.04.03