극동대학교\AI컴퓨터공학과\JAVA

1) 자바 개념

sundori 2023. 12. 20. 10:11

Java

객체지향하면 대표적인 언어로 Java, C++, Python, C#, Swift 등 많은 언어를 생각할 것이다.

여기서 내가 공부하는 자바는 처음부터 객체지향 언어로 개발된 프로그래밍 언어로서 C언어에 객체지향 개념은 얹은 C++과는 사뭇 다르다. 이러한 자바는 자바 가상 머신 Java Virtual Machine, JVM을 사용하는데...

C++은 자바와 다르게 컴파일된 코드가 특정한 플랫폼에 의존적인데, C++코드는 기계어로 직접 변환되며, 이는 특정 운영체제와 하드웨어 아키텍처에 맞춰져 있어 C++로 작성된 프로그램을 다른 운영체제에서 실행하려면 해당 운영체제에 맞게 다시 컴파일해야 한다.
하지만 자바는 "Write Once, Run Anywhere(WORA)"라는 개념을 지향해 특정 운영체제에 의존하지 않고 여러 플랫폼에서 실행이 될 수 있다.

WORA

자바가 운영체제와 독립적으로 동작이 가능하다는 개념은 WORA라고 표현하며 이는 특정 운영체제에 의존하지 않고 여러 플랫폼에서 사용이 가능하다는 뜻이다. 이러한 WORA는 밑에 3개의 원리에 기반한다.

  1. 컴파일 : 자바 소스 코드는 자바 컴파일러(Javac)를 사용하여 바이트 코드로 컴파일되며, 이 바이트 코드는 특정 운영체제나 하드웨어에 의존하지 않는 중간 형식이다. 즉, 바이트 코드는 JVM에서 실행되기 위한 중간 형식으로 , 바이트코드는 자바 가상 머신이 이해할 수 있는 명령어로 sequence로 구성되어 있으며, JVM은 이를 각 플랫폼에 맞는 기계어로 해석하여 실행한다. 
    이러한 자바 컴파일러는 javec.exe로 설치된다.
    이러한 구조로 의존적이지 않고 다양한 플랫폼에서 사용이 가능하다는 것이다.
  2. 바이트코드 : 자바 바이트코드는 운영체제에 맞는 JVM에서 실행이 되는데 이 바이트코드는 자바가상 머신(JVM)에서 실행되기 위한 명령어의 연속(Sequence)으로 이루어져 있다. 그리고 자바 바이트코드는 자바 컴파일러에 의해 변환이 되면 코드의 명령어 크키가 1바이트여서 바이트코드라고 부루며, 이러한 자바 바이트코드의 확장자는 000.class이다.
  3. JVM 실행 : 자바 프로그램은 운영체제에 맞는 JVM에서 바이트코드를 실행하게 되는데 JVM은 운영체제와 하드웨어 간의 차이를 후상화하고, 바이트 코드를 해당하는 시스템에서 실행 가능한 기계어로 번역하여 실행한다. 이러한 자바 가상 머신은 자바 인터프리터, 클래스로더, JIT 컴파일러, 가비지 컬렉터 등이 있는데...


자바 가상 머신의 구성

  1. 클래스 로더(Class Loader):
    • 클래스 로더는 자바 클래스 파일들을 로드하고, 이들을 JVM의 메모리에 적재한다. -> 자바 인터프리터
    • 로드된 클래스는 메모리에 있는 다른 클래스들과 연결되어 클래스의 계층 구조를 형성한다. ->  동적으로 클래스 로딩.
    • 즉, 변환된 자바 바이트코드를 읽어 해석한다.
  2. 메서드 영역(Method Area):
    • 메서드 영역은 JVM이 로드한 클래스 파일의 바이트코드, 스태틱 변수, 상수, 메서드 등을 저장하는 공간이다.
    • 모든 스레드가 공유하는 메모리 영역으로, JVM이 시작될 때 생성되고 종료될 때까지 유지된다.
  3. 힙(Heap):
    • 힙은 동적으로 생성된 객체 인스턴스가 저장되는 영역으로, 가비지 컬렉션을 통해 관리된다.
    • 힙은 쓰레드 간에 공유되는 자바 객체들의 인스턴스가 할당되는 메모리 공간이다.
  4. 스택(Stack):
    • 스택은 각각의 스레드마다 할당되며, 메서드 호출과 관련된 지역 변수, 메서드 호출 정보, 부분 결과 등을 저장한다.
    • 스택은 스레드의 독립적인 실행 흐름을 지원하며, 각 메서드 호출에 대해 별도의 스택 프레임이 생성된다.
  5. PC 레지스터(Program Counter Register):
    • 각각의 스레드마다 현재 수행 중인 명령어의 주소를 가리키는 PC 레지스터가 할당된다.
    • 스레드가 다른 메서드로 이동하면 해당 메서드의 PC 값이 스택에 저장되고, 이전 메서드의 PC 값이 로드된다.
  6. 네이티브 메서드 스택(Native Method Stack):
    • 자바 코드가 네이티브 메서드(다른 언어로 작성된 코드)를 호출할 때 사용되는 스택이다.
    • 일반적으로 자바 코드에서 JNI(Java Native Interface)를 통해 네이티브 메서드를 호출할 때 사용된다.
  7. 실행 엔진(Execution Engine):
    • 실행 엔진은 바이트코드를 해석하거나, JIT(Just-In-Time) 컴파일러를 통해 기계어로 변환하여 실행한다.
    • JIT 컴파일러는 반복 실행되는 코드를 컴파일하여 런타임 성능을 향상한다.

"명령어의 연속" -> 일련의 명령어가 순차적으로 나열된 것으로 자바 바이트코드는 자바 소스 코드의 각각의 문장과 표현식을 특정한 명령어들의 연속으로 변환한 것이다. 바이트코드는 자바 가상 머신이 이해할 수 있는 형태의 명령어들로 이루어져 있는데, 예를 들어, 변수를 선언하거나 연산을 수행하는 등의 각각의 자바 소스 코드 문장은 바이트코드에서 해당하는 명령어로 변환이 된다. 이렇게 변환된 명령어들이 순차적으로 실행되면서 프로그램이 동작한다.

이러한 자바의 특징은?

  1. 운영체제 독립성: "Write Once, Run Anywhere(WORA)"의 원칙에 따라 자바는 운영체제에 독립적인 바이트코드를 생성하므로, 한 번 작성한 코드를 다양한 플랫폼에서 실행할 수 있다.
  2. 객체지향 프로그래밍 지원: 자바는 객체지향 프로그래밍(OOP)을 강력하게 지원하여 모듈화, 재사용성, 유지보수성 등을 향상시킨다.
  3. 풍부한 표준 라이브러리: 자바는 풍부한 표준 라이브러리를 제공하며, 이를 통해 개발자는 데이터 구조, 알고리즘, 네트워킹, 입출력 등 다양한 작업을 쉽게 수행할 수 있다.
  4. 가비지 컬렉션: 자바는 가상 머신이 자동으로 더 이상 사용되지 않는 객체를 관리하는 가비지 컬렉션을 지원하여 메모리 관리를 단순화하고 프로그래머의 부담을 줄인다.
  5. 다중 스레드 지원: 자바는 다중 스레드를 지원하므로 병렬 처리가 쉽게 구현됩니다. 이는 멀티코어 프로세서를 활용하여 성능을 향상할 수 있는 장점을 제공한다.

이러한 자바의 단점은?

  1. 성능: 자바는 일부 다른 언어들에 비해 상대적으로 높은 실행 속도를 가지고 있지만, 여전히 일부 고성능 응용프로그램에서는 다른 언어보다 성능이 낮을 수 있다. 이는 자바의 가상 머신 구조와 가비지 컬렉션 등이 성능에 영향을 미칠 수 있기 때문이다.
  2. 메모리 소모: 자바 애플리케이션은 일반적으로 상대적으로 많은 메모리를 사용하는데, 가상 머신 및 가비지 컬렉션의 오버헤드, 객체 지향 프로그래밍의 특성 등이 메모리 소모를 높일 수 있다.
  3. 배경 메모리 사용: 자바 애플리케이션은 배경에서 실행되는 가상 머신으로 인해 시스템의 배경 메모리를 사용하게 된다. 따라서 일부 시스템에서는 이러한 자원 사용이 부담으로 느껴질 수 있다.
  4. 컴파일 속도: 자바는 기본적으로 인터프리터 방식이 아니라 바이트코드를 생성한 후에 실행하기 때문에 컴파일 속도가 다른 언어에 비해 느리다.
  5. 복잡한 배포 구조: 자바 애플리케이션을 배포할 때 자바 가상 머신의 존재로 인해 복잡한 구조를 가질 수 있는데, 사용자가 시스템에 자바 가상 머신을 설치해야 하거나, 실행 가능한 JAR 파일 등을 제공해야 하는 등의 번거로움이 있을 수 있다.
  6. 스크립팅 언어에 비해 문법이 무겁다: 자바는 명시적인 타입 선언, 클래스 구조 등의 특성으로 인해 다른 몇몇 스크립팅 언어에 비해 문법이 더 무겁게 느껴질 수 있다.
  7. 설계 시 상속의 복잡성: 객체 지향 프로그래밍에서의 상속 구조는 잘못 사용될 경우 복잡성을 증가시킬 수 있다. 그러한 이유들 중 다중 상속을 지원하지 않으며, 클래스 계층 구조의 변경이 어려울 수 있다.

'극동대학교\AI컴퓨터공학과\JAVA' 카테고리의 다른 글

4) 자바 8  (0) 2023.12.23
3) 자바 입출력문  (0) 2023.12.23
2) 자바 프로그램  (0) 2023.12.20
Arrays.  (0) 2023.05.17
Stream API이란.  (0) 2023.05.17