Java 에서 Hello World 를 출력하기까지 3
앞선 챕터에서는 Java 를 컴파일해보며 바이트코드 구조에 대해 살펴봤다. 이번 챕터에서는 JVM 이 실행되면서 'Hello World' 코드 블록을 어떻게 동작시키는지 살펴본다.
앞선 챕터에서는 Java 를 컴파일해보며 바이트코드 구조에 대해 살펴봤다. 이번 챕터에서는 JVM 이 실행되면서 'Hello World' 코드 블록을 어떻게 동작시키는지 살펴본다.
이전 글 에 이어서 "Hello World" 를 출력하기 위해 코드가 어떻게 변해가는지 살펴봅니다.
프로그래밍 언어에는 레벨이 있다.
프로그래밍 언어가 인간의 언어와 가까울수록 고수준 언어(high-level language), 컴퓨터가 이해할 수 있는 언어(=기계어)에 가까울수록 저수준 언어(low-level language)라고 한다. 고수준 언어로 프로그램을 작성하면 인간이 이해하기 쉽기에 높은 생산성을 얻을 수 있지만, 그만큼 기계어와의 괴리가 심해지니 이 간극을 메우기 위한 과정이 필요하다.
고수준 언어가 저수준으로 내려오는 과정, 이걸 컴파일(compile) 이라고 부른다.
Java 또한 저수준 언어는 아니므로, 컴파일 과정이 존재한다. 자바에서는 이 컴파일 과정이 어떻게 동작하는지 살펴보자.
프로그래밍 세계에서는 항상 Hello World
라는 문장을 출력하면서 시작한다. 그게 국룰 암묵적인 규칙이다.
# hello.py
print("Hello World")
python hello.py
// Hello World
Python? 훌륭하다.
// hello.js
console.log("Hello World");
node hello.js
// Hello World
JavaScript? 나쁘지 않다.
public class VerboseLanguage {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
javac VerboseLanguage.java
java VerboseLanguage
// Hello World
그런데 Java 는 마치 다른 세계에서 온 것 같다. class 이름과 파일 이름이 같아야 하는 점은 아직 언급도 안했다.
public
은 무엇이고 class
는 무엇이고, static
은 또 무엇이며, void
, main
, String[]
, System.out.println
을 거쳐야 드디어 "Hello World" 라는 문자열에 도달한다. 이제 다른 언어를 배우러 가자.[^fn-nth-1]
단순한 "Hello World" 를 출력하는 것임에도 Java 는 꽤 많은 배경 지식을 요구한다. Java 는 도대체 왜 이리 말 많은(verbose) 과정이 필요할까?
이번 시리즈는 3개의 챕터로 구성되어 있다. 목표는 "Hello World" 라는 2단어를 출력하기 위해 뒤에서는 무슨 일이 일어나는지 자세하게 살펴보는 것이다. 구체적인 챕터의 내용은 아래와 같다.
public static void main
을 JVM 이 어떻게 메모리에 어떻게 적재하고 실행할 수 있는지 그 동작 원리에 대해 살펴본다.3개의 챕터 내용을 조합하면 그제서야 "Hello World" 에 대해 그림이 그려진다. 꽤 긴 여정이니, 호흡을 가다듬고 출발해보자.
Spring MVC 웹 애플리케이션은 동시 사용자를 몇 명까지 수용할 수 있을까? 🤔
자신이 만든 서버가 어떤 상태여야 많은 유저를 수용하면서 안정적인 서비스를 제공할 수 있을지에 대한 대략적인 수치를 가늠하기 위해 Spring MVC 의 tomcat 설정을 중심으로 네트워크의 변화를 살펴봅니다.
이후는 작성의 편의를 위해 문어체를 사용합니다 🙏
기술적인 오류나 오타 등의 잘못된 내용이 있다면 댓글로 알려주시면 감사하겠습니다 🙇♂️
Spring Boot 3.1 부터 추가된 Docker Compose Support 에 대해서 간단하게 소개합니다.
잘못된 부분이 있다면 피드백 부탁드립니다!
이번 글은 나름 의미가 있는 글입니다. 올초부터 진행해왔던 글또의 마지막 글이 될 예정이거든요. 후기를 겸하여 그동안의 블로그 여정을 정리해봅니다.
특정 시간, 특정 조건에서만 실행되야하는 배치성 애플리케이션이 존재할 때 리소스 비용을 최적화하는 아주 간단한 방법에 대해서 공유합니다.
물론 가능합니다. AWS ECS, AWS EKS 등 여러가지 자동화 솔루션들도 있지만, Jenkins 로 배치 및 EC2 서버를 직접 관리한다고 가정하고 환경을 구성해봅니다.
Spring Batch 5.0 이 되면서 변경된 사항들을 정리합니다.
대규모 시스템을 설계하는데 필요한 구성 요소에는 어떤 것들이 있을까요?
이번 글에서는 라우팅 시스템 등에서 자주 사용되는 안정 해시(Consistent Hash)를 직접 구현해보고 데이터를 기반으로 이야기해봅니다.
전체 코드는 Github에서 확인하실 수 있습니다.
글이 다소 길기 때문에 이후로는 편의상 '~한다.' 체로 설명합니다. 🙏