회고록 블로그
[공부 필기] Java 기본 공부하기 (1) 본문
※ Java에 대해 공부하는 학생(?)의 입장이므로, 틀린 내용이 있을 수 있습니다.
# Java 이전의 프로그래밍 언어(C, C++ 등)는 플랫폼 종속성의 특징이 있음
→ 플랫폼 종속성?
e.g.) Intel CPU + 리눅스 환경에서 개발된 프로그램 ===> 동일한 환경에서만 실행됨
→ 발생 원인은 (1)CPU마다 기계어 상이, (2)OS마다 API 상이, (3)OS마다 실행파일 형식 상이 등의 이유 때문임
→ C언어만 해도, 컴파일되면 플랫폼에 종속적인 코드가 되어버림
# Java는 개발 단계에서부터 플랫폼에 독립적임
→ 이는 Java가 가지고 있는 자바 가상 머신(JVM) 덕분임
→ 즉, OS나 하드웨어(CPU 등)에 관계없이(=동일한 환경이 아니라도) 동일한 실행 결과를 기대할 수 있음 (= WORA의 특징)
→ 참고로 WORA는 Write Once Run Anuwhere의 약자
1. 바이트 코드
→ 기본적으로 소스 파일(.java, .cpp 등)을 컴파일하면 "컴퓨터가 이해할 수 있는" 기계어로 변환이 됨
→ Java 역시 컴파일러로 소스 파일(.java)을 컴파일하면 기계어로 변환이 되는데, 이 기계어를 '바이트 코드'라고 함
→ 바이트 코드는 가상 머신 안에서만 실행이 되는 바이너리 코드(binary code)라고 생각하면 됨
(가상 머신이 아닌, CPU에 의해 실행되는 코드는 '바이너리 코드')
※ 즉, C언어 같은 경우 '바이너리 코드'가 되지만
※ Java는 JVM(자바 가상 머신)을 이용하기 때문에 '바이트 코드'가 됨
2. JDK(Java Development Kit)
→ 자바 개발 도구라고 해석함
→ 아주 쉽게 말해서 Java로 응용 프로그램 등을 개발 및 실행할 때 필요한 도구/환경임
→ 이 JDK에는 바이트 코드(=컴퓨터가 이해할 수 있도록 표현되어 있음)를 개발자(=사람)가 볼 수 있도록 변환 해주는 도구(javap)도 있음
* 바이트 코드는 '컴파일된 클래스 파일'에 적혀 있고, 이 클래스 파일을 디어셈블하면 사람이 이해할 수 있는 언어로 변환됨
3. 자바 가상 머신(JVM)
→ JVM은 응용 프로그램을 개발할 때, 플랫폼(OS, CPU 등)에 관계없이 항상 동일한 실행 환경을 제공함
→ 그렇기 때문에, 프로그램 실행 시 플랫폼에 관계 없이 동일한 실행 결과를 기대할 수 있음
→ 하지만 JVM 자체는 플랫폼에 종속적임 (JVM 자체는 각 플랫폼에 맞게 porting 되어야 하기 때문)
→ 쉽게 말해서,
사용자A는 MAC PC를 사용하고 사용자 B는 Windows를 사용한다고 가정 ▶
각자 사용자A와 사용자B의 PC에서 자바 프로그램을 실행하면 동일한 실행 결과를 보임 ▶
또는 사용자A와 사용자B의 PC에서 동일한 자바 코드를 작성해도 동일한 실행 결과를 보임 ▶
다만, 사용자A는 MAC용 JVM이 설치되어 있어야 하고, 사용자B는 Windows용 JVM이 설치되어 있어야함
4. Java 실행과정
→ 소스코드(.java)를 클래스 파일(.class)로 컴파일함
→ 참고로, 클래스 파일 안에는 바이트 코드로 작성이 되어 있음
→ 클래스 파일(.class)에 적힌 바이트 코드는 JVM(자바 가상 머신)에서 하나씩 실행됨
→ 다만, 이때 클래스 파일이 실행되는 PC에 '자신의 플랫폼에 맞는 JVM이 설치'되어 있어야 함
→ 운영체제(Windows, MAC, Linux 등)는 JVM을 실행시켜 줌.
(운영체제는 가상머신을 인지하고 실행시킴)
(운영체제가 자바 프로그램을 실행하는게 아님. 자바 프로그램을 실행시키는건 JVM이 함)
→ 참고로, "클래스 로더"는 JVM이 딱 실행을 시작할 때, 실행에 필요한 클래스 파일들(=JDK 라이브러리)을 미리 로딩해옴
→ 그렇기 때문에 C언어에서 처럼 링크(=링커가 하는 일) 과정이 없음
※ 위의 내용은 Java의 실행 과정에 대하여 아주 쉽게 이해하기 위해서 큰 틀만 적음
※ 더 세부적인 내용은 아래글 참고
http://www.tcpschool.com/java/java_intro_programming
※ 또한, 실행 과정을 확실하게 이해하고 나면 더 심화된 내용(e.g. 클래스 로더, JVM 구성 등)에 대해서 학습할 필요가 있어보임..
5.1. 자바 개발 환경_JDK
→ JDK는 위에서 언급했듯이 Java 응용 프로그램 개발에 필요한 여러 도구들이 있음
→ 자바 컴파일러, JRE, 클래스 라이브러리 소스 등
→ 일반적으로 사용자는 "자바 실행 환경"만 있어도 되기 때문에 JRE(Java Runtime Enviroment)를 설치함
(그러나 대부분의 PC에는 기본적으로 설치되어 있다고 함)
# JDK 16.0.2 버전 분석하기
→ 참고 사이트 : 아래 링크의 "Contents of the JDK"
https://www.oracle.com/java/technologies/javase/jdk16-readme-downloads.html
→ bin 디렉터리 안에는 여러 도구가 있는데 그 도구에 대한 설명은 아래 링크 참고
(모든 도구의 기능을 외우고 다닐 수는 없으니, 어디에 어떤 설명이 적혀 있는지는 찾을 수 있어야 할 것 같음)
https://docs.oracle.com/en/java/javase/16/docs/specs/man/index.html
5.2. 자바 개발 환경_자바 API
→ 관련된 클래스를 모아둔 것을 자바에서는 "패키지"라고 함
→ 오라클이라는 회사가 주요한 기능들을 미리 클래스 라이브러리로 묶어놓은 패키지를 "자바 API"라고 함
→ 개발자는 자바 API로 부터 자신이 필요로 하는 "클래스"가 속한 "패키지"를 import 하면 됨
→ 자바 API 문서를 열어놓고 프로그램 개발하기를 권장함
→ 자바 API 문서는 Oracle 사이트에서 ▶ 자신의 JDK 버전에 맞춰 Readme 클릭 ▶ 그 안에서 API Specification 등 찾아서 클릭
# JDK 16버전 API Specification 분석하기
→ 아래 사이트에서 자바 API 문서 확인
https://docs.oracle.com/en/java/javase/16/docs/api/index.html
→ 처음에 모듈(Module)을 확인할 수 있음
(e.g.) java.base 모듈 ▶ Java SE 플랫폼의 기본적인 API가 정의되어 있음
→ 모듈(Module) 안에는 패키지(Package)가 있는 것을 확인할 수 있음
(e.g.) java.base 모듈 안에 ▶ java.io 패키지 ▶ 시스템 입출력 관련한 것을 제공함
→ 패키지(Package) 안에 인터페이스(Interface)나 클래스(Class)가 있는 것을 확인할 수 있음
(e.g.) java.base 모듈 안에 ▶ java.io 패키지 안에 ▶ BufferedReader 클래스 ▶ character-input stream 으로부터 텍스트를 읽음
5.3. 자바 IDE
→ IDE ?
Integrated Development Environment의 약자. 통합 개발 환경이라고 해석함.
→ IDE는 소스 코드 편집, 컴파일, 디버깅 등을 한번에 할 수 있는 환경인데
대표적으로 Microsoft의 비주얼스튜디오, IBM의 이클립스(eclipse) 등이 있음
# 자바 소스 파일(*.java)의 이름과, public으로 선언된 클래스의 이름은 동일해야함
# 1개의 자바 소스 파일(*.java)에는 여러 개의 클래스 작성 가능
하지만, 그 여러 개의 클래스는 컴파일하면 각각의 클래스 파일(*.class)로 생성됨
→ 내부 클래스라는 것도 있는데, 위의 예시에서는 클래스 C가 내부 클래스임
→ 1개의 자바 소스 파일에는 1개의 클래스만 'public'으로 선언 가능함
# 프로그램은 main() 메소드에서부터 시작되며, 1개의 클래스 파일에는 1개의 main() 메소드만 있을 수 있음
→ 즉, 여러 클래스 파일에 각각 main() 메소드를 1개씩 가질 수 있음
# 참고로, 클래스 안에 있는 함수를 Java에서는 '메소드'라고 함
참고 문헌
황기태.김표수 저자(2016). 명품 Java Programming(제2판). 경기:생능출판.
'2. 프로그래밍 언어 공부 > Java' 카테고리의 다른 글
[공부 쉬어가기] Java: 왜 복합 대입 연산자는 형변환 에러가 발생하지 않을까 (0) | 2021.09.01 |
---|---|
[공부 필기] Java 기본 공부하기 (4) (0) | 2021.09.01 |
[공부 필기] Java 기본 공부하기 (3) (0) | 2021.08.30 |
[공부 필기] Java 기본 공부하기 (2) (0) | 2021.08.26 |
[공부 필기] Java 기본 공부하기 - 프롤로그 (0) | 2021.08.19 |