[Java] Java가 전세계 PYPL 2위, TIOBE 3위인 이유

gyumin.park·2025년 2월 1일

java

목록 보기
2/2
post-thumbnail

Java는 한때 운영체제별로 다른 코딩 방식을 강요했던 시대를 뒤집고, "Write Once, Run Anywhere"라는 슬로건으로 전세계 개발자들에게 큰 사랑을 받았습니다.

Java 애플리케이션 실행 과정

이미지 출처

자바 소스코드(.java 파일)는 컴파일러에 의해 바이트코드(.class 파일)로 변환됩니다.
이 바이트코드는 JVM의 Class Loader에 의해 메모리에 로드되고, Execution Engine에 의해 실행됩니다.
즉, 운영체제에 상관없이 동일한 바이트코드를 각 플랫폼에 맞게 해석하여 실행할 수 있습니다.

정리:
자바 애플리케이션은 컴파일러가 소스를 바이트코드로 변환하고, JVM의 Class Loader와 실행 엔진이 이를 메모리에 로드하여 실행함으로써 운영체제 독립성을 보장합니다.


Java 메모리 구조

자바의 메모리 구조는 크게 두 영역으로 구분됩니다.

  • 스레드별 영역:

    • PC Register: 현재 실행 중인 명령어의 주소를 저장합니다.
    • JVM Stack Area: 각 스레드에서 호출된 메소드의 매개변수, 지역 변수, 리턴값 등을 저장합니다.
    • Native Method Stack: JNI(Java Native Interface) 등을 통해 자바 외의 네이티브 코드를 실행할 때 사용됩니다.
  • 공통 영역:

    • Method Area: 클래스 정보, 정적 변수, 메소드 등이 저장됩니다.
    • Heap Area: 런타임 중 생성되는 객체들이 할당되는 영역입니다.

정리:
자바 메모리 구조의 각 스레드는 PC Register, JVM Stack, Native Method Stack을 가지고 있으며, 모든 스레드가 공유하는 영역으로는 Method Area와 Heap이 존재합니다.


가비지 컬렉션 : GC

JVM은 메모리 관리를 위해 가비지 컬렉션(GC) 모듈을 사용합니다.
기본적으로 Mark and Sweep 알고리즘을 사용하여, 더 이상 참조되지 않는 객체들을 찾아 제거하고 메모리를 재활용합니다.

정리:
GC는 JVM의 메모리 관리 역할을 수행하며, 불필요한 객체를 제거함으로써 메모리 누수를 방지합니다. 다만, GC 동작 시 잠깐의 애플리케이션 중단이 발생할 수 있다는 단점도 있습니다.


객체지향 프로그래밍

객체지향 프로그래밍(OOP)은 현실 세계의 사물을 객체로 모델링하여, 이들 객체 간의 상호작용을 통해 프로그램을 구성하는 패러다임입니다.
OOP의 4대 특징은 다음과 같습니다:

  1. 추상화:
    • 사물의 공통된 특징을 뽑아내어 객체로 표현합니다.
    • ex) 물과 음료수의 공통점인 'drink' 추출
  2. 캡슐화:
    • 객체 내부의 데이터와 메소드를 외부에 감추어, 데이터 보호와 무결성을 유지합니다.
  3. 상속성:
    • 기존 객체의 특성을 물려받아 새로운 객체를 생성하여 코드 재활용을 극대화합니다.
  4. 다형성:
    • 동일한 메시지(메소드 호출)에 대해 서로 다른 방식으로 반응할 수 있게 합니다.
    • ex) 동일한 함수 이름인데 파라미터가 int, float, bool, object 별로 다른 로직을 수행

정리:
객체지향 프로그래밍의 4가지 특징은 추상화, 캡슐화, 상속성, 다형성입니다.


추상 클래스 vs 인터페이스

자바에서 추상화는 추상 클래스인터페이스 두 가지 방법으로 구현할 수 있습니다.

  • 추상 클래스:
    • abstract 키워드를 사용하여 정의하며, 하나 이상의 추상 메소드를 포함할 수 있습니다.
    • 주로 상속을 통해 기능을 재활용하고 확장하는 목적으로 사용됩니다.
  • 인터페이스:
    • interface 키워드를 사용하여 정의하며, 자바 8 이전에는 모든 메소드가 추상 메소드였으나, 이후에는 default 메소드와 static 메소드도 포함할 수 있습니다.
    • 여러 클래스가 동일한 동작을 수행하도록 계약(보장)을 강제하는 데 주로 사용됩니다.

정리:
추상 클래스는 기능 재활용과 확장을 위해 상속 관계를 형성하는 데 유용하며, 인터페이스는 여러 클래스가 동일한 동작을 수행하도록 보장하는 역할을 합니다.

0개의 댓글