티스토리 뷰
✏️ 자바의 출현
1991년 선마이크로시스템스는 제임스 고슬링이란 엔지니어를 중심으로 그린 프로젝트라는 가전제품에 사용할 소프트웨어를 개발하기 시작했다. 기존의 프로그래밍 언어로(C, C++, Assembly 등) 작성된 프로그램은 플랫폼(platform) 간에 호환성이 없어 사용자 컴퓨터의 플랫폼에 따라 다시 소스를 컴파일하거나 프로그램을 재작성해야 하는 단점이 있었다. 이러한 상황에서 가전제품은 다양한 플랫폼을 가지는 특성이 있어 플랫폼에 독립적인 언어의 필요성이 대두되었다. 그리고 가전제품에 들어가는 제어 장치는 매우 적은 양의 메모리를 사용해야 하므로 내장형 시스템의 메모리 요구사항을 충족해야 했다. 이를 개선하기 위해 오크(Oak)라는 이름을 가진언어가 개발되었으나 오크는 이미 상표가 등록되어 있어 이름을 자바로 바꾸게 되었다.그리고 2009년 오라클 사에서 선마이크로시스템스를 인수함으로써 현재는 우리가 아는 것처럼 오라클에서 자바가 제공되게 되었다.
✏️ WORA(Wrtie Once Run Anywhere)
C나 C++등 자바 이전의 프로그래밍 언어들의 컴파일러는 기계어 코드로 변환할 때 프로그램이 실행될 대상 컴퓨터의 CPU와 운영체제에 종속적인 코드로 변환을 했다. 이러한 점 때문에 코드를 다른 플랫폼에서 실행하기 위해서는 다시 컴파일러에 맞게 코드를 수정해야 했었다. 이런 특성을 플랫폼 종속성(platform dependence)라고 한다. 그러나 자바는 개발 단계에서부터 플랫폼에 독립적으로 설계되었고, 자바 가상 기계(JVM)가 있으면 어디서나 자바로 작성된 프로그램에 동일한 실행 환경을 제공하여 동일한 실행 결과를 기대할 수 있다. 즉, 자바 프로그램은 어디서든 한 번 작성하면, 다시 컴파일하거나 수정하지 않고, 어떤 하드웨어에서나 운영체제에서도 실행기킬 수 있는데 이를 WORA라고 한다.
✏️ 바이트 코드
자바 가상 기계에서만 실행되는 기계어로, 어떤 CPU와도 관계없는 바이너리 코드(binary code)이다. 자바 컴파일러는 자바 소스 프로그램을 컴파일하여 바이트 코드로 된 클래스 파일을 생성한다. 이 클래스 파일은 컴퓨터의 CPU에 의해 직접 실행되지 않고, 자바 가상 기계가 인터프리터 방식으로 실행시킨다.
✏️ 자바 가상 기계
자바 가상 기계는 소프트웨어로, 서로 다른 플랫폼에서 자바 프로그램이 실행되는 동일한 환경을 제공한다. 하지만, 자바 가상 기계는 플랫폼마다 서로 다르게 작성되어 배포되며 플랫폼 종속적이다. 그러나 자바는 어떤 회사의 자바 가상 기계가 설치되어 있든지 상관없이 정상적으로 실행된다.
✏️ 자바 프로그램의 개발 및 실행
자바 프로그램은 보통 여러 소스 파일(.java)로 나누어 작성하고, 자바 컴파일러는 각 소스 파일을 컴파일하여 클래스 파일(.class)를 생성한다. 자바는 클래스 파일을 하나로 합치는 링크의 과정이 없기 때문에, 개발자는 여러 클래스 파일 중 하나를 지정하여 실행시키면, 자바 가상 기계는 그 클래스 파일을 메모리에 로딩하고 실행한다. 실행 도중 다른 클래스 파일이나 자바 API의 클래스 파일이 필요하면, 자바 가상 기계는 그 때 그 클래스 파일을 로딩하고 실행한다. 이렇게 했을 때의 장점은 처음부터 모든 클래스 파일을 로딩할 필요 없이 당장 실행할 클래스 파일만 로딩하여 실행할 수 있어 적은 양의 메모리를 가진 컴퓨터에서 큰 자바 응용프로그램을 실행할 수 있다.
✏️ JDK(Java Development Kit)와 JRE(Java Runtime Environment)
자바 개발자를 위한 상업용 소프트웨어로, 자바 컴파일러 등의 개발 도구와 JRE(Java Runtime Environment)로 구성된다. JRE는 자바 응용프로그램이 실행될 때, 필요한 소프트웨어들로 개발자가 활용할 수 있는 자바 API와 자바 가상 기계를 포함한다. 개발자가 아닌 일반 사용자의 경우 JRE만 필요하며 JRE만 따로 다운받을 수 있다. 아래 링크를 참조하자.
https://www.oracle.com/kr/java/technologies/
✏️ bin 디렉터리
JDK가 사용자 디렉터리에 설치되면 하위 폴더 중에 bin이라는 디렉터리가 있는데 여기에는 자바 응용프로그램의 개발을 돕는 소프트웨어들이 들어 있다.
- javac : 자바 컴파일러로, 자바 소스를 바이트 코드로 변환한다.
- java : 자바 프로그램 실행기이며 자바 가상 기계를 작동시켜 자바 프로그램을 실행한다
- javadoc : 자바 소프로부터 HTML 형식의 API 도큐먼트를 생성한다.
- jar : 자바 클래스 파일을 압축한 자바 아카이브 파일(.jar)을 생성하고 관리한다.
- jmod : 자바의 모듈 파일(.jmod)를 만들거나 모듈 파일의 내용을 출력한다.
- jlink : 응용프로그램에 맞춘 맞춤형(custom) JRE를 생성한다.
- jdb : 자바 응응프램의 실행 중 오류를 찾는 데 사용하는 디버거이다.
- javap : 클래스 파일의 바이트 코드를 소스와 함께 보여주는 디어셈블러이다.
✏️ 자바의 배포판
- Java SE : 자바 표준 배포판으로, 데스크톱 응용프로그램과 서버 응용프로그램을 개발하기 위한 JDK이다
- Java ME : 모바일용 배포판으로, IOT, TV, 블루레이, 셋톱박스 등 작은 하드웨어 자원을 갖는 장치에 적합한 JDK이다.
- Java EE : 기업용 배포판으로, 자바를 이용한 다중 사용자, 대규모 기업 응용프로그램을 위한 JDK이다.
✏️ 자바 API
자바 API(Aplication Programming Interface)는 개발자들이 사용하도록 미리 만들어놓은 유용한 자바 클래스들의 집합이다. JAVA9부터는 모듈화 정책에 따라 모든 자바 API의 클래스들을 서로 관련된 클래스끼리 패키지로 묶고, 다시 패키지들을 모듈로 묶어 계층화하였다. 더 궁금하다면 아래 링크를 찾아보자
https://docs.oracle.com/en/java/javase/16/docs/api/index.html
✏️ 자바의 특징
- 플랫폭 독립성 : 하드웨어, 운영체제 등 플랫폼에 종속되지 않는 독립적인 바이트 코드로 컴파일이 됨
- 객체 지향 : 자바는 객체 지향 언어로서 캡슐화, 상속, 다형성을 지원한다
- 클래스로 캡슐화 : 자바는 캡슐화 원칙을 철저히 지켜 변수나 메소드는 반드시 클래스 내에 구현해야 한다
- 소스와 클래스 파일 : 클래스 파일(.class)에는 반드시 하나의 자바 클래스만 들어 있다.
- 실행 코드 배포 : 자바의 실행은 main() 메소드에서 시작되며, 하나의 클래스 파일에 두 개의 main()메소드가 공존 불가능
- 패키지 : 서로 관련 있는 클래스는 패키지로 묶어서 관리한다.
- 멀티스레드 : 하나의 자바 프로그램이 다수의 작업을 처리할 수 있도록 다수의 스레드가 동시에 실행할 수 있는 환경을 제공한다. 또한, 자바는 운영체제의 도움 없이 멀티스레드 프로그래밍이 가능하기 때문에 멀티스레드를 지원하지 않는 운영체제에서도 자바를 이용하면 멀티스레드 프로그램을 개발할 수 있다.
- 가비지 컬렉션 : 자바는 메모리를 반환하는 기능이 없어, 프로그램 내에 사용되지 않는 메모리(가비지)는 자바 가상 기계의 가비지 컬렉션 기능에 의해 자동으로 회수된다.
- 실시간 응용 시스템에 부적합 : 자바 응용프로그램은 실행 도중 예측할 수 없는 시점에 가비지 컬렉션이 실행되므로 프로그램 실행이 일시적으로 중단된다. 이러한 특징으로 일정 시간(deadline) 내에 반드시 실행 결과를 내야 하는 실시간 시스템에는 자바가 적합하지 않다
- 안전한 자바 프로그램 : 타입 체크가 매우 엄격하고, c/c++과 달리 메모리의 물리적 주소를 사용하는 포인터의 개념이 없어 잘못된 자바 프로그램으로 인해 컴퓨터 시스템이 중단되는 일이 없다
- JIT 컴파일러 사용 : 바이트 코드를 실행하므로 c/c++보다 실행 속도가 느리다고 알려져 있지만, 최근에는 실행하는 도중 프로그램을 해당 CPU의 기계어 코드로 컴파일하고 CPU가 바로 기계어를 실행하도록 하는 JIT(Just In Time) 컴파일링 기법을 이용하므로 실행 성능이 비슷하도록 개선되었다.
- 프로그램 작성이 쉬움
'PL > JAVA' 카테고리의 다른 글
[JAVA] 자바 - 상속 2 (0) | 2024.05.26 |
---|---|
[JAVA] 자바 - 상속 (0) | 2024.05.25 |
[JAVA] 자바 - 클래스와 객체 (0) | 2024.05.23 |
[JAVA] 자바 - 배열과 예외 처리 (0) | 2024.05.22 |
[JAVA] 자바 - 기본 프로그래밍 (0) | 2024.05.22 |
- Total
- Today
- Yesterday
- 유클리드 호제법
- 에라토스테네스의 체
- 투 포인터
- 유니온 파인드
- 세그먼트 트리
- 알고리즘 공부
- DP
- Do it!
- 스택
- 자료구조
- 반복문
- 스프링 부트 crud 게시판 구현
- C++ Stack
- HTML5
- DFS
- 백준
- html
- 카운팅 정렬
- 자바
- 백준 풀이
- 자바스크립트
- CSS
- 우선순위 큐
- js
- 이분 매칭
- c++ string
- 알고리즘
- java
- BFS
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |