이식성이란 다른 실행 환경의 시스템 간 프로그램을 옮겨 실행할 수 있는 것을 말한다.
만약 Windows에서 개발한 프로그램을 Linux에서도 실행할 수 있다면 이식성이 높다고 말할 수 있다.
원래 다른 실행 환경에서 실행하기 위해선 소스 파일을 수정하고 재컴파일 과정을 거쳐야 하지만, 자바로 개발된 프로그램은 JRE가 실행된 모든 OS에서 실행 가능하다.
OOP, 객체 지향 프로그래밍 언어는 객체를 기준으로 코드를 구현하는 것을 말한다.
레고 블록이 되는 클래스(인스턴스)를 조합하여 프로그래밍을 할 수 있도록 구현되었기 때문에, JAVA는 OOP를 위한 적절한 객체지향 언어라고 할 수 있다.
애초에 JAVA는 처음부터 객체를 고려하여 설계되었으므로 OOP의 특징인 캡슐화, 추상화, 다형성, 상속성 및 재사용을 지원한다.
JAVA 8부터 지원하는 기능이다.
JAVA 8 이전에는 지원하지 않았으나 함수형 프로그래밍이 대용량 데이터의 병렬 처리 및 이벤트 지향 프로그래밍에 적합하여 이를 지원하기 위해 람다식(Lambda Expression) 지원을 통해 함수형 스타일 코딩을 가능하게 해주었다.
C언어를 사용하다 보면 free() 명령어를 통해 메모리를 직접 해제하여 메모리 관리를 수행해줘야 한다.
이렇게 사람 손으로 메모리를 해제하면 메모리를 내가 원하는 대로 관리할 수 있다는 장점을 가지지만, 인간이라는 것은 언제나 실수하는 생물이듯 조금의 실수로도 메모리 누수가 발생하는 경우가 발생한다.
만약 많은 사람들이 활용해야 하는 서비스에 free() 명령어 하나가 빠져 메모리 누수가 발생하고, 메모리 부족이 발생한다면 서버 관리에 큰 어려움을 겪을 것이다.
자바는 객체를 생성할 때 자동으로 메모리 영역을 찾아 할당하고, 객체를 모두 사용할 경우 Garabage Collector를 실행하여 자동으로 객체를 메모리 상에서 제거한다
개발자는 내가 원하는 대로 메모리 관리가 안 될 수는 있으나, 자동으로 메모리 관리를 수행해주기 때문에 메모리 관리보다는 코드에 더욱 집중할 수 있다는 장점을 가진다
JAVA에서는 애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩하여 객체를 생성한다.
만약 1000명의 User가 있다고 하더라도, 각 User마다 활용하는 클래스가 다르기 때문에 모든 User에게 필요한 모든 객체에 대하여 메모리를 미리 할당하지 않아도 된다는 의미이며 이는 메모리를 효율적으로 관리할 수 있게 도와준다.
자바는 오픈소스 언어이므로 JAVA에서 활용하는 라이브러리 또한 오픈소스가 많다.
검증된 오픈소스를 적절하게 활용할 수 있게 된다면 개발 기간을 단축하면서도 안정성이 높은 애플리케이션을 쉽고 빠르게 개발할 수 있게 된다.
위에서 모두 설명한 내용이다.
단지, 높은 생산성 측면은 장점이라고 보는 사람들도 있지만, 개인적인 생각으로는 이제 JAVA는 생산성이 높은 언어라기엔 조금 애매한 점이 있다고 생각한다.
Python 같은 다른 프로그래밍 언어가 급성장하며 더욱 빠르고 직관적인 코딩이 가능해졌다고 생각한다.
JAVA는 "초반에 개발된 프로그래밍 언어" 중 좋은 생산성을 가진 언어는 맞았으나, 현재는 이를 장점으로 가지고 있다기엔 애매한 점이 있다고 생각한다.
JAVA는 C언어보다 보안 상 많은 안정성을 가지고 있는데, 이는 "포인터" 사용의 유무이다.
C언어는 포인터를 통해 객체 메모리에 접근할 수 있다 보니 해커가 공격할 수 있는 수단이 (최소) 하나 더 많아지는데, JAVA는 직접적으로 메모리에 접근할 수 없기 때문에 이런 공격을 막을 수 있다는 장점을 가진다.
또한, OOP에 적합한 프로그래밍 언어로써 캡슐화를 통해 내부와 외부를 통해 접근할 수 있는 변수 공개 범위를 정할 수도 있으며 try ~ catch 구문을 통해 다양한 위험 요소를 사전에 방지할 수도 있다.
자바는 JVM의 가상 환경을 적극적으로 사용한다.
OS의 영향을 많이 받지 않기 때문에, 멀티스레드를 지원하지 않는 OS라고 하더라도 JAVA 언어를 통해 구현하면 JVM 상에서 멀티스레드가 가능하도록 구현할 수 있다.
이 부분은 장점이자 단점도 될 수 있는 특징이다.
장점만 말하자면, 위에서 말했듯 개발자가 메모리를 직접 관리할 필요가 없으므로 메모리 누수의 위험도가 크게 줄어들며 개발자는 메모리 관리보다는 코드 자체에만 더욱 집중하면 된다
JAVA는 JVM을 로딩해야 하고, 가상 머신 상에서 바이트코드로 변환하고 이를 실행해야 하며, Garbage Collection을 실행하기 위해 중간에 코드가 잠시 중단되는 등 원래 기능과는 관계없는 부분에서 많은 시간을 소요한다.
나중에 JAVA의 실행 원리를 알면 왜 시간이 오래 걸리는지 이해가 갈 것이기 때문에, 이 정도만 설명하고 넘어가도록 하겠다.
Garbage Collection은 JAVA의 큰 장점이기도 하지만, 단점이 되기도 한다.
JAVA는 Garbage Collection에 의해 메모리를 자동으로 반환하게 된다. 그런데, 메모리를 반환하는 타이밍은 개발자가 정할 수 없으므로 자바에서 알아서 판단하여 객체 메모리를 해제하게 된다.
즉, 메모리를 자동으로 반환하기 때문에 언제 Garabage Collection이 메모리를 확인하여 프로그램에 있는 자료들을 확인하고 반환할지 모른다는 단점을 가진다.
이는 JAVA가 실시간 응용 시스템에 부적합하다는 문제점과 이어진다.
실시간 응용 시스템은 일정 시간(Deadline) 내에 반드시 실행 결과를 내야 한다.
그런데 JAVA의 경우 Garbage Collection이 수행될 때는 프로그램 실행이 일시적으로 중지된다. 즉, Deadline 내에 실행 결과를 내야 하는 실시간 응용 시스템에는 적합하지 않게 되는 것이다.
자바의 경우 Python 등과 비교해 봤을 때 정말 소스 코드의 길이가 길어짐을 볼 수 있다.
코딩에 최소한으로 필요한 요소들 자체가 길이가 길기 때문에 소스 코드의 길이가 너무 길다는 단점을 가진다
가상 머신(JVM)이라는 개념으로 플랫폼 독립적인 구현이라는 참신한 접근법
객체 지향 개념과 개발 문화 확산에 기여
자바에서 웹 프로그램 개발을 지원하기 위해 발표한 개념들
Servlet : 자바의 대표적인 구현 분야가 됨
JSP : Servlet의 응용 기술. 웹 화면(HTML)에 자바 코드를 활용하여 웹 프로그램 개발 효율을 높임
웹 개발의 기본 기술이었지만, 최근 프론트엔드 기반 개발, 백엔드 개발환경의 변화(Spring!!!) 등으로 인해 사용 비율이 낮아짐
사실, 최근 Servlet과 JSP는 사장되었다고 보는 것이 마자
Open Source로 발표된 자바 기반의 통합 개발도구 플랫폼
자바 성장에 크게 기여함
자바의 기본 통합 개발 도구로 자리 잡음
실제로 웹 개발 때는 IntelliJ를 많이 활용하지만, 학습 시에는 Eclipse를 더 많이 활용한다
Spring Boot로 인해 개발이 간소화됨
많은 백엔드 시스템 구현에 Spring Framework가 활용됨
우리나라의 경우 공공 개발에 요구되는 전자정부 프레임워크를 Spring 기반으로 만들었음
대규모 시스템 개발에 적합한 오픈소스 프레임워크로 자바 성장에 큰 역할을 함
요약
JAVA는 높은 이식성, OOP에 적합한 언어, 함수형 스타일 코딩이 가능한 언어, Garbage Collector를 가지고 있다는 특징을 가지는 언어이다.
또한 동적 로딩으로 메모리를 할당하며 오픈 소스 라이브러리를 통해 쉬운 개발이 가능하다
JAVA는 높인 이식성, 수많은 레퍼런스, 안정성, OS에 관계없는 멀티 스레드 환경 구축이 가능하다는 장점을 가지고 있으나 실행 속도가 느리며 소스 코드가 길고 실시간 응용 시스템에 부적합하다는 단점을 가진다.