[Java] WORA

전두엽힘주기·2025년 10월 21일

Java

목록 보기
2/9

OOP, C++ 비교, WORA

1. 객체 지향 (OOP) 기본 개념

객체 (Object)

  • 상태 (State): 객체의 현재 데이터. 변수에 담긴 값에 의해 확정됨.
  • 메서드 (Method): 객체의 동적인 행위. 함수에 해당함.

클래스 (Class)

  • 객체를 만들어내기 위한 설계도.

OOP (Object-Oriented Programming)

  • 모든 것을 객체로 표현하고, 그 객체들 간의 관계를 통해 프로그램을 완성하는 방식.

객체 지향 핵심

  1. 추상화: 공통점을 뽑아내어 부모 클래스를 정의하는 과정.
  2. 상속: 부모 클래스의 상태와 메서드를 자식 클래스가 물려받는 것.
  3. 다형성: 추상화와 상속을 통해 부모와 자식 객체를 동등하게 취급, 하나의 메서드가 상황에 따라 다르게 동작하게 만드는 기술.

2. C/C++와 Java의 핵심 차이

Java는 C/C++를 기반으로 만들어졌지만, 복잡한 부분을 개선함.

1) 자동 메모리 관리 (Garbage Collection)

  • C/C++: 개발자가 포인터를 사용해 메모리를 직접 할당하고(동적 할당), 사용 후 반드시 직접 해제(free)해야 함.
  • Java: 가비지 컬렉터 (Garbage Collector, GC)가 자동으로 작동. 쓸모없어진 메모리를 알아서 찾아 수거함. 개발자가 메모리 해제에 대한 부담이 없음.

2) 완전한 객체 지향

  • C++: main 함수에서 시작하며, 필요에 따라 객체 지향 개념을 사용하는 방식. (절차 지향 기반)
  • Java: 완전한 객체 지향 언어. 모든 코드는 반드시 class 안에서 정의되어야 함.

3. Java의 가장 큰 특징: 플랫폼 독립성 (WORA)

Java가 C/C++의 '플랫폼 종속성' 문제를 어떻게 해결했는지가 핵심.

C/C++의 문제: 플랫폼 종속성

  • C/C++ 코드를 컴파일하면 .exe 같은 실행 파일이 생성됨.
  • 이 파일은 플랫폼에 종속적. (예: 윈도우용 .exe는 리눅스/맥에서 실행 불가)
  • 이유: OS나 CPU(Intel, ARM)마다 기계어를 해석하는 방식이 다르기 때문.

Java의 해결책: 바이트코드와 JVM

Java는 컴파일과 실행을 2단계로 분리.

1단계: 바이트코드 (Bytecode) 생성

  • HelloWorld.java 파일을 자바 컴파일러(javac)로 컴파일.
  • HelloWorld.class 파일이 생성됨.
  • .class 파일은 기계어가 아니라, '바이트코드(Bytecode)'라고 불리는 중립적인 중간 코드. 어떤 OS에도 종속되지 않음.

2단계: JVM (Java Virtual Machine) 실행

  • 이 중립적인 바이트코드(.class)를 해석하고 실행하는 주체가 바로 JVM (자바 가상 머신).
  • 핵심: JVM 자체는 플랫폼에 종속적. (즉, '윈도우용 JVM', '리눅스용 JVM'은 각각 따로 설치해야 함)

결론: WORA (Write Once, Run Anywhere)

  • 개발자는 플랫폼에 독립적인 바이트코드(.class)만 만들면 (Write Once),
  • 사용자가 자신의 OS에 맞는 JVM을 설치함으로써 어디서든 실행할 수 있게(Run Anywhere) 됨.

단점: JVM이라는 중간 단계를 거치기 때문에, C/C++보다 필연적으로 속도가 느림.


4. Java 실행 환경과 과정

용어 정리 (JDK, JRE, JVM)

  • JVM (Java Virtual Machine): 자바 바이트코드(.class)를 실제로 실행하는 가상 머신.
  • JRE (Java Runtime Environment): JVM을 포함. 자바 프로그램을 '실행'하는 데 필요한 환경.
  • JDK (Java Development Kit): JRE + 컴파일러(javac) 등 개발 도구. '개발자'에게 필요한 도구 모음.

컴파일 및 실행 순서

  1. 작성: Hello.java 텍스트 파일 작성.
  2. 컴파일: 터미널에서 javac Hello.java 실행.
  3. 결과: Hello.class (바이트코드) 파일 생성.
  4. 실행: 터미널에서 java Hello 실행 ( .class 확장자 안 씀).
  5. 동작: JRE의 JVM이 Hello.class를 읽어들여 해석하고 실행.

5. Java 주요 문법 및 개념

프로그램의 시작점: main 메서드

  • JVM은 프로그램을 실행할 때, 클래스 내부에서 public static void main(String[] args) 형태를 가진 main 메서드를 찾아 '진입점(Entry Point)'으로 삼음.
  • 규칙 1: 하나의 클래스 안에는 main 메서드가 두 개 이상 존재할 수 없음.
  • 규칙 2: 서로 다른 클래스는 각자 자신의 main 메서드를 가질 수 있음.
    • java A 실행 시 -> A.classmain 실행
    • java B 실행 시 -> B.classmain 실행

클래스 파일 생성 단위

  • 하나의 .java 소스 파일 안에 클래스를 여러 개(예: 4개) 정의할 수 있음.
  • 이 파일을 컴파일하면, 클래스 개수만큼(4개)의 .class 파일이 각각 생성됨.

가비지 컬렉션(GC)의 장단점

  • 장점: 개발자가 메모리 해제(free)를 직접 하지 않아도 되므로 훨씬 안정적이고 편리함.
  • 단점: GC가 '언제' 실행될지 그 '타이밍'을 알 수 없음.
  • 결과: 만약 중요한 연산 도중 갑자기 GC가 실행되면, 시스템 전체가 순간적으로 멈칫하는 '보틀넥(bottleneck)'이 발생할 수 있음.
  • 용도: 이 때문에 인공위성, 군사 목적 등 높은 실시간성을 담보해야 하는 시스템에는 자바를 사용하지 않고, 메모리를 직접 제어하는 C/C++를 사용.

코드 구성 단위

  • 패키지 (Package): C++의 namespace와 유사. 이름 충돌을 방지하기 위해 클래스들을 묶는 '폴더' 개념.
  • 모듈 (Module): (자바 9 이후) 패키지보다 더 큰 단위로, 관련된 클래스와 패키지들을 묶어 관리.

0개의 댓글