[Java] Java의 특성과 장단점

주재완·2024년 1월 14일
0

Java

목록 보기
2/13
post-thumbnail

What is Java?

우선 위키피디아를 살펴보자. 위키피디아

자바(Java)는 썬 마이크로시스템즈의 제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 객체 지향적 프로그래밍 언어이다. ...(중략)... 처음에는 가전제품 내에 탑재해 동작하는 프로그램을 위해 개발되었지만 현재 웹 애플리케이션 분야에 가장 많이 사용하는 언어 중 하나이고, 안드로이드를 비롯한 모바일 기기용 소프트웨어 개발에도 널리 사용되고 있다. ...(후략)...

이 내용을 보면 Java라는 언어는 특히 웹개발에 많이 쓰이는 언어임을 볼 수 있다. 어떤 특징이 있는지 그 다음을 보도록 하자.

...(중략)... 자바를 다른 컴파일언어와 구분 짓는 가장 큰 특징은 컴파일된 코드가 플랫폼 독립적이라는 점이다. 자바 컴파일러는 자바 언어로 작성된 프로그램을 바이트코드라는 특수한 바이너리 형태로 변환한다. 바이트코드를 실행하기 위해서는 JVM(자바 가상 머신, Java Virtual Machine) 이라는 특수한 가상 머신이 필요한데, 이 가상 머신은 자바 바이트코드를 어느 플랫폼에서나 동일한 형태로 실행시킨다. 때문에 자바로 개발된 프로그램은 CPU나 운영 체제의 종류에 관계없이 JVM을 설치할 수 있는 시스템에서는 어디서나 실행할 수 있으며, 이 점이 웹 애플리케이션의 특성과 맞아떨어져 폭발적인 인기를 끌게 되었다.

정리하면 자바가 웹개발에 쓰이는 이유들 중 하나는 바로 자바가 JVM 이라는 것을 사용하기에 특수한 성질을(특히 운영체제에 독립적인 특징) 띄기 때문인 것이다. JVM에 관해 자세한 것은 여기를 참고하도록 하고, 자바의 특징을 보면서 어떠한 장점이 있는지, 또는 한계점이 있는지 알아보자.

Java의 특성과 장단점

Java의 특성

흔히 알려진 Java의 특성은 아래와 같다.

  • 이식성이 높음
  • 객체 지향 언어
  • 자동 메모리 관리
  • 하이브리드 언어
  • 동적 로딩 지원
  • 멀티쓰레드 지원

각각에 대해서 알아보자.

이식성이 높음

이식성의 경우에는 앞서 언급한 JVM과 연결된다. JVM은 자바를 실행하기 위한 가상 기계로 플랫폼에 의존적이며, byte code(class파일)를 해석하고 실행하는 인터프리터(interpreter)이다.

쉽게 말하면 보통 다른 언어들은 프로그램을 운영 체제가 직접 돌리는데, 자바는 JVM이 중간에 낀다는 것이다. 그것으로 인해 다른 컴파일러 언어와 인터프리터 언어들과는 다른 특징을 가지고 있다.
JVM

객체 지향 언어

객체 지향에 대해서는 조금 더 뒤에 자세히 정리 예정이다.

  • 객체 지향은 순차적으로 진행하는 절차 지향과는 달리 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, "객체" 로 보는 것을 의미한다.
  • 클래스(class), 오브젝트(object), 인스턴스(instance) 개념 등장.

... 뭔가 용어들이 등장하기 시작하는데 조금 예시를 들어보면

  • 클래스 : 책상을 만들기 위한 설계 도면
  • 오브젝트(객체), 인스턴스 : 실제로 만들어진 책상

으로 생각해볼 수 있다. 설계 도면으로 실제 책상을 계속 만들 수가 있는 것이다. 기존에는 주먹구구식으로 책상을 하나씩 만들었다면, 설계 도면이 있다면 필요할 때 책상을 언제든지 만들 수가 있는 것이다.

클래스와 객체

또한 설계 도면이 있다면 다른 사람도 책상을 만들 수가 있고, 필요시 부분 수정하기가 쉬워진다. 즉 실제 협업을 할 때 큰 도움을 준다.

객체 지향의 특징에는 추상화, 캡슐화, 상속, 다형성이 있는데, 이는 추가 설명을 한 페이지를 만들 계획이다.

자바는 여러 언어들 중(python 등) 가장 대표적인 객체 지향 언어이다.

자동 메모리 관리

자바에는 C언어와는 다르게 포인터라는 것을 직접 지정하지 않는다. C언어의 경우에는 포인터, 동적 할당 등 메모리 관리를 해야되는 요소가 존재해서 다른 언어에 비해 난이도가 높은 편이다.

반면, 자바는 이를 Garbage Collector 라는 것이 정리를 해주기에, 사용자가 (C언어에 비해) 사용하기 편하다. 물론 자바가 무조건 쉽다는건 아니다.

Garbage Collector와 관련된 상황을 살펴보자. 배열을 하나 선언하고 그곳에 한번 더 배열을 선언하면 메모리상 주소가 같을까? 우선 코드부터 살펴보도록 한다.

  • 입력
int[] arr = new int[5];
System.out.println(arr);

arr = new int[7];
System.out.println(arr);
  • 출력
[I@2a139a55
[I@15db9742

출력부의 구조에서 @ 앞의 알파벳은 배열을 자료형(Integer), 뒤쪽은 주소(정확하게는 hashCode)를 16진수로 나타낸 것이다. 분명 변수명은 똑같은데 왜 그럴까?

기본적으로 배열은 참조변수이다. 후 포스팅에서 일반 변수와 참조 변수에 대해 설명 예정이지만, 간단하게만 설명하면, 실제 값을 직접 저장하는게 아니라 값을 참조한다. 따라서 그냥 arr만 출력하면 hashCode가 뜨는 것이다.

처음에 배열을 선언하면 다음과 같이 주소를 저장하여 heap 메모리에 있는 해당 주소에 있는 값을 참조할 뿐이다. 여기서 배열을 다시 초기화하게 되면 다음과 같은 과정이 일어난다.

주소가 바뀌게 되고, 기존의 참조를 끊고 값을 새로 참조하게 된다. 그러면 문제는 남아 있는 heap 메모리상에 '둥둥 떠다니는' 저 점선으로 된 것은 어떻게 처리하는 것일까?

이럴 때 자바는 시간이 지나고 GC(Garbage Collector)가 알아서 처리해준다.

하이브리드 언어

컴파일 언어인 동시에 인터프리터 언어이다. 텍스트 소스를 컴파일하여 이진 파일(.class)로 만든 다음 자바 런타임이 클래스 파일을 인터프리트 하면서 실행한다.

  • 컴파일 언어: 코드 전체가 컴파일 된 뒤에 실행하는 언어, 대표적으로 C/C++ 이 있다.
  • 인터프리터 언어: 코드를 한줄한줄 번역과 실행을 동시에 진행하는 언어, 대표적으로 python, Javascript 등이 있다.

동적 로딩 지원

동적 로딩이란 프로그램을 실행할 때, 그리고 필요할 때마다 동적으로 메모리를 할당하고 적재하며, 필요 없는 메모리는 자동으로 할당 해제하여, 메모리를 효율적으로 관리하는 로딩 방식을 뜻한다.

이에 따라 필요한 객체만 생성해서 사용하는 자바 언어의 특징으로 에러 발생 시 필요한 클래스들만 고치면 되기에 유지 보수가 쉽다.

멀티쓰레드 지원

하나의 프로세스에서 메모리를 공유하는 여러 쓰레드를 동시에 실행할 수 있다. 일반적인 언어 진행 과정이 순차적으로 실행되는 것과 배치하여 동시 동작이 필요할 때 쓰레드를 사용한다. 아래는 싱글 쓰레드와 멀티 쓰레드의 간단한 동작 방식을 그림으로 나타낸 것이다.
쓰레드 동작 원리

Java의 장단점

위에 있는 특징(장점)에도 불구하고 자바의 몇 가지 단점이 존재한다.

  • JVM을 거쳐야하기에 다른 언어에 비해 실행 속도가 느리다.
  • 예외 처리가 잘 되어 있는 편이지만, 일일이 개발자가 지정해줘야 되는 번거로움이 있다.
  • 작성해야되는 코드 양이 많다. 아래 Hello World!를 출력하는 코드를 살펴보자.

Java 와 python 코드

Java ☕️

public class HelloWorld {
	public static void main(String[] args) {
    	System.out.println("Hello World!");
    }
}

python 🐍

print("Hello World!")

마치며...

이 포스팅 이후 정리한 내용 중 관련 내용은 아래와 같다. (계속 수정 예정)

profile
언제나 탐구하고 공부하는 개발자, 주재완입니다.

1개의 댓글

comment-user-thumbnail
2024년 1월 20일

잘보고 갑니다 !

답글 달기

관련 채용 정보