본문 바로가기

소프트웨어,IT,컴퓨터공학 도서리뷰/자바 & 모던자바

카이호스트만의 코어자바1 - Chapter 01 Java프로그래밍 언어의 대하여 -

자바의 역사의 핵심들

 

1991년 [ 새로운 개념을 채택한 프로그래밍 언어의 고민이 시작되다. ]

제임스 고슬링 선생님.

자바(Java) 프로그래밍 언어의 창시자인 Sun의 엔지니어 Patrick Naugthon과 James Gosling(자바의 아버지 격인 분)은 TV의 스위치 박스에서 돌아갈 수 있는 언어를 고민한다.

당시에 주류 언어는 C, 포트란, 베이직 등등이었는데 해당 언어들의 특징은 하드웨어와 1대 1 결합되는 컴파일러를 가진다는 문제점이 있다는 것이다. [ 소스코드가 하드웨어 아키텍처(CPU)에 종속적이게 되는 것이다. ]

 

스위치 박스같은 경우는 메모리의 용량이 상당히 적어서 프로그래밍 언어 자체는 가벼우면서 단단해야 했다.

 

Sun 엔지니어 둘은 CPU 아키텍처에서 자유로우면서 작은 메모리 위에서도 안정적으로 돌아갈 수 있는 프로그래밍 언어를 고민하게 된다. 

 

이에 대한 해결책이 바로 Garbage Collector가 작동하는 Virual Machine이었다.

 

1996년 [ java의 1.0 버전이 출시되다. ]

 

유명한 말인 Write Once Run Anywhere(한번 작성하면 어디서든 실행 가능한)라는 표현과 함께 자바가 등장한다. 

 

JVM이라는 혁신적인 무기를 들고 나온 자바는 다양한 하드웨어 아키텍처에서 자유롭기를 바랐던 많은 이들이 관심을 가지게 끌게 된다. 

 

[ 하지만 당시 프로그래머들에게 자바의 얘기를 들어보면 자바는 상용까지는 절대 불가능할 정도로 무겁고 성능이 낮았다고 한다. ]

 

Applet

웹을 기반으로 이러한 프로그래밍이 가능했다. [ 정적인 화면만 보여지던 당시에는 혁신이었다. ]

지금은 자바 스크립트가 브라우저용 언어로 브라우저 화면상의 동적인 기능을 제공해주지만

 

당시에는 자바 스크립트와 같은 언어가 없었다.

 

현재의 자바스크립트와 같은 기능을 제공해준 언어가 바로 자바였다. 

 

그것이 바로 Applet이다. 브라우저 위에서 동적인 기능을 추가하는데 활용했다. 

[당시 인터넷 익스플로러와 넷스케이프가 브라우저 내부에 JVM을 포함시켜주었다.] 

하지만 브라우저 생태계가 다양해지고 자바는 이를 지원하지 못하게 되면서 Applet을 위한 자바의 언어는 빠르게 식어버리고 그 자리를 JavaScript에 내주게 되었다.

 

자바의 동적인 기능 처리는 서버사이드로 옮겨가게 된다.

 

자바의 장점은 웹 화면의 UI를 다루는 부분이 아니었다.

서버에서 동작하는 애플리케이션의 기능 처리 부분이 장점이었다.

 

애플릿에 대응하는 서블릿의 등장으로 자바는 서버사이드 진영에서 다시 한번 날아오르게 된다.

[ 당시에는 C언어로 CGI(Common Gateway Interface) 프로그램으로 서버를 개발했다. ]

 

서블릿은 C에 비해서 간결한 문법을 제공했으며 자바가 가진 멀티스레드 기반으로 요청도 빠르고 안정적으로 처리할 수 있었다.

자바의 경우 프로그래머가 메모리에 직접적인 접근하는 것이 불가능했기에 안정적인 서비스를 개발하는데 도움이 되었다.

 

이후 JSP(Java Server Page) 모델이 떠오르고 인터넷 시대에 자바 프로그래밍 언어는

중요한 개발 환경으로 자리를 잡는다. 

[ 이후 마이크로소프트 진영의 닷넷 프레임워크와 자바의 엔터프라이즈 프레임워크로 나뉘게 된다. ]

 

 

Java5 [2004년]

 

C#의 특징인 애너테이션, for each문, generic 기능이 추가된다.

generic을 처리하기 위한 언박싱과 오토 박싱 기능이 도입된다.

자바 8 이전에는 Java5가 가장 큰 변화가 아니었을까 한다.

그리고 2009년에 오라클에 인수되고 추가적인 기능에 대해서는 잠잠해지게 된다.

[ 자바에 대한 이권다툼만 뉴스에 오르게 되면서 많은 자바 개발자들이 자바를 떠나게 된다. ]

 

Java8 [2014년]

 

모던 자바의 시작.

 

모두가 자바를 등지고 다른 프로그래밍 언어를 배우고 있었을 때 자바 8은 자신의 황금기를 놓지 않으려고 대대적인 혁신을 도입한다.

 

병렬 프로그래밍의 발달로 떠오르고 있던 함수형 패러다임을 도입한 것이다.

[ 자바의 개발 진영은 순수 객체지향을 추구하던 개발진과 함수형 패러다임을 도입해야 한다는 개발 진영으로 나뉘어 싸우고 있었다. ] 

 

그리고 몇몇 고질적이었던 문제를 가지는 유틸리티를 새롭게 개선해서 내놓는다.(date, time, file 등등)

가장 눈여겨 봐야할 점은 람다 표현식과 함수형 인터페이스들(Consumer, Supplier, Function, Runnable, Operator, Predicate), 스트림 API이다. [ 자바의 전설적인 언어 설계자들이 참여한다.(대표적으로 조슈아 블로크와 닐 개프터,) ] 

 

사실상 해당 버전의 자바는 레거시 자바와 모던 자바와의 경계를 강하게 그었다.

[ 아쉽게도 한 발 늦은 자바는 함수형 프로그래밍 도입에 대해서 JVM기반의 코틀린, 스칼라에게 상당히 많은 개발진을 뺏기게 되었다. ]

 

Java9 2017년 라이선스 체계가 발표된다.

 

당시에 라이선스가 생기게 된 자바를 떠나야 한다는 말이 많았다.

[ 지금 보면 그렇게 심각한 문제 같지는 않지만 엔터프라이즈 업계에서는 상당히 민감한 주제이다. ]

 

이후 꾸준하게 가비지 컬렉터가 개선되고 작지만 유용한 기능들이 추가된다.

- 로컬 변수 추론

- 스위치 문장 개선

- 멀티라인 문자열을 위한 텍스트 블록

- instanceof 개선 등등...


자바 프로그래밍 언어에 대한 오해

은탄환은 없다!!!

 

나의 생각

 

많은 컴퓨터 공학과 학생들과 프로그래머의 길에 들어선 이들이 고민하는 부분이

"어떤 프로그래밍 언어"를 배우는 게 좋을까?이다.

 

프로그래밍 언어는 컴퓨터의 기능을 활용하는데 사용되는 도구이다.

 

도구를 사용하기 전에는 해당 도구의 목적을 이해할 필요가 있다.

 

나에게 어떤 도구가 필요한지에 대해서 말이다.

 

어떤 프로그래밍 언어는 생산성보다는 순수히 사고력만을 향상하기 위해 학습용으로 사용되기도 한다.

 

이렇듯 프로그래밍 언어가 가지는 생산성과 다양한 기능은

 

프로그래밍 언어가 사용되는 주 도메인이 어디에 있느냐에 따라 각기 다른 색을 띠게 된다.

 

그렇기 때문에 프로그래밍 언어에 대한 고민 이전에 내가 어떤 분야(도메인 영역)에서 전문성을 키우고 싶은지를 먼저 고민하는 것이 바람직하다고 생각한다.

[ 해당 질문도 어렵기는 매한가지지만..]

 

경량 웹서비스라면 자바가 아니어도 훌륭한 웹 프레임워크들이 많다.

(서버까지 넘보는 자바 스크립트 그리고 루비, 파이썬 등등)

 

데이터 처리에 관심이 있다면 파이썬와 R언어는 훌륭한 선택이 되어줄 것이다.

 

하드웨어와 밀접한 관련이 있는 임베디드는 C, C++의 역량이 필수적이다.(보안도!)

 

모바일 디바이스라면 구글의 안드로이드 진영이 선택한 코틀린(혹은 자바), 애플의 오브젝티브 C, 스위프트.

 

웹 프론트엔드는 HTML, CSS, JS 라인이 꽉 잡고 있다. [ 해당 언어 기반의 프레임워크(Vue, React) 등등 ]

 

단순히 유명하고 인기 있는 언어를 쫓다 보면 자신의 적성과 맞지 않는 도메인으로 향하게 될 수도 있다.

 

그러니 모든 것을 해결해줄 수 있는 은 탄환 같은 프로그래밍 언어를 찾는 것보다는

 

자신의 전문성을 발전시켜 사회에 기여하고자 하는 도메인에 맞는 프로그래밍 언어를 익히는 것이 좋다.

[ 물론 다양한 프로그래밍 언어를 경험하는 것은 상당히 좋다. ]

 

Java는 모든 영역에서 최고의 언어가 될 것인가?

 

이는 그 어떤 프로그래밍 언어도 불가능하다.

- Objective C와 Swift 프로그래밍 언어는 ios 시스템에서 최고의 프로그래밍 언어로 남을 것이다.

- C++, C#은 윈도우의 전반적인 프로그램에서 작성될 것이다.

- JavaScript는 웹을 장악해버릴 것이다.

 

Java가 빛이나는 영역은 다음과 같다.

1. 서버 사이드 영역

2. 크로스 플랫폼(운영체제에서 독립적인) 클라이언트 애플리케이션이다.

 

Java는 다른 평범한 프로그래밍 언어와 비슷하다.

 

프로그래밍 언어는 그 언어가 가진 능력(기능)과 간결함, 우수함보다는 어떤 시스템에서 쓰이느냐에 종속되고 지배받으며 그에 대한 기능이 확고하게 발전한다.

그리고 프로그래밍 언어 진영의 핵심은 해당 시스템에서 어떤 라이브러리를 제공하고, 어떤 편리함을 제공해줄 수 있느냐에 달려있다.

자바 프로그래밍 언어 만큼 강력한 기능을 제공하는 언어(광범위하게)는 없다고 생각한다. [ 카이 호스트만의 생각이다. ]

[ 실제로 자바만큼 많은 무료 도구와 코드를 활용할 수 있는 프로그래밍 언어가 없다.(DB, 웹, 테스트 등등) ] 

자바를 위한 IDE도 한몫한다고 생각한다. 

 

Java는 기업의 상표가 붙은 언어이기에 피해야 한다.

 

VM과 라이브러리에 대해선 무료로 접근이 가능하다.

Java의 변형을 배포하는 것이 위험한 것이다. 소스코드에 대한 직접적인 변경이 닫혀있으나 자바 프로그래밍 언어가 그러한 이유로 피해야 할 언어로 생각되지는 않는다.

미래의 자바는 GPL아래에서 사용 가능하다고 선언했다. [ 필요한 경우에는 로열티를 내고 변형해서 사용해야 한다. ]

로열티에 대한 조항은 미래에 파괴될 것으로 고려되며 그 이후의 자바는 무료가 된다.

 

JavaScript와의 관계

 

둘은 직접적인 관계가 없다.

JavaScript는 해당 언어가 나왔을 때 큰 관심을 끌고자 가장 유명한 언어인 Java를 앞에 붙인 것이다.

Netscape에서 발명한 자바스크립트는 웹 엔진 위에서 사용된다.

(자바스크립트를 처리하는 인터프리터가 브라우저에 존재한다.)

[ 물론 JS의 기초적인 문법이 자바와 많이 유사한 부분은 있다.] 


자바의 정책과 철학

 

자바의 시작

자바는 단순함을 추구했다. 

그리고 C++이 가진 문제점을 개선하는 것을 목표로 둔 언어이다.

(C, C++의 주요 특징인 포인트의 단점은 보안의 허술함과 메모리 관리에 있었다.)

추가적으로 C++에서 못 미더운 문법들도 많이 존재했는데 이를 개선하고 싶었다.

 

자바는 단순하고 가벼운 언어를 추구하면서 메모리와 관련된 문제점을 극복한 언어가 되는 것을 목표로 두었다.

 

객체지향

순수 객체지향을 추구한 언어이다.

 

모든 기능은 클래스를 기반으로 한다. 그리고 C++과는 다르게 다중 상속을 허용하지 않는다.

기능(API)과 관련해서는 다중 상속을 인정한다. 하지만 클래스와의 관계에 있어서는 다중 상속을 허용하지 않는다.

 

분산처리(Distributed)

Java 프로그래밍 언어는 TCP/IP 프로토콜을 다루는 라이브러리가 잘 발달되어 있다.

[현재는 당연하게 보이는 기능이지만 1995년에 출시되었을 때는 상당히 혁신적인 기능이었다고 한다.]

 

 

보안(Secure)

자바는 네트워크와 분산 환경에서 사용될 것을 일찍이 고려하고 만들어진 언어이다.

메모리 접근 자체가 불가능하기에 웜(worm) 공격, 바이러스 공격은 통하지 않는다.

[ 스택 메모리에 접근해서 다른 메모리 영역을 침범하거나, 권한 없이 파일을 읽게 하는 공격 기법들(메모리에 접근해서 문제를 일으키는 방식들 ]

신뢰할 수 없는 코드의 경우 따로 sandbox에서 실행되기에 호스트에 영향을 끼치지 않는다.

[가상 머신에서 실행되기에 실제 호스트 PC에 영향을 끼칠 수 없다.]

[ 여러 논문에서 자바 프로그래밍 언어의 취약점이 드러나서 완전하게 보안에 취약하지 않다고는 말할 수 없다.. ]

 

 

하드웨어 아키텍처에 중립적인(Architecture-Neutral)

자바는 바이트코드를 생성한다.(.class파일) 이는 컴퓨터 아키텍처와는 관련이 없다.

해당 코드는 해석처리 되기가 쉽고, 기기간에 쉽게 이동될 수 있도록 컴파일러를 제공한다.

그렇기에 하드웨어 아키텍처에 중립적이라고 할 수 있다.

이는 Lisp, 스몰 토크에서 추구했던 중요한 기능이라고 한다.

[ 현대의 많은 프로그래밍 언어가 하드웨어 아키텍처에 중립적이다.(사실상 필수 기능이다.)]

런타임보다는 느리지만 JIT(Just in time Complication)을 통해 바이트 코드를 머신 코드로 전환되는데 이 과정에서 충분한 최적화를 거친다.

 

 

Interpreted

어떻게 해석되느냐에 따라서 논란이 있는 부분이지만, 부분적으로 자바 컴파일러는 소스 코드를 인터프리터 방식으로 처리하기도 한다. [ 자바 8에서는 jshell이 도입되어 자바 프로그래밍 언어를 인터프리터 언어처럼 활용해볼 수 있기는 하다.(거의 사용하지는 않지만..) ]

현대의 자바는 완전한 컴파일 언어라고 보기 어렵다고 할 수 있다.

 

High-Performance(성능)

Just-in-time compiler가 최적화를 해준다. 속도 향상의 여지가 늘 존재하는 것이다.

- 내부 함수의 콜 분석(콜 내부의 로직 분석), 클래스 요청을 분석하여 최적화를 진행해준다.

 

Multi-Thread

병렬 구조의 프로그래밍 기법이 각광받으면서 뜨거워진 기능이다.

이벤트 주도 설계와 비동기 처리와 관련해서 자바가 오랫동안 지원해온 멀티스레드 프로그래밍이 빛을 발하고 있다.

[ 람다식과 스트림 API와 관련해서... ]

서버의 요청 시간에 응답을 위해 대기하는 방식(동기화)에서 벗어나 기능을 구현하게 해주는 환경에서 자바의 스레드 기반 프로그래밍 언어 기법은 강력하다.

 


주말마다 시간을 내서 그간 읽었던 책들의 내용을 조금씩 복습해볼까 한다.

 

첫 복습 책으로 코어자바를 택하게 되었다.

 

연구실에 처음들어왔을 때 목표로 둔 책이라 나에게는 애뜻한 책이기도 하다.

 

초심으로 다시 돌아가고 기본기를 다시 확인해보기 위해서 해당 책을 뽑아보았다.

 

노션에 따로 공부했을 때 중요하다고 생각한 내용을 정리했는데 이를 한 번 더 정제하고자 한다.

 

오랜만에 새롭게 알게 된 내용도 있는 것을 보니... 오랜 기간 복습을 하지 않았다는 것을 알게 되었다.

 

한 2달간은 코어 자바를 조금씩 정리하게 되지 않을까 한다

 

혹여나 틀린 부분이 있다면 답글에 남겨주시면 수정하도록 하겠습니다. 

 

참고 도서

 

1. Practical 모던 자바 [인사이트 출판사, 장윤기 저자]

2. Core Java Volume1 11판 [카이 호스트만]

반응형