객지프 - 2주차
01. 자바 시작
1.1 컴퓨터와 프로그래밍
📖 프로그래밍 언어
컴퓨터가 실행할 프로그램을 작성하기 위한 언어
- 기계어 (machine language)
- 0과 1의 이진수로 구성된 언어
- 컴퓨터의 CPU는 이진수만 이해.
- 어셈플리어
- 기계어에서 자주 사용하는 명령을 가급적 표현하기 쉬운 상징적인 니모닉 기호로 일대일 대응 시킨 언어 (ex. ADD, SUB, MOVE 등).
- 하지만 역시 기계어를 베이스로 한 저급언어
- 고급언어
- 사람이 이해하기 쉽고, 표현하기 쉬우며 복잡한 알고리즘이나 프로그램 구조, 지료 구조를 효율적으로 표현할 수 있는 언어
- 사람의 언어 ↔ 번역기 ↔ 기계어
- Ex) Pascal, Basic, C/C++, C#, Java...
- 고급언어는 크게 절차지향언어와 객체지향언어로 나눌 수 있다.
💡 고급, 저급에서의 '급' = 'quality'란?
품질, 능력을 의미하는 것이 아닌, '단계'를 의미한다.
고급(high-quality)은 단계가 많고 복잡함을 의미하고,
저급(low-quality)은 단계가 적음을 의미힌다.
📖 프로그래밍과 컴파일
- 소스 파일(source file) 혹은 소스 프로그램
- 프로그래밍 언어로 작성된 텍스트 파일.
- 텍스트 파일이기 때문에 어떤 텍스트 편집기로도 작업 가능
- 컴파일(compile)
- 소스 파일을 컴퓨터가 이해할 수 있는 기계어로 만드는 과정
- 컴파을을 하는 소프트웨어를 '컴파일러'라 한다.
- 각 언어마다 고유한 컴파일러가 존재한다. 그러므로 자바 컴파일러로 C++ 소스 프로그램을 컴파일하는 것은 불가능!!
- 소스파일을 컴파일하면 목적 파일이 생기며, 파일 확장자는 언어나 OS에 따라 조금씩 다르다.
ex) C : .c → .obj → .exe
C++ : .cpp → .obj → .exe
Java : .java → .class
1.2 자바의 출현과 WORA
📖 자바의 태동
-
그린 프로젝트 (1991)
◽ 선마이크로시스템즈의 제임스 고슬링에 의해 시작된 프로젝트
◽ 가전제품의 소프트웨어 작성에 적합한 프로그래밍 언어 개발을 시작 -
목적 (WHY?)
◽ 플랫폼 호환성 문제 - 기존의 언어로 작성된 프로그램은 컴퓨터 플랫폼 간에 호환성이 없어, 플랫폼에 따라 소스를 다시 컴파일하거나 아예 프로그램을 재작성해야 하는 단점이 있었다.
◽ 플랫폼 독립적인 언어의 필요성 - 가전제품은 특히 CPU의 종류나 처리 단위(워드)의 크기 등이 매우 다양한 하드웨어 플랫폼을 갖기 때문에 플랫폼 독립적인 언어의 필요성이 강력히 대두
◽ 메모리 사용량 ↓ - 가전제품의 제어 장치는 매우 적은 양의 메모리를 사용. 내장형 시스템의 메모리 요구 사항을 충족해야만 했음. -
선마이크로시스템즈는 플랫폼 독립적이며 메머리 사용량이 적은 새로운 언어와 실행 체계를 개발
-
초기 이름은 '오크(OAK)' -> 1995년 '자바(Java)'
-
한 번 개발된 웹 콘텐츠(웹 프로그램)가 전 세계의 다양한 클라이언트 플랫폼에 설치된 웹 브라우저에 수정 없이 실행되도록하는 웹과 자바의 플랫폼 독립성이 딱 들어맞아 인터넷과 웹의 빠른 발전에 힘입어 급속도로 퍼짐
-
2009년에 데이터베이스로 유명한 오라클에서 선마이크로시스템즈를 인수함으로써 현재는 오라클에서 자바를 제공
📖 기존 언어의 플랫폼 종속성
-
플랫폼
= 하드웨어 플랫폼 + 운영체제 플랫폼 -
프로그램의 플랫폼이 호환성이 없는 이유
- 기계어가 CPU마다 상이
- 운영체제마다 API가 서로 다름
- 운영체제마다 실행파일 형식이 서로 다름
-
플랫폼 종속성
C/C++ 프로그램은 실행하고자 하는 각 플랫폼을 대상으로 소스 코드를 수정하거나, 각 플랫폼에서 따로 컴파일하여 플랫폼에 맞는 기계어 프로그램을 생성해야 한다. 이러한 특징을 플랫폼 종속성이라 부른다.
📖 자바의 플랫폼 독립성, WORA
- WORA (Write Once Run Anywhere)
- 자바는 플랫폼에 독립적으로 설계된 언어로, 한 번 작성되고 컴파일된 자바 코드는 CPU나 운영체제 등 플랫폼에 상관없이 모든 플랫폼에서 동일하게 실행된다.
- 네트웨크에 연결된 어느 클라이언트에서나 실행 가능하다. (웹 브라우저, 분산환경 지원)
-
바이트 코드
- 자바의 플랫폼 독립성 실현 가능 요인 1- 자바 컴파일러가 자바 소스 프로그램을 컴파일한 일종의 기계어
- 일종의 중립코드
클래스 파일(.class)
에 저장되어 있다.- 바이트 코드는 컴퓨터 CPU에 의해 직접 실행되지 않는다.
자바 가상 기계(JVM)
이 인터프리터 방식으로 바이트 코드를 해석하여 실행한다.
-
자바 가상 기계(JVM)
- - 자바의 플랫폼 독립성 실현 가능 요인 2- 자바 가상 기계 자체는 플랫폼 종속적이다. 리눅스에서 작동하는 자바 가상 기계는 윈도우에서 작동하지 않는다.
- 각기 다른 플랫폼에 설치되어 동일한 자바 실행 환경을 제공한다.
- 자바
바이트 코드
를 실행하는 소프트웨어이다. (Java Terminal과 같이 하드웨어로 만들어지기도 한다.)
📖 자바 실행 환경
-
자바 응용프로그램 실행 환경
: 자바 가상 기계 + 자바 플랫폼의 다양한클래스 라이브러라(자바 APIs)
가 반드시 필요 -
자바 컴파일러가 자바 소스 프로그램을 컴파일하여 바이트 코드를
클래스 파일(class file)
에 저장한다. -
자바 가상 머신이 사용자가 작성한 클래스 파일을 로딩하여, 바이트 코드를 하나씩 실행한다.
-
필요할 때 클래스 파일을 로딩하여 실행하기 때문에 적은 메모리로 실행 가능하다. 메모리가 충분한 PC에서는 실행 중에 클래스 로딩으로 인한 시간 지연을 줄이기 위해 사용자 클래스 파일과 JRE 클래스 파일을 미리 로딩하여 두기도 한다.
-
main() 메소드를 가진 클래스의 main()에서 실행이 시작된다.
📖 자바와 타언어(C/C++)의 실행 차이
- C/C++
컴파일러가 소스파일(.c/.cpp)을 목적 파일(.obj)로 컴파일 한다.
링커가 컴파일한 목적 파일을 링크시켜 하나의 바이너리 실행파일(.exe)를 만든다.
실행 파일은 컴퓨터의 CPU가 바로 실행한다.
- Java
링크 과정 없이 자바 컴파일러가 소스파일을 바이트 코드가 저장된 클래스 파일로 컴파일한다.
자바 가상 기계가 컴파일된 클래스 파일을 실행한다.
자바는 컴파일된 클래스 파일이나 이들을 하나로 압축한 jar 파일 형태로 배포한다.
1.3 개발 도구와 자바 플랫폼
📖 JDK와 JRE
JDK
: Java Development Kit (자바 개발 키트)
- 자바 개발자에게 무료로 배포하는 소프트웨어
- JDK =
JRE
+ 개발 도구 (자바 컴파일러 등) - 컴파일러, 컴파일된 자바 API 클래스들이 들어 있는 모듈 파일들, 샘플 등 포함
JRE
: Jave Runtime Environment (자바 실행 환경)
- 자바 응용프로그램이 실행될 때 필요한 소프트웨어들
- JVM(자바 가상 머신), 자바 API(이미 컴파일된 다양한 클래스 라이브러리)들이 들어 있는 모듈파일을 포함.
- 개발자가 아닌 일반 사용자의 경우 JRE만 필요하며 JRE만 따로 다운받을 수 있다.
[그림] Description of Java Conceptual Diagram (출처 : https://docs.oracle.com/javase/8/docs/)
📖 자바의 배포판
오라클은 개발 환경에 따라 여러 종류의 JDK를 제공하는데 이를 배포판이라 부름.
- Java SE (Standard Ediddtion)
자마 표준 배포판
데스크톱 응용프로그램과 서버 응용프로그램 개발 플랫폼 - Java ME (Micro Edition)
모바일용 배포판
IoT, TV, 블루레이, 셋톱박스 등 작은 하드웨어 자원을 갖는 장치에 적함한 배포판(JDK)
가장 작은 메모리 풋프린트(차지하는 공간)
Java SE의 서브셋 + 임베디드 및 가전 제품을 위한 API 정의 - Java EE (Enterprise Edition)
기업용 배포판
자바를 이용한 다중 사용자, 대규모 기업 응요프로그램 개발을 위한 배포판(JDK)
Java SE + 인터넷 기반의 서버사이드 컴퓨팅 관련 API 추가
💡 자바는 언어이자
플랫폼
이다.자바를 하나의 언어로만 보지 말자. 언어와 컴파일러, 그리고 자바 가상 기계 등의 실행 환경을 모두 갖춘 플랫폼으로 이해하도록 하자.
📖 모듈 프로그래밍
Java 9에서 자바 플랫폼에 큰 변화가 이루어짐 => 모듈화(modularity)
-
모듈 ⭐⭐
자바 패키지들과 이미지, XML 파일 등의 자원들을 묶은 단위
하나의 '통' 이라고 생각하면 된다 -
모듈 프로그래밍
자바 응용프로그램을 마치 직소 퍼즐을 연결하듯이 필요한 모듈을 연결하는 방식으로 작성 -
자바 플랫폼의 모듈화
실행 시간에 사용되는 자바 API의 모든 클래스들을 모듈들로 분할
JDK의 설치 디렉터리 밑의 jmods 디렉터리 내에 담겨있다.모듈화의 목적
- 세밀한 모듈화를 통해 자바 응용프로그램이 실행되는데 필요 없는 모듈을 배체
- 작은 크기로 배포할 수 있도록 함
- 하드웨어가 열악한 소형 IoT 장치에서도 필요한 모듈로만 구성된 작은 크기의 자바 응용프로그램 실행 환경(실행 시간 이미지라고 부름)을 만들어 실행시키고 성능을 유지시키게 함.
-
자바 플랫폼이 모듈 방식으로 바뀌었지만, 모듈 방식이 아닌 기존 방식으로 자바 프로그래밍 해도 무관
📖 자바 API (클래스 라이브러리)
-
자바 API (Application Programming Interface) ⭐⭐
◾ JDK에 포함된 클래스 라이브러리
◾ 개발자들이 사용하도록 주요한 기능들을 미리 구현한 자바 클래스들의 집합
◾ 개발자들은 API를 이용하요 쉽고 빠르게 자바 프로그램을 개발핤 수 있음 -
자바 패키지(Pakage)
◾ 코드를 짜는데 있어서 가장 큰 단위
◾ 서로 관련된 클래스(.class 파일)들을 분류하여 묶어 놓은 것
◾계층구조
로 되어 있음 (프로젝트 → 패키지 → 모듈 → 코드)
- 클래스 이름에 패키지 이름도 포함
- 다른 패키지에 동일한 이름의 클래스 존재 가능
◾ 자바 API(클래스 라이브러리)는 JDK에패키지
형태로 제공됨. 필요한 클래스가 속한 패키지만import
하여 사용.
◾ 개발자 자신의 패키지 생성 가능
1.4 자바 프로그램 개발 과정
📖 자바 소스 편집
- 자바에서는 클래스 이름과 자바 소스 파일 이름이 일치해야 한다.
그래야만 클래스의 바이트 코드가 담긴 클래스 파일을 쉽게 찾을 수 있기 때문이다. - 자바 소스 파일의 확장자는
.java
- 파일 명은 대소문자를 구분한다.
- 자바 프로그램의 실행이 시작되는 메소드(함수)는
main() 메소드
이다.
📖 자바 소스 컴파일
- JDK에 포함된
javac (자바 컴파일러)
를 실행하여 컴파일한다. - .java 파일을 컴파일하면 컴파일된 바이트 코드는
.class
파일에 저장된다.
1.5 이클립스를 통한 자바 프로그램 개발
📖 자바 통합 개발 환경 - 이클립스(Eclipse)
-
IDE (Integrated Development Environment)
- 소프트웨어 통합 개발 환경
- 소스 코드 편집, 컴파일, 디버깅을 한꺼번에 할 수 있음
-
이클립스
- 자바 응용 프로그램 개발을 위한 통합 개발 환경
- IBM에 의해 개발된 오픈 소스 소프트웨어
-
Workspace
- 개발자가 자바 프로그램을 개발하는 작업 공간 (폴더)
- 개발자가 작성하려고 하는 전체 소프트웨어 개발 프로젝트를 담는 컨테이너로서 디렉터리이다.
- workspace에는 한 프로젝트만 있을 수도 있고, 여러 프로젝트가 있을 수도 있다.
📖 프로젝트, 클래스 생성
-
프로젝트
- 하나의 자바 응용 프로그램을 개발하기 위해 필요한 자바 소스 파일들과 이미지, 동영상 같은 리소스, 컴파일된 클래스 파일들을 일괄적으로 관리하기 위한 개념
- 프로젝트가 생성되면 프로젝트 이름의 폴더가 생기고 그 안에 개발자가 만든 소스와 컴파일된 클래스 파일들이 생겨난다.(java API)
-
클래스
- 프로젝트 생성 후, 자바 응용프로그램을 작성하기 위해 클래스를 생성한다.
- 클래스는 프로젝트 폴더 아래의
src
폴더 안에 생성 - Name 칸에 클래스 이름을 입력
public static void main(String[] args)
를 체크하면 자동으로main() 메소드
가 생성된다.
📖 소스 편집과 컴파일 및 실행
- 이클립스는 소스 입력과 동시에 자동으로 컴파일하기 때문에 컴파일 과정이 따로 없이 바로 실행 가능
- 자바 프로그램의 실행은 Run → Run 메뉴를 선택하거나 툴바에서 아이콘 클릭
- 실행 결과는 콘솔 윈도우에 출력된다.
1.6 자바 응용프로그램의 종류
1. 데스크톱 응용프로그램
- 가방 일반적인 자바 응용프로그램
- PC 등의 데스크톱 컴퓨터에 설치되어 실행
- 자바 실행 환경 (JRE)이 설치된 어떤 컴퓨터에서도 실행 가능
- 다른 응용프로그램의 도움 없이 단독으로 실행됨.
2. 자바 서블릿(servlet) 응용프로그램
- 서블릿은 웹 서버에서 실행되는 서버용 자바 프로그램
- 서블릿은 웹 브라우저의 요청에 따라 웹 서버에 탑재된 데이터베이스를 검색하거나 요청받은 내용을 처리하고 웹 페이지로 만들어 웹 브라우저에 응답하는 방식으로 작동
- 웹 브라우저 상에서 실행되는 자바 스크립트 코드와 통신하기도 함
- 사용자 인터페이스가 필요 없음
- 웹 서버에 의해 실행이 제어됨
3. 모바일 응용프로그램
- 자바는 다양한 하드웨어/소프트웨어 플랫폼의 모바일 응용프로그램 개발에 사용되고 있음
- 가장 많이 사용되는 것이 안드로이드 플랫폼
- 안드로이드는 구글의 주도로 여러 모바일 회사가 모여 구상한 OHA(Open Handset Alliance)에서 만든 무료 모바일 플랫폼
- 오라클 사의 자바 라이선스를 피하기 위해 별도의 개발 도구를 개발함
- Dalvik라는 새로운 자바 가상 기계를 개발함
1.7 자바의 특징 ⭐⭐⭐
1. 플랫폼 독립성 (바이트 코드와 JVM)⭐
◾ 하드웨어, 운영체제 등 플랫폼에 종속되지 않은 독립적인 바이트 코드로 컴파일 된다.
◾ 자바 가상 기계만 있으면 하드웨어/운영체제를 막론하고 자바 프로그램의 실행이 가능하다.
2. 객체 지향
◾ 객체 지향 언어로서 캡슐화, 상속, 다형성 등을 지원한다.
◾ 객체 지향 프로그램은 해결할 과제를 실제 세상의 객체와 객체 간의 상호 관계로 모델링하여 인간의 사고에 가깝게 표현한다.
3. 클래스로 캡슐화⭐
◾ 객체 지향 언어의 캡슐화(encapsulation) 원칙을 철저히 지켜, 변수나 메소드는 반드시 클래스 내에 구현하도록 한다.
◾ 클래스에 속하지 않은 변수와 메소드는 있을 수 없다.
◾ 클래스 안에 새로운 클래스, 내부 클래스를 만들 수 있다.
4. 소스와 클래스 파일⭐
◾ 하나의 자바 소스 파일에는 여러 클래스를 작성할 수 있다.
◾ 단, public 클래스는 하나만 가능하다.
◾ 소스 파일의 이름과 public으로 선언된 클래스 이름은 같아야 한다.
◾ 자바 소스가 컴파일된 클래스 파일(.class)에는 반드시 하나의 클래스만 존재한다. 따라서 다수의 클래스를 가진 자바 소스 파일을 컴파일 하면 클래스마다 별도의 클래스 파일(.class)이 생성된다.
(주의!! 클래스 ≠ 클래스 파일)
5. 실행 코드 배포
◾ 자바 응용프로그램은 한 개의 class 파일 또는 다수의 class 파일로 구성
◾ 다수의 클래스 파일을 jar 파일 형태로 압축하여 배포 및 실행이 가능
◾ 자바 응용프로그램의 실행은 main() 메소드에서 시작
◾ 하나의 클래스 파일이 두 개 이상의 main() 메소드를 가지는 것은 불가능
◾ 하지만 각 클래스 파일이 main() 메소드를 가지는 것은 상관 없음
6. 패키지
◾ 서로 관련있는 클래스는 패키지로 묶어 관리
◾ 패키지는 파일 시스템의 폴더 개념과 같음
◾ ex) java.lang.System 클래스는 java\lang 폴더의 System.class 파일을 나타내며, java\lang을 패키지라 한다.
7. 멀티스레드
◾ 하나의 자바 프로그램에서 다수의 스레드가 동시에 실행할 수 있는 환경을 지원
◾ 보통 멀티스레드 프로그램을 작성하기 위해서는, 운영체제가 멀티스레드를 지원하고 멀티스레드와 관련된 API나 라이브러리를 제공해야만 한다. (C/C++ 등의언어들은 자체적으로 멀티스레드를 지원하지 않아 운영체제의 도움을 받음)
◾ 자바는 운영체제의 도움 없이 멀티스레드를 자체적으로 지원 → 멀티스레드를 지원하지 않는 운영체제에서도 멀티스래드 프로그램을 개발할 수 있음
8. 가비지 컬렉션⭐
◾ 메모리를 할당 받는 기능은 있지만, 메모리를 반환하는 기능은 없음
◾ 사용하지 않는 메모리는 자바 가상 기계의 가비지 컬렉션 기능에 의해 자동으로 회수됨
◾ 즉, 본인이 알아서 메모리를 처리함
9. 실시간 응용 시스템에 부적함
◾ 가비지 컬렉션 실행 때문에, 예측할 수 없는 시점에서 자바 응용프로그램의 실행이 일시적으로 중단됨
◾ 일정 시간 내에 반드시 실행 결과를 내야만 하는 실시간 시스템에는 부적합
10. 자바 프로그램은 안전하다.
◾ 타입 체크가 메우 엄격
◾ 메모리의 물리적 주소를 사용하는 포인터 개념이 없음
◾ 잘못된 자바 프로그램으로 인한 컴퓨터 시스템이 중단되는 일은 없음
11. 프로그램 작성이 쉽다.
◾ 포인터 개념이 없음
◾ 동적 메모리 반환 하지 않음
◾ 프로그램 개발을 쉽게 도와주는 다양한 라이브러리와 스윙 등 강력한 GUI 라이브러리를 지원
12. 실행 속도를 개선하기 위해 JIT 컴파일러가 사용된다.
◾ 자바 가상 기계가 인터프리터 방식으로 바이트 코드를 실행하므로 기계어가 실행되는 것보다 느리다고 알려짐
◾ 최근 JIT 컴파일링 기법으로 실행 속도를 개선함
◾ JIT (Just In Time) 컴파일은 실행 중에 바이트 코드를 해당 CPU의 기계어 코드로 컴파일 하고 CPU가 바로 기계어를 실행하는 기법
Author And Source
이 문제에 관하여(객지프 - 2주차), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@shuajjjjj/객지프-2주차저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)