# JAVA란
자바는 썬 마이크로시스템즈에서 개발한 객체 지향적 프로그래밍 언어이다. 처음에는 가전제품 내에 탑재해 동작하는 프로그램을 위해 개발되었지만 현재 웹 애플리케이션 분야에 가장 많이 사용하는 언어 중 하나이고, 안드로이드를 비롯한 모바일 기기용 소프트웨어 개발에도 널리 사용되고 있다.
자바의 개발자들은 유닉스 기반의 배경을 가지고 있었기 때문에 문법적인 특성은 C 언어와 비슷하다. 자바를 다른 컴파일언어와 구분 짓는 가장 큰 특징은 컴파일된 코드가 플랫폼 독립적이라는 점이다. 자바 컴파일러는 자바 언어로 작성된 프로그램을 바이트코드라는 특수한 바이너리 형태로 변환한다. 바이트코드를 실행하기 위해서는 JVM이라는 특수한 가상 머신이 필요한데, 이 가상 머신은 자바 바이트코드를 어느 플랫폼에서나 동일한 형태로 실행시킨다. 때문에 자바로 개발된 프로그램은 CPU나 운영 체제의 종류에 관계없이 JVM을 설치할 수 있는 시스템에서는 어디서나 실행할 수 있으며, 이 점이 웹 애플리케이션의 특성과 맞아떨어져 폭발적인 인기를 끌게 되었다.
# JAVA 특징
1. 호환성이 높은 언어
Java는 JVM 위에서 돌아가기 때문에 운영체제의 종류에 상관없이 실행되게 됩니다.
예를 들어 C언어의 경우 운영체제의 종류에 따라서 int형의 크기가 달라지기도 하지만 JAVA의 경우 모두 동일한 JVM환경에서 돌아가기 때문에 이런 경우는 없습니다.
2. 객체지향 프로그래밍(OOP)
간단하게 말해 객체지향 프로그래밍 언어는 하나의 기능을 객체로 만들고, 이러한 객체들을 결합해서 하나의 프로그램을 만든다고 설명할 수 있습니다.
3. 메모리를 자동으로 관리
C언어는 메모리에 생성된 객체를 제거하기 위해 개발자가 직접 코드를 작성해야 합니다.
만약 이 작업을 잘 처리하지 않으면 프로그램은 불완전해지고 갑자기 다운되는 현상을 겪게 됩니다.
자바는 개발자가 직접 메모리에 접근할 수 없도록 설계되었으며 메모리는 자바가 직접 관리하게 됩니다.
객체 생성 시 자동적으로 메모리 영역을 찾아서 할당하고, 사용이 완료되면 쓰레기 수집기(Garbage Collector)를 실행시켜 자동적으로 사용하지 않는 객체를 제거시켜줍니다.
따라서 개발자는 메모리 관리의 수고를 덜고, 핵심기능 코드 작성에 집중할 수 있습니다.
4. 멀티스레드 구현 가능
하나의 프로그램이 동시에 여러 작업을 처리해야 하는 경우와, 대용량 작업을 빨리 처리하기 위해 서브 작업으로 분리해서 병렬 처리하려면 멀티스레드 프로그래밍이 필요합니다.
자바는 쓰레드 생성 및 제어와 관련된 라이브러리 API를 제공하고 있기 때문에 실행되는 운영체제에 관계없이 멀티 스레드를 쉽게 구현 가능합니다.
운영체제마다 멀티스레드를 이용하는 API가 다릅니다.
Java의 경우 Java API를 이용하기 때문에 일관된 생성 및 관리가 가능합니다.
5. 동적 로딩(Dynamic Loading) 지원
자바 애플리케이션은 여러 개의 객체가 서로 연결되어 실행되는데, 이 객체들은 클래스로부터 생성됩니다.
애플리케이션이 실행될 때 모든 객체가 생성되지 않고, 객체가 필요한 시점에 클래스를 동적 로딩해서 객체를 생성합니다.
또한 개발 완료 후 유지보수가 발생하더라도 해당 클래스만 수정하면 되므로 전체 애플리케이션을 다시 컴파일할 필요가 없습니다. 즉, 유지보수를 쉽고 빠르게 진행할 수 있습니다.
6. 오픈소스 라이브러리(open source library)가 풍부
일부 유료화가 진행되었지만 자바는 오픈소스 언어이고 자바를 이용해서 전 세계에서 만들어진 라이브러리들이 굉장히 많습니다.
그래서 애플리케이션을 만들기 위해 오픈소스를 참고한다면 시간비용을 절약할 수 있습니다.
그리고 오픈소스이다가 보니 문제가 생기는 경우 찾아볼 수 있는 레퍼런스들도 많습니다.
# JAVA와 C++ 차이
두 언어 모두 객체지향언어로 유명하다. 하지만 둘의 차이점은 무엇일까?
1. 상속
JAVA가 C++보다 단순한 상속 체계를 지원한다.
첫째로, C++은 다중 상속을 지원하고 JAVA는 그렇지 않다. 여기서 '다중 상속'이라 함은, 하나의 클래스가 두개 이상의 클래스를 상속하는 것을 지칭한다. 다중상속을 지원하는 언어에서는 다이아몬드 문제(Diamond Problem)이 발생하는데, C++에서는 다이아몬드 문제를 회피할 수 있는 기능을 제공한다. 물론 JAVA에서는 애초에 발생할 일이 없다.
둘째로, C++는 friend 키워드를 지원하고 JAVA는 그렇지 않다. 특정 class에 friend 키워드를 붙여서 클래스 혹은 함수를 선언해 놓으면, 명명된 클래스와 함수는 그 class의 private, protected area에 접근할 수있다. 하지만 이 방법은 객체의 은닉성을 파괴하므로 정말 특수한 경우가 아니면 사용을 지양한다.
셋째로, JAVA는 Interface를 지원하고 C++는 그렇지 않다. 다중상속이 지원되지 않는 JAVA는 Interface를 통해 다중상속을 어느정도 흉내낼 수 있다. JAVA에서는 하나의 Class가 여러개의 Interface를 Implement할 수 있다. Interface는 상수와 추상메소드로만 구성되어 있으므로 여러개의 Interface를 implement하더라도, 다이아몬드 문제를 발생시키지 않는다.
2. 메모리 처리
첫째로, JAVA는 객체를 메모리의 Heap영역에만 할당할 수 있으나, C++의 경우 Heap과 Stack영역 모두에 할당이 가능하다. C++에서 new 키워드를 통해 객체를 생성하면 Heap영역에 객체가 할당되고, 일반적인 변수 선언 방식을 택하면 Stack영역에 할당이 된다. JAVA에서는 일반적인 변수 선언 방식으로 객체를 생성할 수 없다.
둘째로, JAVA는 메모리(Heap 영역) 해제가 자동으로 이루어지지만, C++은 프로그래머가 수동으로 해야한다. JAVA에서는 Garbage Collector가 미사용 객체 등의 자원을 자동으로 해제하며, 프로그래머는 수동으로 GC를 조작할 수 없다. C++에서는 Destructor(소멸자)를 통해 메모리 해제가 가능하다.
3. 문법 및 기능
첫째로, C++에서는 연산자오버로딩을 지원하지만, JAVA는 그렇지 않다. 연산자 오버로딩은 단어 그대로 연산자를 재정의 하여 활용한다는 것인데, '객체'간 연산에 활용할 수 있다. (이를테면, *연산을 재정의하여 객체와 객체를 * 연산처리 할 수 있다.) JAVA는 만들어질 때부터 이러한 연산자 오버로딩을 지원하지 않는 방향으로 개발되었다고 한다.
둘째로, JAVA는 익명클래스(Anonymous Class)를 지원하지만, C++의 경우 그렇지 않다. 익명클래스는 JAVA에서 지원하는 기능인데, 말 그대로 이름이 없는 클래스이다. 인터페이스의 메소드 중 하나만 재정의하고 싶을 때 자주 사용되며, 클래스의 선언과 객체의 생성이 동시에 이루어지는 형태를 띄고 있다. JAVA는 익명클래스를 통해 '함수형 프로그래밍'의 형태를 어느 정도 흉내낼 수 있다.
셋째로, JAVA는 동적바인딩(Dynamic Binding)을 택하고 있지만, C++은 정적바인딩(Static Binding)을 택하고 있다. 하지만 C++이 정적바인딩만 지원하는 것은 아니고, virtual 키워드를 통해 동적바인딩을 지원한다.
![](https://blog.kakaocdn.net/dn/clnYMU/btrUtKQS3UE/myDOIz6Hsyi1cdgbL9AZWK/img.png)
# JAVA 장단점
# 장점
- 높은 보안성
- 호환성
- 멀티스레드
- 강력한 디버깅
# 단점
- 속도 문제 - JVM 로딩 속도 문제, 가상 머신 바이트코드 실행 속도 문제, 가비지 컬렉션에 의한 실행 지연 문제
- 실시간 응용 시스템에 부적합 - 가비지 컬렉션이 언제 어떻게 작동될지는 아무도 모르기 때문에 중간에 끊김 현상이 발생할 수 있어서 실시간 응용 시스템으로는 부적합하다.
- 소스 코드 길이
- 저장에 중심을 두고 있기 때문에 백업작업에 적합하지 않다.
# Reference
https://itworldyo.tistory.com/14
https://preamtree.tistory.com/6
https://okeybox.tistory.com/131
'Back-end' 카테고리의 다른 글
[JVM 동작원리] 2. Runtime Data Area (0) | 2023.10.12 |
---|---|
[JVM의 동작원리] 1. 클래스 로더 (0) | 2023.10.10 |
Java의 compile 과정 (0) | 2023.10.09 |
agile 방법론, microservice, dev-ops, cloud (0) | 2023.07.15 |
Web server 와 Web application server (0) | 2023.03.23 |