목차
- 프로그래밍 언어
- 컴파일 의미(C/C++과의 비교)
- 자바의 목적, WORA 개념
- JAVA 개발 및 실행환경(C/C++과의 비교)
- JDK
- JRE
- Java API
- Package
- Java의 특성 요약
- 자바 배포판(Edition) 종류 - java API 차이
- 모듈 프로그래밍(Java 9 부터)
- Java 응용의 종류
- Javadoc : Java API 문서 생성 도구
( 이 글에서 명시되지 않은 경우 모두 Java 8 기준)
프로그래밍 언어
프로그램이 작성한 언어
종류
-
기계어 : 기계어가 지칭하는 기계는 컴퓨터의 CPU를 의미한다. 즉 기계어는 컴퓨터의 CPU만 이해하고 처리가능한 언어이다.
(이진수, 즉, 0,1 로 구성됨)
-
어셈블리어 : 기계어 명렁을 니모닉 기호(mnemonic symbol) 로 일대일 대응시킨 언어
Mnemonic Symbol : ADD, SUB, MOVE, .... 기계어에 비해서는 표현하기 쉽고 상징적인 단어들로 구성됨
-
고급언어 : 사람이 이해하기 쉬움. 복잡한 작업 / 자료구조 / 알고리즘을 표현하기 위해 고안된 언어
( Pascal, Basic, C/C++, Java, C# )
절차 지향 언어, 객체 지향 언어
cf. 프로그래밍 언어의 진화
출처 : 명품 Java Programming(황기태, 김효수 저)
컴파일
소스 : 프로그래밍 언어로 작성된 텍스트 파일
컴파일 : 소스파일을 컴퓨터가 이해할 수 있는 기계어로 만드는 과정
소스코드 --컴파일--> 실행 파일
소스파일과 컴파일된 파일의 확장자
- 자바
.java(소스코드) - 컴파일 -> .class (바이트코드)
.java / .class 파일 모두 기계어코드, 실행파일이 없어도 실행가능(JVM)
- C
.c(소스코드) -> .obj -> .exe
.obj, .exe파일은 기계어 코드
- C++
.cpp -> .obj -> .exe
실행파일 : 어떤 작업을 위해 실행할 수 있는 파일
프로세스(Process) : 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
실행파일이 디스크에 위치하면 프로그램, 메모리에 위치하면 프로세스
cf. C/C++ : 프로그램의 전처리, 컴파일, 링크 과정
Start_up code : 응용프로그램의 메모리 관리(ex. 할당), main 함수 호출
즉, a.exe (실행파일) 실행시 Start_up code 를 실행 후 main 함수가 호출됨.
자바의 목적
태동 : 가전 제품에 들어갈 소프트웨어를 위해 개발
- 플랫폼 호환성 문제 해결
- 플랫폼 독립적인 언어 개발 : 모든 플랫폼에서 호환성을 갖는 프로그래밍 언어 필요
- 메모리 사용량이 적고 다양한 플랫폼을 가지는 가전 제품에 적용
가전제품 : 작은량의 메모리를 가지는 제어 장치, 내장형 시스템 요구 충족
WORA (Write Once Run Anywhere) : 플랫폼 독립성
- 한번 작성된 코드는 모든 플랫폼에서 바로 실행
- C/C++ 등 기존 언어가 가진 플랫폼 종속성 극복
OS, 하드웨어에 상관없이 자바 프로그램이 동일하게 실행
- 네트워크에 연결된 어느 클라이언트에서나 실행 (웹 브라우저, 분산 환경 지원)
WORA를 가능케 하는 자바의 특징
- 바이트 코드 (byte code) : 자바 소스코드를 컴파일한 목적 코드 (object file)
- cpu에 종속적이지 않은 중립적인 코드
- JV에 의해 해석되고 실행됨
- JVM (Java Virtual Machine) : 자바 바이트 코드를 실행하는 자바 가상 기계 (플랫폼종속적)
- 자바 응용프로그램 실행 : JVM이 응용프로그램을 구성하는 클래스파일(.class)의 바이트 코드 실행
cf. 바이트코드의 디어셈블(disassemble) : 클래스 파일에 들어있는 바이트 코드 -> 텍스트(JDK 의 javap.exe 이용)
자바의 개발 및 실행 환경
- Java & C(C++)
| JAVA | C / C++ |
프로그램 개발 | - 여러 소스(.java)로 나누어 개발 - 바이트 코드(.class)를 하나의 실행 파일(exe)로 만드는 링크 과정 없음 | - 여러 소스(.c) 파일로 나누어 개발 - 링크를 통해 실행에 필요한 모든 코드를 하나의 실행 파일(.exe)에 저장 |
실행 | - main() 메소드를 가진 클래스에서 부터 실행 시작 - JVM은 필요할 때 클래스 파일을 프로그램 실행중에 동적으로 로딩 (JVM에 포함된 ClassLoader에 의해 이루어짐, ClassLoader 클래스로 개발자가 직접 클래스 로딩도 가능) - 적은 메모리로 실행 가능 | - 링커가 목적 코드와 라이브러리 링크, 실행 파일 생성 - 정적 라이브러리는 실행 파일에 포함 -> 실행 파일 크기가 커짐 - 동적 라이브러리는 실행중에 동적 링크 - 목적 코드 / 실행 파일은 플랫폼에 따라 다름 (다른 플랫폼에서는 다시 컴파일 및 링크) |
- JAVA
- C/C++
JDK
자바 응용 개발 환경. 개발에 필요한 도구를 포함한다.
- 컴파일러, 컴파일된 자바 API 클래스들이 들어있는 모듈 파일들, 샘플 등 포함
- JDK의 bin 디렉토리에 개발 도구가 포함되어 있음.
이러한 개발도구들은 플랫폼 종속적이다.
[ 주요 개발 도구 ]
- javac - 자바 소스를 바이트 코드로 변환하는 컴파일러
- javadoc – 자바 소스로부터 HTML 형식의 API 도큐먼트 생성
- jar – 자바 클래스들(패키지포함)을 압축한 자바 아카이브 파일(.jar) 생성 관리
- jmod - 자바의 모듈 파일(.jmod)을 만들거나 모듈 파일의 내용 출력
- jlink - 응용프로그램에 맞춘 맞춤형(custom) JRE 제공
- jdb - 자바응용프로그램의실행중오류를찾는데사용하는디버거
- javap - 클래스 파일의 바이트 코드를 소스와 함께 보여주는 디어셈블러
JRE
자바 실행 환경 ( JVM 포함 )
- 컴파일된 자바 API들이 들어있는 모듈 파일
- 개발자기 아닌 경우 JRE만 따로 다운 가능
Java API
JDK에 포함된 클래스 라이브러리
주요한 기능들을 미리 구현한 클래스 라이브러리의 집합
자바 온라인 API 문서 : https://docs.oracle.com/javase/10/docs/api/
Package
서로 관련된 클래스들을 분류하여 묶어 놓은 것 (폴더 개념)
- 계층구조로 되어 있음
- 클래스의 이름에 패키지 이름도 포함 (java.lang.System은 java\lang 디렉터리의 System.class 파일)
- 다른 패키지에 동일한 이름의 클래스 존재 가능
- 자바 API(클래스 라이브러리)는 JDK에 패키지 형태로 제공됨
- 필요한 클래스가 속한 패키지만 import하여 사용
- 개발자 자신의 패키지 생성 가능
Java의 특성
- 플랫폼 독립성
- 객체 지향 (상속성, 다형성, 캡슐화)
- class 로 캡슐화 : 클래스 내에서 모든 변수 (field), 함수(method) 구현
- class 내에 새로운 class (내부 class) 작성 가능
- 소스 (.java) & 클래스 (.class) 파일
- 하나의 소스 파일에 여러 클래스 작성 가능
- public 클래스는 하나만 가능
- 소스 파일의 이름과 public으로 선언된 클래스 이름은 같아야 함
- 컴파일된 클래스 파일(.class)에는 클래스는 하나만 존재
- 다수의 클래스를 가진 자바 소스(.java)를 컴파일하면 클래스마다 별도 클래스 파일(.class) 생성 (JVM이 필요한 클래스만 로딩 가능)
- 실행 코드 : 한 개의 class 파일 또는 다수의 class 파일로 구성
- 여러 폴더에 걸쳐 다수의 클래스 파일로 구성된 경우 jar 파일 형태로 배포 가능
- 자바 응용프로그램의 실행은 main() 메소드에서 시작 -> 하나의 클래스 파일에는 하나의 main 메소드만
- Package
- 멀티스레드
- 자바는 운영체제의 도움 없이 자체적으로 멀티스레드 지원
- C/C++ 등에서는 멀티스레드 운영체제 API를 호출
- 가비지 컬렉션
- 자바는 응용 프로그램에서 메모리 반환 기능 없음, 메모리 할당 기능(new)만 있음
- 가비지: 할당 후 사용되지 않는 메모리 -> JVM이 자동으로 가비지 회수
- 실시간 응용 시스템에 부적합
- 자바 응용 프로그램은 실행 도중 예측할 수 없는 시점에 가비지 컬렉션 실행
- 일정 시간(deadline) 내에 반드시 실행 결과를 내야만 하는 실시간 시스템에는 부적합
- 자바 프로그램은 안전
- 프로그램 작성이 쉬움
- 포인터 개념이 없어 부담 적음
- 다양하고 강력한 라이브러리가 많음
- 실행 속도를 개선하기 위해 JIT 컴파일러 사용
- 자바의 느린 실행 요인: 인터프리터 방식으로 바이트코드 실행
- JIT(Just in Time) 컴파일링 기법으로 개선
- 실행 도중 바이트 코드를 해당 CPU의 기계어 코드로 컴파일, 해당 CPU가 기계어를 실행
자바 배포판(Edition) 종류 : java API 가 다름
Java SE | Java ME | Java EE |
자바 표준 배포판(Standard Edition)
데스크탑, 서버 응용 개발 플랫폼 | 자바 마이크로 배포판 (임베디드) Java SE의 서브셋 +임베디드 및 가전 제품을 위한 API | 자바 기업용 배포판 Java SE + 인터넷 기반의 서버사이드 컴퓨팅 관련 API |
모듈 프로그래밍(Java 9 부터)
- 모듈 : 자바 패키지 + 이미지 + XML 파일 등의 자원들을 묶은 단위
- 모듈 프로그래밍 : 필요한 모듈을 연결하는 방식
- 모듈화의 목적
- 세밀한 모듈화로 자바 응용프로그램이 실행되는데 필요없는 모듈 배제
- 작은 크기의 실행 환경 구성
- 하드웨어가 열악한 소형 IoT 장치 지원
- 자바 플랫폼이 모듈 방식으로 바뀌었지만, 기존 방식으로 프로그래밍해도 무관
Java 응용의 종류
- 데스크톱 응용프로그램
- 서블릿 응용프로그램
- 웹 서버에서 실행되는 자바 프로그램
- 웹브라우저에서 실행되는 자바스크립트 코드와 통신
- 데이터베이스 서버 및 기타 서버와 연동하는 복잡한 기능 구현 시 사용
- 사용자 인터페이스가 필요 없는 응용
- 웹 서버에 의해 실행 통제 받음
- 안드로이드 앱 : 개발 언어는 자바를 사용하나 JVM에 해당하는 Dalvik은 기존 바 이트 코드와 호환성이 없어 변환 필요
Javadoc : Java API 문서 생성 도구
JDK에서 기본으로 제공
내가 작성한 자바 프로그램 소스에 대한 API 문서를 생성 할 수 있다.
usage: javadoc [options] [packagenames] [sourcefiles] [@files]
javadoc 공식 문서 - Oracle
ex. javadoc -d <문서가 생성될 위치> <문서화할 소스 파일 위치>
javadoc -d doc ./src/*.java
참고 자료 (사진 출처)
명품 Java Programming(황기태, 김효수 저)