공부/Java

[공부/Java] 자바의 특징, WORA, JVM, JDK, JRE, 배포판, 응용프로그램

yulee_to 2022. 7. 1. 21:28

Java

 


자바의 특징

  • 플랫폼 독립성
  • 객체 지향
  • 상속성, 다형성
    • 클래스로 캡슐화되어 클래스 내에서 모든 변수, 함수를 구현하고 클래스 안에 새로운 내부 클래스 작성 가능
  • 소스와 클래스 파일
    • 하나의 소스 파일에 여러 클래스 작성 가능
      • 단, public 클래스는 하나만 가능하며 소스 파일의 이름과 public클래스의 이름이 같아야 함
    • 각각의 클래스마다 파일이 만들어짐
      • 내부 클래스의 경우 외부클래스$내부클래스.class 파일로 생성
  • 실행 코드 배포
    • 여러 폴더에 걸쳐 다수의 클래스 파일로 구성된 경우 jar 파일 형태로 배포 가능
    • main()메소드는 한 클래스에 하나만 존재
  • 패키지
    • 관련된 여러 클래스를 패키지로 묶어 관리
  • 멀티스레드
    • 운영체제의 도움 없이 JVM으로 자체적인 멀티스레드를 지원
  • 모듈 프로그래밍 - Java9부터
    • 모듈 : 자바 패키지들과 이미지 XML 파일 등의 자원들을 묶은 단위
    • 모듈 프로그래밍 : 자바 응용프로그램에서 필요한 모듈을 연결하는 방식으로 작성
    • 모듈화의 목적
      • 세밀한 모듈화, 자바 응용프로그램이 실행되는데 필요없는 모듈 배제
      • 작은 크기의 실행 환경 구성
      • 하드웨어가 열악한 소형 IoT 장치 지원
  • 가비지 컬렉션
    • 자바는 메모리 반환 기능이 없고, 할당 기능만 있음
    • 가비지(할당 후 사용하지 않는 메모리)는 JVM이 자동으로 delete해줘서 개발자의 부담이 대폭 감소됨
    • 실행 도중 예측할 수 없는 시점에 가비지 컬렉션이 실행될 수도 있어 일정 시간 내에 결과를 내야만 하는 실시간 시스템에는 부적합한 특징
  • 포인터 개념이 없음
  • JIT 컴파일러 사용
    • 인터프리터 방식으로 바이트 코드를 실행해 실행이 느린 자바를 JIT(Just In Time)컴파일러 기법으로 속도를 개선
    • 실행 도중 바이트 코드를 해당 CPU의 기계어 코드로 컴파일해 해당 CPU가 기계어를 실행하게 함
    • 그래도 C/C++보단 느림

컴파일

  • 소스(source) : 프로그래밍 언어로 작성된 텍스트 파일
  • 컴파일(compile) : 소스 파일을 컴퓨터가 이해할 수 있는 기계어로 만드는 과정
    • .java -> .class

자바가 개발된 계기

1991년 선마이크로시스템즈의 제임스 고슬링에 의해 시작된 그린프로젝트에서 메모리 사용량이 적고 다양한 플랫폼을 갖는 가전 제품에 들어갈 소프트웨어를 위해 개발되었고 1995년에 발표되었다.

자바의 초기이름은 오크(OAK)였다.

 

바이트 코드 

  • CPU에 의해 직접 실행되지 않는 중립적인 코드
  • JVM에 의해 인터프리터 방식으로 해석되고 실행 가능한 바이너리 코드
  • 클래스 파일(.class)에 저장
  • 디스어셈블(disassemble)
    • 클래스 파일에 들어 있는 바이트 코드를 텍스트로 볼 수 있게 변환하는 작업
    • JDK의 javap.exe 이용
    • Ex) 명령 프롬프트 창에서 javap -c Hello > Hello.bc => Hello.class 파일을 디스어셈블해 Hello.bc 생성
    • javac Hello.java => Hello.java 컴파일해서 Hello.class 생성

WORA(Write Once Run Anywhere)

  • 자바의 WORA는 한번 작성된 코드는 모든 플랫폼에서 바로 실행된다는 의미로 C/C++ 등 기존 언어가 가진 플랫폼 종속성을 극복
  • 웹 브라우저, 분산 환경을 지원해 네트워크에 연결된 어느 클라이언트에서나 실행가능
  • WORA를 가능하게 하는 자바의 특징
    • 바이트 코드
    • JVM

Java와 C/C++의 개발/실행 환경 비교

C/C++ Java
  • 여러 소스(.c) 파일로 나누어 개발
  • 컴파일러가 중간 단계인 목적 코드를 생성
  • 링커가 목적 코드 및 정적 라이브러리들을 연결하여 실행 가능한 파일을 생성
  • 동적 라이브러리의 경우 실행 중에 동적 링크
  • 플랫폼마다 목적 코드 및 실행 파일이 다름
  • 실행 파일은 모두 메모리에 올려져야 실행되고 메모리가 적은 경우 실행이 실패하거나 성능이 크게 저하됨
  • 소스파일(.cpp) -> 컴파일러/링커 -> 바이너리 실행 파일(.exe) -> C++ 프로그램 (.exe)
  • 여러 소스(.java)로 나누어 개발
  • 컴파일러가 바로 바이트 코드(.class)를 만들고, 하나의 실행파일(.exe)로 만드는 링크 과정이 없음
  • 바이트 코드는 JVM에서만 실행이 가능
  • main()메소드를 가진 클래스에서부터 실행이 시작
  • JVM에 포함된 로더가 클래스 파일을 필요할 때만 동적으로 로딩(혹은 ClassLoader 클래스를 이용해 개발자가 직접 로딩 가능)하고 적은 메모리로 실행이 가능
  • 소스파일(.java) -> 컴파일러 -> 바이트 코드(.class) -> 자바 프로그램 (.class)

자바 가상 기계 (JVM, Java Virtual Machine)

  • 동일한 자바 실행환경을 제공해주기 위해 각기 다른 플랫폼에 설치하는 소프트웨어
  • JVM 자체는 플랫폼에 종속적이지만 자바는 독립적
  • 오라클과 IBM 등에서 개발 및 공급됨
  • 자바 응용프로그램을 실행시키려면 JVM이 응용 프로그램을 구성하는 클래스 파일(.class)의 바이트 코드를 실행

JDK(Java Development Kit)

  • 자바 응용 개발 환경으로 개발에 필요한 도구 포함
  • C/C++에서의 라이브러리와 비슷한 기능
  • 컴파일러, 디버거, JRE 등을 포함

JDK의 디렉터리 구조

  • bin - 자바 개발, 실행에 필요한 도구와 유틸리티 명령
  • conf - 여러 종류의 배치 파일
  • include - 네이티브 코드 프로그래밍에 필요한 C언어 헤더 파일
  • jmods - 컴파일된 모듈 파일들
  • legal - 각 모듈에 대한 저작권과 라이선스 파일
  • lib - 실행 시간에 필요한 라이브러리 클래스들

JRE(Java Runtime Environment)

  • 자바 실행 환경으로 JVM 포함
  • 컴파일된 자바 API 들이 들어 있는 모듈 파일
  • 개발자가 아닌 경우 JRE만 따로 다운 가능

자바의 배포판

  • Java SE
    • 자바 표준 배포판( Standard Edition)
    • 데스크탑과 서버 응용 개발 플랫폼
  • Java ME
    • 자바 마이크로 배포판(Micro Edition)
    • 휴대전화나 임베디드 시스템 등 제한된 리소스를 갖는 하드웨어에서 응용 개발을 위한 플랫폼
    • Java SE의 서브셋 + 임베디드 및 가전 제품을 위한 API 정의
  • Java EE
    • 자바 기업용 배포판 (Enterprise Edition)
    • 자바를 이용한 다중 사용자, 기업용 응용 개발을 위한 플랫폼
    • Java SE + 인터넷 기반의 서버사이드 컴퓨팅 관련 API 정의


자바 응용프로그램

  • 데스크탑 응용프로그램
    • JRE가 설치된 어떤 컴퓨터에서도 실행 가능
  • 서블릿(Servlet) 응용 프로그램
    • 웹 서버에서 실행되는 자바 프로그램
    • 데이터베이스 서버 및 기타 서버와 연동하는 복잡한 기능 구현 시 사용
    • 사용자 인터페이스가 필요 없고 웹 서버에 의해 실행이 통제 됨
  • 안드로이드 앱
    • 구글과 여러 모바일 회사가 모여 구성한 OHA(Open Handset Alliance)에서 만든 무료 모바일 플랫폼
    • 언어는 자바를 사용하나 JVM에 해당하는 Dalvik은 기존 바이트 코드와 호환서잉 없어 변환이 필요함
728x90