1. java 개요
썬 마이크로시스템즈에서 1995년에 개발한 객체 지향 프로그래밍 언어입니다. 창시자는 제임스 고슬링이며, 2010년에 오라클이 썬 마이크로시스템즈를 인수하며 Java의 저작권을 소유하였습니다.
C#과 문법적 성향이 굉장히 비슷합니다. 원래 C#이 MS에서 Java의 기본적인 성질은 가져가지만, 각종 문제들을 해결한 언어이기 때문입니다.
인도와 인도네시아가 다른 것만큼 Java는 비슷한 이름인 JavaScript와는 다른 언어입니다.
Java로 만들어진 소프트웨어 중 유명한 것은 바로 마인크래프트 자바 에디션을 꼽을 수 있습니다.
마인크래프트 자바 에디션은 마인크래프트 시리즈 가운데 가장 먼저 개발된 데스크톱 버전입니다.
2. java의 종류
- Java SE(Java Standard Edition / J2SE)
대부분의 사람들이 가장 많이 접하는 표준 에디션입니다. Java의 핵심 API와 기능들을 제공합니다. - Jakarta EE, 구 Java EE(Java Enterprise Edition / J2EE)
기업에서 운영하는 서버 페이지에 특화된 에디션입니다. JSP와 서블릿을 비롯한 웹 애플리케이션 서버에 관련된 기술들이 포함되어 있습니다. - Java ME(Java Micro Edition / J2ME)
PDA나 셋톱박스, 센서 등의 임베디드 시스템 환경에 특화된 에디션입니다. - JavaFX
데스크톱 애플리케이션 개발 및 배포를 위한 에디션으로, 그로스 플랫폼 이식과 GUI 라이브러리를 제공합니다.
3. java의 특징
Java의 가장 큰 특징은 플랫폼에 독립적인 언어입니다.
- 소스코드를 기계어로 직접 컴파일하여 링크하는 C/C++의 컴파일러와 달리 자바 컴파일러는 바이트코드인 클래스 파일을 생성하고, 이 파일의 바이트코드를 읽은 뒤 기계어로 바꾸어 실행하는 것은 Java Virtual Machine(JVM)입니다.
- 예를 들어 C 계열의 언어들은 윈도우에서 빌드한 프로그램을 그대로 리눅스나 macOS에서 실행하려면 일반적으로 오류가 나지만, Java로 작성된 프로그램은 플랫폼에 맞는 JVM만 설치되어있다면 문제없이 작동합니다.
- 이것은 Java 코드 자체가 플랫폼이 아닌 가상 머신에 종속적이라는 점, 그리고 프로그램 실행의 주체가 운영체제가 아닌 JVM이라는 점 때문이며 이러한 점을 통틀어 Java는 플랫폼 종속성이 낮은 언어라고 표현합니다.
4. java의 장점
1. 수많은 개발자와 레퍼런스
- 나온지도 오래된 언어이고, 그렇기에 수많은 개발자와 레퍼런스를 보유하고 있습니다. 대중적 언어라서 참고 자료나 오픈 소스가 많고, 그러한 자료들을 바탕으로 수많은 대형 프로젝트들이 진행되어 왔기 때문에 많은 부분에서 안정성이 입증되었습니다.
즉, 안정적인 인력풀을 유지하면서, 운영 노하우가 많은 검증된 언어라고 할 수 있습니다.
- 우리나라의 경우 전자정부 표준프레임워크의 존재와, Java 개발자를 정부에서 국비지원으로 대거 양성하고 있기 때문에
타 언어보다 Java 개발자의 인력풀이 타 언어보다 큽니다.
2. 비교적 높은 생산성
- 오늘날의 프로그램의 덩치와 다루는 것들이 크고 복잡해지면서 생산성과 퍼포먼스 문제가 생기게 되었는데, C/C++ 같은 언어는 생산성이 너무 떨어지고 관리도 힘들어서 프로그램이 커지면 커질수록 작업이 힘들어지게 됩니다.
또한 아무리 컴퓨터 하드웨어가 발달한다 하더라도 성능이 더 좋아지면 점점 더 복잡한 것을 다루고 그것이 새로운 표준이 되면서 하드웨어의 속도 향상이 무색해집니다.
-그 와중에 나타난 언어가 Java입니다. C/C++과 비슷한 문법으로 진입장벽이 낮고, 객체 지향을 적극적으로 사용하며, 로우 레벨 작업들을 자동으로 처리해주는 하이 레벨 언어이면서, 퍼포먼스도 다른 하이 레벨 언어들에 비해 빠른 편입니다.
3. 기기 호환성
- 해당 운영체제에 Java Virtual Machine(JVM)을 설치하면 Java로 만든 프로그램은 어떤 컴퓨터에서도 완벽히 똑같이 동작합니다. 가상 머신이 각각의 운영체제에 맞춰서 결과적으로 완벽히 똑같이 돌아갈 수 있도록 제작되는 덕분입니다.
4. 안정성
- 다른 언어에 비해 높은 안정성을 가지고 있습니다. 우선 C나 C++에 안정성 문제가 제기되는 포인터 연산자 및 메모리 직접 접근 함수들을 지원하지 않습니다.
- 여기에 C++과는 다르게 다중 상속을 허용하지 않습니다. 이는 객체지향의 특성 중 하나인 '상속'의 자유도를 확 떨어트리는 것이기에 언뜻 보기에는 객체지향적 관점에 위배되는 것처럼 보일 수 있으나, 반대로 오히려 이게 더 객체지향적이라고 볼 수도 있습니다.
- 객체지향의 목적 자체가 재사용을 통한 생산성의 향상과 관리 상의 이점인데, 다중 상속은 잘못 사용할 시 극도로 복잡하게 꼬인 프로그램을 만들 위험성을 갖고 있습니다. 물론 코드 관리의 측면에서도 다중 상속에 의해 발생하는 문제는 좋지 않습니다. 수준 높은 프로그래머라면 이 문제도 잘 해결할 수 있지만, Java는 아예 미연에 방지하기 위해 다중 상속을 언어 스펙에서 제거하는 방법을 택했습니다.
5. 소스 코드 가독성
- 고급 프로그래밍 언어가 만들어진 첫째 목적은 '좀 더 인간 친화적인' 코드의 작성을 돕는 데 있습니다. 기계어가 어셈블리어로 진화하고 그것이 C언어로 진화한 배경에는 '사람이 더 쉽게 읽고 이해할 수 있는 코드'가 있습니다.
- Java는 동 시기에 발표된 다른 언어에 비해 코드가 명료하고 가독성이 뛰어났습니다. C++은 어려운 문법으로 인해 코드가 이리저리 꼬이는 경우가 많고, 특히 연산자 오버 로딩과 템플릿 기반의 일반화 프로그래밍 개념이 코드 난독화에 큰 문제였는데 Java는 연산자 오버 로딩을 배제하고 오로지 메서드를 통해서만 객체의 조작을 허용함으로써 코드의 일관성을 지켜냈습니다.
- C++ 템플릿 프로그래밍의 주 사용 용도인 일반화 프로그래밍도 제네릭이라는 더 쉬운 개념을 도입해서(Java 5부터 지원) 코드의 가독성을 해치지 않고 일반화 프로그래밍을 성공적으로 도입했습니다. 키워드에 약어 사용을 자제한 점도 코드 가독성 상승에 기여했습니다.
5. java의 단점
1. 속도
- C/C++, Pascal, Fortran 같은 네이티브 바이너리 코드를 만드는 언어와 비교했을 때 처리 속도가 느립니다.
Java가 C/C++ 보다 2~3배 느리다고 하지만 다른 고수준 언어들에 비해서는 그리 떨어지지 않습니다.
1-1. JVM 로딩 속도
- Java의 심각한 담점 중 하나는 실행 과정에서 Java Virtual Machine(JVM)이 반드시 완벽하게 로딩되어야 하기
때문에 프로그램의 초기 시작이 완전한 이진 코드로 컴파일된 프로그램을 실행하는 것에 비해 오래 걸립니다.
- 하지만 Java9부터는 런타임 라이브러리를 모듈화하고 있기 때문에, 필요한 모듈만 사용하여 프로그램을 짤 수 있습니다.
1-2. 가상 머신 바이트 코드 실행 속도
- Java는 바이트코드로 된 프로그램을 실행하기 위해 운영체제와 프로그램 사이에 JVM이라는 두꺼운 계층이 하나
더 자리 잡게 됩니다. 그리고 바이트코드는 실시간으로 각 타겟 플랫폼용 기계어로 번역되어 실행됩니다.
- 덕분에 JVM만 설치되어 있다면 어느 운영체제나 CPU이든 간에 자바 프로그램이 실행될 수 있지만
네이티브 바이너리 코드를 출력하는 언어와 비교하여 실행 속도와 성능에 일정 부분 손실이 발생합니다.
1-3. 가비지 컬렉션에 의한 실행 지연
- 가비지 컬렉션에 의한 메모리 프리징 현상이 초반부터 지속적으로 Java를 괴롭혔습니다.
멀쩡하게 동작해야 할 프로그램이 순간적으로 뚝 뚝 끊기는 듯한 현상이 발생하는 것입니다.
오늘날 Java의 문제는 바이트코드 변환으로 인한 속도 저하보다 이 가비지 컬렉션의 영향이 더 크다고 할 수 있습니다.
- Java 8부터는 G1 가비지 컬렉터가 기본 설정으로 바뀌었습니다. G1 가비지 컬렉터는 메모리 누수를 일으키던
메서드 영역의 PermGen Area를 제거하여 static 인스턴스와 리터럴 문자열도 GC의 대상이 되도록 바뀌었으며,
클래스, 메서드, 배열의 메타 정보는 동적 리사이징이 가능한 Metaspace로 이동시켜 시스템 힙 영역에 저장됩니다.
덕분에 JVM 힙 영역의 공간이 늘어나고 PermGen Area를 스캔/삭제할 필요가 없어져 가비지 컬렉터의 성능이 대폭
향상되었습니다.
2. 불편한 예외 처리
- 다른 객체지향 언어들처럼, Java 역시 try~catch문으로 대표되는 예외 처리를 할 수 있습니다.
대부분의 언어에서 사용하고 있는 좋은 기능이지만 유독 Java는 다른 언어와는 달리 프로그래머의 검사가 필요한 예외(Exception을 직접 상속하는 예외 클래스)가 등장한다면 무조건 프로그래머가 선언을 해줘야 합니다. 그렇지 않으면 컴파일조차 거부합니다.
3. 소스 코드 길이
- Java는 소스 코드의 길이가 다른 언어에 비해 상당히 긴 편입니다.
같은 기능을 하는 코드를 짠다고 했을 때 다른 언어에 비해 입력해야 할 양이 많습니다.
- Java의 "Hello" 문구 출력
class Main {
public static void main(String args[]) {
System.out.println("Hello");
}
}
- C언어의 "Hello" 문구 출력
#include<stdio.h>
int main() {
puts("Hello");
}
- C#의 "Hello" 문구 출력
System.Console.WriteLine("Hello");
- 파이썬의 "Hello" 문구 출력
print("Hello")
6. 언어 사용 순위
- 세계 프로그래밍 언어 중 2000년부터 무려 19년 동안 점유율 1위를 질주한 존재였습니다. 2007년까지만 해도 전 세계 프로그래밍 언어 점유율 중에 Java 점유율이 35%까지도 차지했습니다. 얼마나 많이 썼으면 Java 업데이트 창에서 '30억 개 기기에서 Java 사용'이라고 광고할 정도였습니다.
- 그러나 2010년대 들어서 Python, C++ 등의 점유율이 급상승하면서 Java의 점유율은 점차 하락하는 추세입니다. 1위는 수성하고 있지만 점유율은 급격하게 떨어지고 있습니다. 2019년까지는 C언어보다 약간 더 많은 수준으로 17~18% 정도를 차지하고 있고, Java 점유율이 하락한 만큼 Python 비율이 크게 올랐습니다.
- 결국 2020년에 C언어와 Python에 줄줄이 사용량 순위에서 추월당했습니다. 2021년까지도 Top 5를 지키고는 있지만 일단 1위에서는 내려왔습니다.
'DEV > JAVA' 카테고리의 다른 글
[JAVA] JAVA 버전 별 특징(1 ~ 17 버전) (0) | 2022.03.15 |
---|---|
[JAVA] 접근제어자, 접근제한자(public, private, protected, default) (4) | 2022.03.04 |
[JAVA] JAVA에서의 형변환(casting) (0) | 2021.12.23 |
[Spring] Spring(스프링) 프로젝트 쉽게 생성하기 (2) | 2021.10.08 |
[Spring] Spring(스프링) 이란? (0) | 2021.10.08 |
댓글