JAVA 특징(1): 자바가 왜 인기가 많은가?

K_Raphel·2023년 6월 28일

자바

목록 보기
1/5


오늘 주제는 왜 자바가 인기가 많았고, 아직도 많은지에 대해서 이야기 해보려고 한다.

자바란 무엇인가?

이 질문은 자바라는 언어의 모든 개념을 답해야할만큼 큰 질문이다. 그래서 우선적으로 자바의 특징들을 다루며, 자바를 알아가보자.

자바의 특징

  1. OOP(object oriented programming)
  2. 자동 메모리 관리 -> GC(garbage collector)
  3. 운영체제에 독립적 -> JVM(java virtual machine)
  4. 멀티쓰레드 지원
  5. 동적 로딩 지원

write once, run anywhere


이 슬로건은 자바의 것이다. 자바는 기존 언어들과는 다르게 JVM이라는 단계를 가지고 있기 때문에, 어떤 운영체제에서도 동일한 결과를 갖는다. 단, 코드 자체가 os에 독립적이지 못하는 경우(ex, OS 특정 파일 경로, 환경변수, OS 특정 라이브러리 등등)에는 동일한 결과를 갖지 못한다. 이는 Docker와 같은 서비스들이 왜 출시 되었을까를 고민해보면 답이 나온다.

JVM이란?

JVM의 구조


여기서 source code는 사람들이 만든 언어이고, byte code는 컴퓨터들의 언어이다. java compiler는 쉽게 우리가 흔히 쓰는 JDK(Java Developement Kit)에 포함되어 있고, source code -> Byte Code로 변환해준다.

JVM의 역할

자바 가상 머신(JVM)은 자바 프로그램 실행환경은 만들어 주는 S/W이다. 자바 코드를 컴파일하여, .class 바이트 코드로 만들면 이 코드가 JVM에서 실행된다. JVM은 JRE(Java Runtime Environmen)에 포함되어 있다.

JVM은 크게 GC, Class Loader, Execution Engine, Runtime Data Area로 구성되어 있다.

Garbage Collector(GC)


GC는 어떻게 보면 "환경 미화원" 역할은 한다. Java의 특징 중 하나인 자동 메모리 관리에서 우리의 환경 미화원은 중요한 역할을 한다. 다들 C언어를 공부하다보면 저수준에서 소스 코드를 짜느라 탈모를 걱정해봤을 것이다. 메모리를 할당하고, 메모리의 주소를 반환하고, 메모리를 해제하는 코드를 "직접" 구축한다는 것은 C언어 사용자와 개발자에게 존경심을 유발할 정도로 고통스럽다.(개인 소감이다.)
하지만 Java는 "환경 미화원 GC씨"가 있다. GC는 Heap 메모리 영역을 "돌아다니며" 객체들 중에 참조되지 않은 객체들을 "수거"하는 역할을 한다. JVM은 GC를 이용하여 사용하지 않는 메모리를 자동으로 회수한다. 따라서 개발자가 따로 메모리를 관리하지 않아도 되며, 더욱 손쉽게 프로그래밍을 할 수 있다.

클래스 로더(Class Loader)


자바는 동적으로 클래스를 읽어오며, 프로그램이 실행 중인 런타인에서야 모든 코드가 JVM과 연결된다. 이렇게 동적으로 클래스를 로딩해주는 역할을 하는 것이 클래스 로더이다.(말이 어렵다.)
java에서 우리(개발자, 사람)인 쓴 코드는 .java이다. 그런데 이 .java는 컴퓨터가 이해하지 못한다. 그래서 java compiler가 .java를 .class로 변환해준다. 이제 .class가 있고, 이게 컴퓨터(기계)가 이해할 수 있는 "말"이다. 그럼 이 .class가 자동으로 JVM으로 갈까? 그렇지 못해서 Class loader라는 것을 사용해서 "동적"으로 .class를 메모리에다가 유도하는 것이다.
Class Loader: .class를 memory에 넣는/유도하는 것.

실행 엔진(Execution Engine)

진짜 엔진이다. JVM에서 .class, 바이트코드를 실행하는 런타임 모듈이 실행 엔진(execution engine)이다. 우리 엔진은 바이트코드를 명령어 단위로 읽어서 실행한다.

런타임 데이터 영역(Runtime Data Area): Memory Area


런타임 데이터 영역은 JVM이 프로그램을 수행하기위해 운영체제로부터 할당받은 메모리 공간이다.

모든 스레드가 공유해서 사용 (GC의 대상)

  • 힙 영역 (Heap Area)
  • 메서드 영역(Method Area)

스레드(Thread) 마다 하나씩 생성

  • 스택 영역(Stack Area)
  • PC 레지스터 (PC Register)
  • 네이티브 메서드 스택(Native Method Stack)

런타임 데이터 영역은 heap, thread 그리고 깊게 들어가면 java life cycle을 이야기해야 하기 때문에 다음 글에서 이야기 해보겠다.

그래서 Java가 왜 인기가 많았고 많은가?

여기서부터는 내 생각이지만, 1990년도부터 개발자들의 고통이 승화돼서 JAVA와 Python과 같은 편의성 높은 언어들이 개발된 것 같다. C언어의 저수준 언어를 개발하면서 직접 메모리를 할당하고, 플랫폼에 자유롭지 못해 오던 불편함과 고뇌는 Java같은 플랫폼(OS) 독립적이고, 메모리 관리를 알아서 해주는 언어가 각광 받았지 않을까 싶다.
또 다른 이유를 추측해본다면, Java는 네트워크 지원이 뛰어나다. 1990년도 초기부터 시작한 네트워크 산업의 부흥기는 이에 적합한 컴퓨터 언어를 요구했다. 다시, C언어는 저수준 언어다. C언어는 메모리와 하드웨어에 직접 전극할 수 있는 기능을 제공하는게 주목적이다.
하지만 Java는 네트워크 지원이 아주 뛰어나다. Java의 소켓 프로그래밍을 비롯한 다양한 네트워크 관련 기능은. Java가 당시 네트워크 산업 부흥기의 시대 부름의 산출물이 아닐까 싶다.
그렇다면 왜 아직도 Java는 인기가 많은가? 이제부터는 진짜 개인적인 의견이다
Java가 개발된 1995년부터 꾸준한 업데이트와 개발자들의 피드백이 지속적으로 누적되어 왔다. 대부분은 JAVA에 반영이 되어, 성능을 끌어올리고 있다. 지금 stackoverflow에서 내가 모르겠는 JAVA 문제가 없는 것이 있는가? 나는 없다고 본다. 높은 편의성과 인터넷에 누적된 지식은 JAVA를 아직도 매력적인 언어로 자리매김하는데 큰 몫을 하고 있다고 생각한다.

0개의 댓글