콘텐츠로 이동

자바 시작 하기

현재 가장 대표적인 프로그래밍언어로 손꼽히는 자바언어에 대해 가상머신 개념에서 부터 JDK, 자바언어의 활용 분야에 대해 알아 본다.

자바(Java)란?

자바는 현재 가장 대표적인 프로그래밍 언어이다. 조사 목적이나 관점에 따라 다른 결과가 있을 수 있지만 매년 조사를 진행하고 있으며 신뢰성 있게 인용되는 tiobe index 의 결과에 따르면 지난 수년동안 자바는 계속 파이썬, C언어등과 함께 가장 인기있는 프로그래밍언어 중 하나임을 알 수 있다.

TIOBE Index - https://www.tiobe.com/tiobe-index

자바 주요 특징

자바 언어는 객체지향 언어의 대표라 할 수 있으며 객체지향 개념을 일반화 시키는데에도 많은 공헌을 했다. 일반적으로 이야기 하는 자바의 대표적인 특징은 다음과 같다.

  • 자바는 간결하면서도 강력한 객체지향 프로그램 언어.
  • 플랫폼에 독립적으로 여러 운영체제나 하드웨어에서도 동일하게 실행.
  • 많은 오픈소스 라이브러리를 통해 생산성 향성과 유지보수 비용 절감이 가능.
  • 스프링 프레임워크와 함께 대규모 시스템 개발에 적합.
  • GUI 기반의 응용 프로그램 개발에는 다소 적합하지 않음.
  • 최신 Modern Programming Language 들에 비해 간결함이 다소 떨어지고 불필요한 코드가 다소 많음.

자바는 Java8 버전 이후 매년 정기 업데이트와 버전 업그레이드를 통해 최신 프로그래밍 언어들의 간결함과 편리성을 반영해 나가고 있다.

자바 히스토리

자바는 어떤 배경에서 처음 만들어 졌는지, 또한 시대의 흐름에 따라 어떻게 변화해 왔는지, 어떤 요구사항들로 인해 새로운 기술들이 개발되었는지 살펴보는 것은 자바를 보다 잘 이해하는데 도움이 된다.

다음은 시대별 중요 이벤트로 살펴본 자바의 간략한 변천사 이다.

자바의 탄생

  • 1995년 썬 마이크로시스템즈의 제임스고슬링에 의해 개발 되어 처음 공개.
  • 가상머신 이라는 개념으로 플랫폼 독립적인 구현이라는 당시로는 참신한 접근.
  • 객체지향 개념과 개발 문화의 확산에 기여.
  • 인터넷과 웹의 발전과 함께 하게 됨.

서블릿과 JSP

  • 1997년 공식 발표 되었으며 자바에서 웹프로그램 개발을 지원.
  • 인터넷의 폭팔적인 성장과 함께 서블릿은 자바의 대표적인 구현 분야가 됨.
  • JSP는 서블릿 응용 기술로 웹화면(HTML)에 자바 코드를 사용해 웹 프로그램 개발 효율을 높임.
  • 오랜동안 웹 개발의 기본 기술이었으나 수년전 부터는 프론트엔드 기반 개발과 백엔드 개발 환경의 변화 등으로 인해 예전 보다 직접적인 사용 비율은 낮아짐.

이클립스

  • 1999IBM이 개발해 오픈소스로 기증한 자바 기반의 통합 개발도구 플랫폼.
  • 자바 성장에 크게 기여했으며 자바의 기본 통합 개발도구로 자리 잡음.
  • 이클립스 자체는 자바 이외의 언어 개발도 지원하는 개발 플랫폼 개념임.
  • 최근에는 상용 제품인 IntelliJ로 많은 사용자들이 이동(안드로이드 스튜디오 영향도 있음).

모바일 인터넷

  • 2000년대 초중반 휴대폰 보급 확산과 함께 모바일 인터넷 적용 시도.
  • 휴대폰에 자바 가상머신을 탑재해 자바 프로그램을 실행시키고자 함.
  • 휴대폰의 낮은 사양과 느린 인터넷 속도등으로 크게 성장하지는 못함.

안드로이드

  • 2007년 구글이 스마트폰 운영체제인 안드로이드를 발표.
  • OS 커널은 리눅스 기반이지만 응용 프로그램 개발의 기본을 자바로 채택.
  • 오라클과의 자바 라이센스 문제 등으로 인해 내장 가상머신 변화 및 Kotlin 으로의 이동 가속화.

스프링프레임워크

  • 2002년 Rod Jhonson이 출판한 Expert One-on-One J2EE Design and Developement 책에 기반.
  • 2004년 1.0 발표 2024년 현재 6.1 버전이며 스프링부트로 인해 개발이 간소화 됨.
  • 대규모 시스템 개발(엔터프라이즈 환경)에 적합한 오픈소스 프레임워크로 자바의 성장에 큰 역할을 함.
  • 많은 백엔드 시스템 구현에 스프링프레임워크가 사용되고 특히 우리나라의 경우 활용도가 높음.
  • 공공 개발에 요구되는 전자정부 프레임워크도 스프링 기반.

상용화

  • 2019년 부터 자바의 상용화가 시작 되었지만 일반적인 목적의 경우 계속 무료로 사용할 수 있음.
  • 임베디드, 상업용, 업무용 목적의 경우 별도 라이센스 필요.
  • 기업에서 무료로 자바를 사용하려면 OpenJDK를 사용해야 함.

가상머신과 JDK

바이트코드

가상머신에 대해 살펴보기전에 먼저 자바의 특징 중 하나인 바이트코드에 대해 알아보자. 바이트코드는 자바 컴파일러가 생성하는 코드로 특정 하드웨어에서 직접 실행할 수 있는 기계어가 아니라 자바 가상머신에 의해 해석될 수 있는 일종의 중간 코드 개념 이다.

자바 소스와 컴파일 과정

컴파일을 거쳐 다음과 같은 소스는 아래와 같은 바이트 코드로 변환 된다.

for (int i = 2; i < 1000; i++) {
    ...
}

0:   iconst_2
1:   istore_1
2:   iload_1
3:   sipush  1000
...

이러한 JVM과 바이트코드의 특성으로 자바 언어가 아니라도 동일한 바이트코드를 생성할 수 있다면 동일한 JVM에서 실행이 가능한 것이다.

JVM

JVM 개념

JVM은 Java Virtual Machine의 약어로 가상머신은 자바의 가장 큰 특징 중 하나이다. 가상머신은 말 그대로 물리적인 기계장치가 아닌 가상의 기계장치 즉 소프트웨어로 구현된 기계장치를 말하는 것으로 자바 이전에 시작된 OAK라는 프로젝트에서 다양한 가전제품에서 구동될 수 있는 소프트웨어 개발을 위해 고안된 아이디어 였다.

가상머신이라는 개념을 자바가 만든것은 아니지만 당시에 실제 성공한 프로젝트로는 자바가 대표적이다. 이러한 가상머신의 특징으로 인해 특정 하드웨어나 운영체제에 영향을 받지 않고 동일한 프로그램의 개발과 실행이 가능해졌다.

초기 자바의 모토(Moto)가 바로 WORA:Write Once Run Anywhere 였던 것을 생각해 보면 처음 자바가 지향 했던 부분을 이해할 수 있다.

  • JVM은 자바의 가장 큰 특징으로 특정 하드웨어나 운영체제에 종속되지 않고 동일한 프로그램 개발과 실행이 가능한 기술.
  • 자바소스는 컴파일후 바이트코드가 생성되며 JVM은 바이트코드를 해석해 운영체제에서 실행할 수 있도록 번역해 주는 역할을 담당.
  • 가상머신의 개념은 윈도우 .Net 플랫폼에도 영향을 미쳤으며 최근에는 Kotlin, Scala, Clojure, Groovy 등 JVM기반의 언어들도 유행. -> 언어의 문법구조는 다르지만 모두 자바와 같은 바이트코드를 생성해 JVM에서 실행.

가상 머신

오늘날 가상머신이라는 개념은 매우 일반화 된 개념으로 보통은 하드웨어를 가상화 하여 1대의 컴퓨터를 마치 여러 컴퓨터 처럼 나누어 실행할 수 있는 기술을 말한다. VMware, VirtualBox, Hyper-Visor 등이 대표적이며 클라우드 컴퓨팅 서비스는 기본적으로 가상화에 기반한다.

JVM 아키텍처

JVM은 크게 클래스 로더, 런타임 데이터 영역, 실행 엔진으로 구성되어 있다.

JVM Architecture

클래스 로더
클래스 로더는 바이트 코드를 메모리에 로딩하는 역할을 한다. 바이트코드로 구성된 클래스 파일을 읽어들여 초기화 작업을 수행한 다음 런타임 데이터 영역에 배치한다.
런타임 데이터 영역

말 그대로 프로그램이 실행중인 동안 데이터를 저장하는 공간이다.

  • 메서드 영역, 힙 영역, 스택 영역으로 구성되어 있다. 메서드 영역은 모든 쓰레드가 공유하는 영역으로 클래스, 메서드, 변수, 타입, 접근제어자,static 변수 등의 정보들이 저장된다.
  • 힙 영역도 모든 쓰레드에서 공유되는 영역이며 레퍼런스 타입을 포함한 객체(인스턴스)를 저장한다. 스택 영역은 스레드 단위로 관리되며 메소드 호출에 따른 변수 사용 등 메모리를 할당한다.

PC 레지스터

PC(Program Counter) 레지스터는 현재 실행중인 JVM 명령의 주소를 저장하는 레지스터로 가상머신의 특성상 JVM에서 실제 CPU에 제공하는 일종의 버퍼 메모리 개념으로 이해할 수 있다.

실행 엔진

실제 프로그램의 실행을 담당하는 영역으로 클래스 로더를 통해 런타임 영역에 배치된 바이트 코드를 명령어 단위로 읽어 실행하는 역할을 담당한다. 이 과정에 인터프리터 방식과 JIT 컴파일러 방식을 혼용해 사용한다.

JIT(Just-In-Time) 컴파일러

인터프리터 방식은 명령어를 한줄씩 읽어 처리하는 방식으로 속도가 느리다는 단점이 있지만 JIT 컴파일러 방식은 바이트 코드 전체를 컴파일하여 네이티브 코드로 변환하고 캐시에 저장해 놓아 반복적인 실행에 대한 성능을 향상시킨다. 기본적으로는 인터프리터 방식으로 실행하면서 일정 기준에 따라 JIT 컴파일러를 실행하는 구조 이다.

JNI

자바 네이티브 인터페이스(Java Native Interface)는 자바 언어로 작성된 프로그램이 다른 언어로 작성된 코드를 호출하거나 다른 언어로 작성된 코드가 자바 메서드를 호출할 수 있도록 하는 프로그래밍 프레임워크이다.

쉽게 하드웨어 연동등을 위해 C언어로 작성된 모듈을 자바에서 호출할 수 있도록 하는 기술이다. 안드로이드에서도 유사하게 NDK(Native Development Kit)를 통해 C언어로 작성된 모듈을 호출할 수 있다.

JDK

JDK(Java Development Kit)은 자바 개발을 위한 개발킷으로 컴파일러디버거등이 포함되어 있습니다. 단순히 자바 프로그램을 실행하기 위해서는 JRE(Java Runtime Environment)만으로도 가능하지만 자바 프로그램을 개발하기 위해서는 JDK가 필요하다.

  • 자바 프로그램을 개발하기 위한 개발킷으로 컴파일러디버거등이 포함됨.
  • 단순히 자바 프로그램을 실행하기 위해서는 JRE(Java Runtime Environment)만으로도 가능.
  • Eclipse, IntelliJ 등 통합개발환경을 사용해도 JDK는 필요함.
  • 현재 자바의 최신 버전은 Java 22 이며 LTS(Long Term Support) 버전은 Java 21으로 2028년(최대 2031년 까지) 까지 지원 예정.

Java SE Support Roadmap

오라클의 공식 자바 버전과 지원 로드맵은 오라클 홈페이지를 참고한다.

자바 활용 분야

많은 웹서비스백엔드 개발에 주로 사용되고 있다. 앞에서 언급한 서블릿, JSP, 스프링프레임워크등이 대표적이며 국내에서는 드물지만 외국에서는 PC기반의 프로그램이나 임베디드 장치에 들어가는 UI 프로그램 개발에도 종종 사용 된다. 전세계적으로 유명한 마인크래프트 라는 게임은 원래 자바로 만들어졌다.

이외에도 많은 영역에서 자바가 사용되지만 단적으로 이야기 하면 PC용 GUI프로그램 개발에는 적합하지 않으며 주로 서버측에서 돌아가는 프로그램 개발에 많이 사용되고 있다고 이해하면 된다.

  • 네이버와 같은 인터넷 포탈, 인터넷 뱅킹, 쇼핑몰, SNS 플랫폼 등의 백엔드 서비스 개발.
  • 강력한 Spring Framework 의 도움으로 고도의 성능과 안정성, 보안, 트랜잭션등이 요구되는 기업 시스템 개발에 널리 사용.
  • 안드로이드의 대표 개발 언어로 모바일 분야에서 널리 사용되고 있으나 Kotlin, React Native, Flutter등으로 인해 향후 다양한 변화가 예상.
  • 빅데이터, 머신러닝인공지능 기반 기술들에 자바 기반 소프트웨어들이 널리 사용되고 있음.

생각해 봅시다

  1. 자바의 가장 큰 특징은 무엇인가요?
  2. 자바의 역사를 통해 자바가 어떻게 변화해 왔는지 설명해 보세요.
  3. JVM이란 무엇인가요? JVM의 구성요소에 대해 설명해 보세요.
  4. JDK와 JRE의 차이점은 무엇인가요?
  5. 자바의 활용 분야에 대해 설명해 보세요.