자바의 특징
- 플랫폼 독립성
- 객체 지향
- 상속성, 다형성
- 클래스로 캡슐화되어 클래스 내에서 모든 변수, 함수를 구현하고 클래스 안에 새로운 내부 클래스 작성 가능
- 소스와 클래스 파일
- 하나의 소스 파일에 여러 클래스 작성 가능
- 단, 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 |
|
|
자바 가상 기계 (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
'공부 > Java' 카테고리의 다른 글
[공부/Java] 자바의 main() 메소드, 예외, 예외 처리, try-catch-finally, 예외 클래스 (0) | 2022.07.11 |
---|---|
[공부/Java] 자바의 배열, 선언, 생성, 초기화, 인덱스, 치환, 공유, 크기, for-each문, 리턴 (0) | 2022.07.11 |
[공부/Java] 자바 키보드 입력 - Scanner (0) | 2022.07.04 |
[공부/Java] 자바의 데이터 타입, 리터럴, var, 상수, 타입 변환, 수식연산자, 조건문, 반복문 (0) | 2022.07.04 |
[공부/Java] 자바 프로그램 기본 구조, 식별자, 식별자 원칙, 관습 (0) | 2022.07.04 |