- 정의와 개념, 쓰임!
Java 를 이해하기 전에 프로그래밍 언어(C, C++, Java 등)가 무엇이며 어떻게 동작하는지에 대해 알아보겠습니다.
* 프로그래밍 언어
- 컴퓨터가 이해할 수 있는 언어는 0과 1로 이루어진 이진 코드(binary code)의 기계어(machine language)입니다.
- 그래서 사람과 컴퓨터가 대화하기 위해서는 사람의 언어와 기계어의 다리 역할을 하는 프로그래밍 언어(programming language)가 필요합니다.
- 프로그래밍 언어는 고급 언어와 저급 언어로 분류 할 수 있습니다.
* 고급언어
- 고급 언어는 컴퓨터와 대화할 수 있는 언어 중에서 사람이 쉽게 이해할 수 있는 언어를 말합니다.
- 즉, 사용자 입장에서의 언어로써 우리가 일반적으로 프로그래밍 언어입니다. ex) C, C++, Java 등
- 고급 언어로 작성된 소스(source)는 컴퓨터가 바로 이해할 수 없기 때문에(기계어가 아니므로), 컴파일(compile) 과정을 통해서 컴퓨터가 이해할 수 있는 기계어로 변환해줘야 컴퓨터가 사용할 수 있습니다.
- 컴파일 해주는 것을 컴파일러(compiler)라고 하며, 자바에서는 javac.exe가 담당합니다.
- 우리가 흔히 말하는 프로그램(program)이란 컴퓨터에서 특정 목적을 수행하기 위해 프로그래밍 언어로 작성된 소스를 기계어로 번역한 것을 말합니다.
* 저급언어
- 저급 언어는 기계어에 가까운 언어로, 어셈블리어가 대표적인 저급 언어입니다.
- 사람이 이해하기 어려워서 배우기 매우 까다로운 언어입니다.
위에 설명을 통해, 프로그래밍 언어에 대해 이해를 한 후 Java는 무엇이며 C와 C++와 다른 Java만의 특징, Java로 무엇을 할 수 있는지 알아보겠습니다.
* 자바의 역사
- 자바는 1991년에 썬 마이크로시스템즈(Sun Microsystems)사에서 제임스 고슬링(James Gosling)이 다른 연구원들과 함께 고안한 오크(Oak)라는 언어에서 시작되었습니다.
- 오크는 처음에 가전제품에서 사용될 목적이었으나, 인터넷의 등장과 함께 인터넷에서 실행되는 프로그래밍 언어로 사용되었고, 이름을 자바로 변경하였습니다.
- 1995년에 자바 1.0을 발표하였고, "Write Once, Run Anywhere"(한번 쓰고 어느 곳에서도 실행)를 약속하였습니다.
- 1995년~1999년까지는 윈도우 프로그램 개발이 주류여서 C++언어에 비해 자바는 열세였다. 또, 메모리 및 CPU를 지나치게 많이 사용한다는 문제점이 있었습니다.
- 하지만, 1999년도부터 인터넷이 활성화되면서 웹 애플리케이션 구축을 위해 자바 활성화되었다. 단 한번 작성으로 모든 곳에서 실행 가능한 언어는 자바뿐이었기 때문입니다.
* 자바의 특징
(1) 자바는 이식성이 높은 언어이다.
- 이식성이란 서로 다른 실행 환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 것을 말한다.
- 예를 들면 윈도우 운영체제에서 실행하는 프로그램을 리눅스 또는 유닉스에서 실행할 수 있으면 이식성이 높은 것이다.
- 자바는 자바 실행 환경(JRE:Java Runtime Environment)이 설치되어 있는 모든 운영체제에서 실행 가능하다.
(2) 자바는 객체 지향 언어이다.
- 프로그램을 개발하는 기법으로 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립 및 연결해서 전체 프로그램을 완성하는 것을 객체 지향 프로그래밍(OOP, Object Oriented Programming)이라고 한다.
- 객체 지향 프로그래밍에 사용되는 언어를 객체 지향 언어라고 한다.
- 자바는 객체를 만들기 위해 설계도인 클래스를 작성하고, 객체와 객체를 연결하여 목적에 맞는 프로그램을 만들어 낸다.
- 자바는 객체 지향 언어의 특징인 캡슐화, 상속성, 다형성을 완벽하게 지원한다.
(3) 자바는 함수적 코딩 스타일을 지원한다.
- 객체 지향 프로그래밍 이전에 Lisp 또는 Scheme와 같은 함수적 프로그래밍 언어들이 있었지만 큰 호응을 얻지 못했다.
- 최근에 대용량 데이터 병렬 처리와 이벤트 지향 프로그래밍을 위해 함수적 프로그래밍이 다시 부각되고 있다.
- 자바는 자바 8부터 람다식(Lambda Expressions)을 지원하여 함수적 프로그래밍을 지원한다.
- 람다식을 사용하면 컬렉션의 요소를 필터링, 매핑, 집계 처리하는데 쉬워지고, 코드가 매우 간결해진다.
자바는 메모리를 자동으로 관리한다.
- C++은 메모리에 생성된 객체를 제거하기 위해 개발자가 직접 코드를 작성해야 한다. 만약 이 작업을 성실하게 해주지 않으면, 프로그램은 불완전해지고 갑자기 다운되는 현상을 겪게 된다.
- 자바는 개발자가 직접 메모리에 접근할 수 없도록 설계되었으며,. 메모리는 자바가 직접 관리한다.
- 객체 생성 시 자동으로 메모리 영역을 찾아서 할당하고, 사용이 완료되면 쓰레기 수집기(Garbage Collector)를 실행시켜 자동으로 사용하지 않는 객체를 제거한다.
- 자바 개발자는 메모리 관리의 수고를 덜고, 핵심 기능 코드 작성에 집중할 수 있다.
(3) 자바는 다양한 애플리케이션을 개발할 수 있다.
- 자바는 다양한 운영체제에서 실행되는 프로그램을 개발할 수 있다.
- 또, 단순한 콘솔 프로그램에서부터 클라이언트용 윈도우 애플리케이션, 서버용 웹 애플리케이션, 그리고 모바일용 안드로이드 앱 등 거의 모든 곳에서 실행되는 프로그램을 개발 할 수 있다.
- 자바는 다양한 운영체제에서 사용할 수 있는 개발 도구와 API를 묶어 에디션(Edition) 형태로 정의하고 있다.
멀티 스레드(Multi-Thread)를 쉽게 구현할 수 있다.
- 운영체제에 따라서 멀티 스레드를 구현하는 방법이 다르지만, 자바는 스레드 생성 및 제어와 관련된 라이브러리 API를 제공하므로 운영체제에 상관 없이 멀티 쓰레드를 쉽게 구현할 수 있다.
(4) 동적 로딩(Dynamic Loading)을 지원한다.
- 자바 애플리케이션은 클래스로부터 생성 된 여러 개의 객체가 서로 연결되어 실행된다.
- 애플리케이션 실행 시 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩해서 객체를 생성한다.
- 또, 개발 완료 후 수정 사항이 발생하더라도 해당 클래스만 수정 하면 되므로 전체 애플리케이션을 다시 컴파일 할 필요가 없다. 따라서 유지보수를 쉽고 빠르게 진행 수 있다.
(5) 막강한 오픈 소스 라이브러리가 풍부하다.
- 자바는 오픈 소스(Open Source) 언어이므로 자바 프로그램에서 사용하는 라이브러리 또한 오픈소스의 양이 방대하다.
- 고급 기능을 구현하는 코드를 작성하는 대신 검증된 오픈소스 라이브러리를 사용하면 애플리케이션 개발 기간을 단축하여 생산성을 높이고 안정성도 높일 수 있다.
출처: https://hoonmaro.tistory.com/9 [훈마로의 보물창고]
+ Java Version History
(1) JDK 1.5
- 2004년 기능적으로 가장 많은 변화가 생긴 버전
Language : Generics, annotation, auto boxing, enum, vararg, foreach, static imports 도입
API : java.utio.concurrent API, scanner class J2EE라는 명칭이 Java EE로 개칭
(2) JDK 1.6
- 2006년 기능에 큰 변화 없음, 보안 성능강화 JVM/Swing에 있어 많은 성능향상
(synchronization, compiler, Gc, start-up time) G1(Garbage Fist) GC도입
- Interened Issue
: Java6 이하 버전의 경우 신규 생성된 String은 PermGen(런타임시 크기가 변경되지 않는 메모리)에 위치하며, 동일한 String의 경우 Pooling.
String test0 = "test"; // 내부적으로 new String 호출후 intern()메소드를 자동으로 호출한다.
String test1 = new String("test").intern();
String test2 = new String("test"); // 이 코드는 위 코드보다 메모리상 효율 적이지 못하다.
java6 이후 String이 저장되는 메모리가 PermGet에서 heap으로 변경되어, heap size 튜닝으로 Out.of.memeory를 극복(절대적 해결이 아님)할 수 있다. java 임베디드 쪽에서 성능이슈라 웹에서는 별로 신경을 안써도 될 내용 같다.
(3) JDK 1.7
- 2011년 JVM : Dynamic Language support Language : Switch문 인자로 String 허용, try-resource, generics 타입추론, 숫자에서 undersocre 사용
int moneyWon = 19000000000;
int moneyWon2 = 19_000_000_000; // 숫자 언더스코어, 숫자의 가독성 상승
// 조건 : 반드시 숫자 사이에만 올 수 있다.
(4) JDK 1.8
- 2014 오라클로 인수된 후 첫번째 버전 JDK 1.5이후 가장 큰 언어적 변화
1. Lambda Expressions : 함수를 변수처럼 사용할 수 있는 개념
2. Pipelines and Streams
3. Date and Time API
4. Default Methods
5. Type Annotations
6. Nashhorn JavaScript Engine
7. Concurrent Accumulators
8. Parallel operations
9. PermGen Error Removed
10. TLS SNI
(5) JDK 1.9
- 2016 Modular System (jigsaw) 지원 예정 Money API 지원예정 JAVA Shell 지원예정 변수에 대한 타입 추론 지원예정(var, val) OpenCL 이용한 자동화된 병렬 프로그래밍 지원 예정
'Room 102. Back-end > JAVA' 카테고리의 다른 글
뉴 렉쳐 [Java 프로그래밍] 강의 (3) (0) | 2020.05.20 |
---|---|
뉴 렉쳐 [Java 프로그래밍] 강의 (2) (0) | 2020.05.19 |
뉴 렉쳐 [Java 프로그래밍] 강의 (1) (0) | 2020.05.15 |
"JSP, 액션 태그(Action Tag)에 대해" (0) | 2019.09.17 |
"Java 개발 환경에 대해, ( java SE,EE 가 가진 API 외 )" (0) | 2019.09.16 |