막상 Java 를 다시 공부하면서 Java 가 어떤 언어인지 모른다면 공부하는 의미가 없을 것 같다.
따라서 이번엔 Java 의 역사와 Java 에 대해 간략하게 정리해보록 하겠다.
나의 첫 프로그래밍 언어는 python 이었다.
그러나 C, C+, Java 등을 배우면서 객체 지향 언어에 흥미를 느꼈고, Java 를 주력언어로 사용하기로 결정했다.
후에 백엔드 개발자로 성장하기 위해선 Java가 필수라고 생각한다. 적어도 우리나라에서는 그렇다.
Java 프레임워크인 Spring 을 공부하기 위한 가장 기본적인 발판이기도 하다.
따라서 프로그래밍 입문자가 처음 언어를 선택할 때, 비교적 간단하고 쉬운 python 도 좋지만,
Java 와 같은 객체 지향 언어도 좋다고 생각한다.
1️⃣ Java 란?
Java 는 1995년, 썬 마이크로스템즈 (Sun Microsystems) 에서 처음 발표하였다.
사실 Java 는 1991 년 썬의 엔지니어들에 의해 만드러진 오크(Oak) 라는 언어에서 출발했다.
처음엔 가전제품에서 사용될 목적이었으나, 인터넷이 발전하면서 인터넷에서 실행되는
언어로 사용되었고, 이름도 Java 로 변경되었다.
Java 가 등장하기 이전엔 C++이 대세였다.
이는 메모리와 CPU를 너무 많이 사용하기에, 윈도우용 언어로는 부적합하다는 단점이 있었다.
이후 이식성 좋은 Java 가 등장하였고, 많은 기업체와 공공기관에서 서버 운영 체제 구축을 위해
Java 를 사용하며 급부상하게 되었다.
초기 Java 는 가전 제품용 언어로 개발되었지만, 현재는 스마트폰을 비롯하여 각종 장비와 PC 에서
실행되는 애플리케이션 등 많은 곳에서 사용되는 언어로 자리 잡았다.
실제로 우리나라의 경우, Java 시장이 매우 활성화되어있으며, 사용자도 많아 커뮤니티도 활발하다.
특히 대부분의 공공기관에서 Java 를 사용하기 때문에 수요도 많다.
2️⃣ Java 의 특징
1. 이식성이 높다.
이식성이란 서로 다른 실행 환경을 가진 시스템 간에 프로그램을 옮겨 실행할 수 있는 것이다.
쉽게 말해 MS 윈도우에서 실행할 수 있는 프로그램을 IOS나 Linux, Unix 등에서도 실행할 수 있다는 것이다.
MS 윈도우에서 실행되는 프로그램을 Linux 나 Unix 에서 실행하려면, 별도의 컴파일 과정을 거쳐야 한다.
그러나 Java 로 개발된 프로그램은 소스 파일 수정 없이 JRE (Java Runtime Environment) : 자바 실행 환경
이 설치되어 있는 모든 OS 에서 실행 가능하다.
2. 객체 지향 언어이다.
이는 내가 Java 를 깊이 공부해보고 싶다는 생각이 들게 해준 이유이다.
프로그래밍 기법은 다양하지만, 대표적으로 '절차 지향 언어' 와 '객체 지향 언어'가 있다.
절차 지향 언어는 말 그대로 프로그램이 순차적으로 진행되는 것을 말한다.
C, C++ 을 공부할 때 객체의 개념을 배우기 전까진 모두 절차 지향의 방식을 사용했다.
객체 지향 언어는 객체를 만들어 객체를 조립 및 연겨라여 전체 프로그램을 완성하는 기법이다.
OOP (Object Oriente Programming) 이라고도 하며, 나중에 더 자세히 다룰 예정이다.
Java 는 100% 객체 지향 언어이다. 우선 설계도인 클래스 (class) 를 만들고,
이 클래스들을 연결하여 프로그램을 완성한다.
객체 지향 언어의 특징으로는 캡슐화, 상속, 다형성 등이 있다.
3. 람다식의 지원
함수적 프로그래밍은 대용량 데이터의 병렬 처리, 이벤트 지향 프로그래밍에 적합하다.
따라서 객체 지향 언어인 Java 또한 이를 지원하기 위해 람다식 (Lambda Expressions) 를 지원한다.
Java 8 부터 람다식을 지원하며, 이를 사용하면 컬렉션의 요소를 필터링, 매핑하는데 쉬워진다.
또한 코드가 매우 간결해진다는 장점이 있다.
4. 메모리의 자동 관리
C, C++ 을 공부할 때, 특히 메모리 관련 공부를 할 때 'malloc' 이라는 함수를 들어본 적 있을 것이다.
또한 이와 연관되어 'free' 라는 것도 본 적 있을 것이다.
이처럼 C나 C++은 메모리에 생성된 객체를 제거하기 위해선 직접 코드를 작성해야한다.
그렇지 않으면 프로그램은 불완정해지고, 오류가 발생할 수 있다.
그러나 Java 는 사용자가 직접 메모리에 접근할 수 없도록 설계되어 번거로움을 덜어준다.
Java 가 직접 메모리를 관리해주며, 객체 생성 시 메모리 영역을 자동으로 찾아 할당한다.
또한 종료 시 쓰레기 수집기 (Garbage Collector) 를 실행시켜 자동적으로 불필요한 객체를 제거한다.
따라서 메모리 관리에 힘을 덜 쏟아도 된다.
5. 멀티 스레드(Multi-Thread) 구현이 쉽다.
스레드 (Thread) 란 프로세스 내에서 작업을 수행하는 주체를 말한다.
즉, 실행중인 프로그램 내에 작업을 수행하는 주체가 2개 이상인 프로세스를 '멀티 스레드' 라고 한다.
(스레드에 대한 내용은 후에 자세히 다루겠다.)
따라서 하나의 프로그램이 동시에 여러 작업을 처리하는 경우, 대용량 작업을 빨리 처리하기 위한 경우에
병렬처리를 하려면 멀티 스레드 프로그래밍이 필요하다.
Java 에서는 스레드 생성 및 제어와 관련된 라이브러리 API 를 제공하기 때문에,
운영체제에 상관 없이 멀티 스레드를 쉽게 구현할 수 있게 도와준다.
이는 효율적인 메모리 관리와 프로그램 성능을 높여주기 때문에 큰 장점이라고 할 수 있다.
6. 동적 로딩 (Dynamic Loading) 을 지원
앞서 말했듯이 Java 는 여러 개의 객체가 서로 연결되어 프로그램이 실행된다.
또한 이 객체들은 다양한 클래스로부터 생성된다.
프로그램이 실행될 때 모든 객체가 생성되지 않고, 필요한 시점에 해당 클래스를 동적 로딩하여
객체를 생성한다. 또한 개발 후 유지보수가 필요할 때, 해당 클래스만 수정하면 된다.
이렇게 동적 로딩을 지원하여 유지보수를 쉽고 빠르게 할 수 있다.
7. 다양한 라이브러리의 지원
Java 는 오픈 소스 언어이기 때문에 수많은 라이브러리가 존재한다.
예를 들어 정렬을 구현할 때, 실제로 정렬 매커니즘을 코드로 작성하려면 시간과 노력이 필요하다.
하지만 Java 에서 지원해주는 라이브러리를 통해 쉽게 정렬 매커니즘을 사용할 수 있다.
따라서 검증된 라이브러리를 이용한다면, 보다 효율적으로 개발할 수 있을 것이다.
또한 Java 는 커뮤니티가 활발하기 때문에 필요한 라이브러리를 찾아 쉽게 적용할 수 있다.
실제로 나는 알고리즘 문제를 풀 때 모르는 부분이 있으면 커뮤니티를 찾아보기도 한다.
3️⃣ Java 개발 환경
Java 는 C, C++ 같이 완전한 기계어가 아니기 때문에, 가상의 운영체제가 필요하다.
'JVM (Java Virtual Machine) : 자바 가상 기계' 가 이 역할을 해준다.
또한 운영체제별로 프로그램을 실행하고 관리하는 방법이 다르기 때문에, JVM 또한
운영체제에 맞게 설치해줘야 한다.
앞서 말했던 이식성이 높다는 특징이 여기서 나온다.
운영체제에 상관 없이, 해당 운영체제에 맞는 JVM 만 있다면 동일한 실행 결과가 나오는 것이다.
JVM 은 운영체제에 종속적이며, JDK 나 JRE 을 설치하면 자동으로 설치된다.
Java 는 확장자가 .java 인 소스파일로부터 시작한다. 이를 컴파일러 (javac.exe) 가 컴파일하여
바이트 코드 파일 (*.class) 로 바꿔준다. 이후 운영체제에 맞는 JVM 을 통해 기계어로 번역된다.
즉 정리하면 다음과 같다.
1. JVM (Java Virtual Machine) : 자바 가상 기계 - 가상의 운영체제로, 운영체제별로 다르다.
JDK 또는 JRE 를 설치하면 자동으로 설치가 되며, 운영체제별로 별도 제공된다.
2. JDK (Java Developmetn Kit) : 자바 개발 키트 : JRE + 개발에 필요한 도구 (라이브러리 API, Compiler 등)
3. JRE (Java Runtime Environment) : 자바 실행 환경 : JVM + 표준 클래스 라이브러리
자료 출처 : 이것이 자바다 (신용권)