[#1] 언어론에서의 Java

AMUD·2022년 5월 24일
0

Java Story

목록 보기
1/2
post-thumbnail

프로그래밍언어론에서의 Java

👓 프로그래밍 언어 평가

프로그래밍 언어가 정말 많다. 서적이나 맛집과 마찬가지로, 종류가 많아지면 비교와 평가가 항상 따르는 것 같다. 물론 언어도 평가와 비교에서 예외는 없다. 언어 평가는 사람이나 상황에 따라 그 필요성과 가치 측정이 많이 달라지지만, 범용적으로 언어의 특징을 평가하는 기준이 있다. 기준이 절대적이라고 말할 수는 없지만 본 글 서술을 쉽게 하기 위해 간단하게 본 기준을 정리하고자 한다. 나중에 기회가 된다면 언어 평가 자체에 대해서도 글을 작성할 계획이다.

우선 가장 큰 기준은 판독성, 작성력, 신뢰성이다. 세 개의 기준이 모두 중요하나 무 자르듯이 완전히 분리될 수는 없다.

  • 판독성 : 프로그램을 얼마나 쉽게 읽고 이해할 수 있는가?
  • 작성력 : 선택된 문제 영역에 대해 프로그램 소스를 작성하는데 언어가 얼마나 쉽게 사용될 수 있는가?
  • 신뢰성 : 작성된 프로그램은 원래 의도 및 명세에 따라 제대로 수행되는가?

위 기준을 평가하는 언어들의 특성들도 많은데 간단하게 그 몇몇 항목들과 포함 여부를 정리하면 아래와 같다. 간단하게만 읽고 넘겨도 좋다.

👼 Java가 태어났어요

Java는 우연으로 생긴 언어가 아닌 당시에 만족할만한 기존 언어가 없는 응용을 위해서 설계되었다. (사실 대부분의 언어가 그렇다) 썬 마이크로시스템즈사는 1990년에 토스터, 전자레인지, 대화식 TV 시스템에 내장된 소비자 가전 장치들을 위한 언어가 필요하였다. 개인적으로는 임베디드==C/C++ 이고, Java는 웹 프로그래밍에 유용한 도구라는 인식이 있어서인지 임베디드가 그 시작이라는 점이 의외였다.

임베디드라는 영역은 의도대로 수행되는 신뢰성이 매우 중요한 영역이다. 프로그램이 내장된 오븐과 같은 가전이 소비자에게 바로 막대한 피해를 주고, 후에 신뢰성 결함을 발견하게 된다면 가전 자체를 리콜해야 하는 상황도 초래된다. 그래서 임베디드 영역에서는 신뢰성이 중요하고, Java는 임베디드에서 비롯되었으니 신뢰성이 높다는 것을 짐작할 수 있다.

그 이전에 많이 사용되는 C는 규모가 작았지만, 객체 지향 개념을 지원하지 않았고, C++ 객체 지향 개념을 지원하지만 그 규모가 너무 크다고 판단되는 상황들이 많았다. 그래서 결과적으로 Java는 객체 지향 언어인 C++로부터 시작하였다.

Java는 C++에서 변경되어, 더 단순하고 안전한 언어로 C++의 강력함과 유연성을 가지고 있다.

🤷‍♀️ 그럼 C++과 어떻게 닮고 다른가?

C++에서 출발하였으니 매우 닮은 것을 Hello World만 출력해도 느낄 수 있다. 그리고 두 언어 모두 객체지향언어이기 때문에 클래스와 기본 타입들을 제공하는 공통점이 있다.

그러면, 규모를 줄이고 신뢰성을 높일 수 있었던 Java만의 차이점은 무엇이 있을까?

Java는 이미 Array를 갖고 있다구

우선 Java 배열은 미리 정의된 클래스이다. 반면에 C++은 아니기 때문에 직접 작성하고 고려할 부분이 많다. 나는 C++을 거의 모르기 때문에 아주 디테일하게 알지는 못하지만, 근래에는 Java 배열 크기의 다양성 등을 C++에서 활용하기 위해 wrapper class도 생성한다고 한다.

pointer가 없는 언어 😍

그리고 Java는 포인터가 없다. 내가 가장 처음 배운 언어가 C이다. 처음 배우는 언어이기 때문에 정말 하나하나가 크게 다가왔었는데 포인터를 배울 때는 정말 와닿지 않았고, 다루기도 어려웠다. 그래서 Java에 포인터라는 개념이 없다는 것은 정말 개발어린이인 나에게 너무 반가웠다. 그래도 Java에서는 모든 객체가 힙의 공간에 할당이 되는데, 이를 참조할 때 묵시적으로 역참조는 된다.

참과 거짓을 불리언으로

Java는 Boolean 자료형을 지원한다. C/C++ 그리고 MySQL/MariaDB까지도 true/false를 0과 1로 구분한다. 그래서 C/C++에서는 참과 거짓을 산술식에서도 활용될 수 있지만 Java에서는 산술식이 아닌 제어에서만 활용된다.

Java에서는 독립적인 프로그램 작성 불가능

Java는 사실 모든 것이 객체이다. 프로그래밍하면서 작성된 들숨과 날숨 모두가 객체라고 생각될 정도로 모든 것이 객체이다. 그래서 main함수를 호출하는데도 몇 줄 먼저 작성하며 객체를 생성한 뒤, 실행할 수 있다. 다시 말해서 C++과 다르게 따로 호출 프로그램을 작성할 수 없고, 객체를 통해서만 여러 가지 함수를 실행할 수 있다.

Java는 줏대 있는 단일 상속

C++은 클래스 정의에서 다중 상속을 직접 지원한다. 하지만 Java는 오직 단일 상속만 지원한다. 그러나 다중 상속의 이점들은 인터페이스를 통해 구현하기도 한다.

동시성 제어계의 패스트푸드

Java는 synchronized 수정자를 통하여 상대적으로 쉽게 동시성을 제어할 수 있다. 프로세스 및 쓰레드를 시작하거나 락을 거는 등의 동작을 쉽게 구현할 수 있다. 운영체제 학습 당시 Java로 프로레스를 제어하는 학습을 해보았었는데, 큰 어려움 없이 진행되었다.

쓰레기 수집가와 함께하는 코딩 생활

Java는 묵시적인 기억공간 회수를 사용한다. 이를 garbage collection이라고 한다. 이는 우리가 코딩하면서 더 이상 필요하지 않은 객체를 명시적으로 삭제할 필요가 없다는 것이다. 이는 기억 장소 누수를 아예 방지하는데, 포인터와 마찬가지로 너무나 유용한 기능인 것 같다.

확장될 때는 마음대로지만, 축소될 때는 아니야..

C/C++과 달리 Java는 타입들이 확장될 경우 묵시적인 타입 변환을 포함한다. 숫자의 경우를 예로 들자면 아래와 같다.

int a = 2;
float b = (float) a;				// 가능하다 :: 묵시적인 타입 변환

float c = 1.0;
int d = (int) c; 					// 불가능
int e = Math.round(c)		// 이와 같이 Math의 메서드로 가공하여 활용

🎠 그래서!

그래서 Java는 C++의 큰 규모와 안전하지 못한 특징들(ex. 실수를 정수로 자동 변환할 때 소수점 아래를 고려하지 못한다는 점)을 잘 축소했다고 평가받는다. 그리고 배열에서 자동 인덱스 검사도 신뢰성을 높여줬다. C의 경우에는 배열의 양끝 쓰레기값이 호출되는 경우가 Java에서는 일어나지 않는 것이다.

또 동시성 제어가 매우 간편하니, 그래픽 사용자 인터페이스, 데이터베이스 접근, 네트워킹 등에 너무 유용하다.

Java 가상 기계 (Java Virtual Machine, JVM)는 Java 해석기의 초기 버전 때는 기계어로 번역되는 게 정말 느렸으나, 근래에는 JIT(Just In Time) 컴파일러를 사용하게 되면서 실행 전에 기계 코드로 번역되기도 한다. 그래서 빨라진 속도 덕분에 C++과 같은 표준적으로 컴파일 언어랑도 그 경쟁력을 찾을 수 있다.

💛💛💛💛💛💛

내 모스트 언어가 Java여서 그런지 사심 가득한 문구들도 많은 것 같지만! 뜯어놓고 보니 더 잘난 언어인 것 같다. 평생 사랑해주자! 다음 글은 언어론 및 버전을 다룰 생각이다! 읽어주셔서 감사함당~~~!

참고

프로그래밍언어론

profile
210's Velog :: Ambition Makes Us Diligent

0개의 댓글