자바의 핵심(Java Fundamentals) - 1편

 

   인터넷과 World Wide Web이 확산되면서 컴퓨팅의 근본 환경을 바꿔놓았습니다. 

 Web 이전에는 사이버 공간은 단순히 하나의 컴퓨터만 존재했었습니다. 현재는 거의 모든 컴퓨터가 인터넷을 연결되었죠. 인터넷 이 자체는 근본적으로 파일과 정보를 다른 곳으로 쉽게 이동시킬 수 있는 수단입니다. 현재는 이를 넘어 광범위한 컴퓨팅 환경을 제공하고 있죠. 이러한 변화 속에 프로그램의 새로운 변화를 제공하는 것은 바로 자바입니다.


   자바는 인터넷에 최적화된 언어입니다. 하지만, 자바는 이 보다 더 많은 것을 가지고 있습니다. 

자바는 또한, 프로그래밍을 진화시켰습니다. 우리가 생각하는 폼(Form)과 프로그램의 기능(function)에 대한 것들을 바꾸게 하였습니다. 오늘날 전문 프로그래머가 되려면 자바를 통해 프로그램을 구현할 수 있는 능력을 갖추어야 합니다. 

본 내용에서는 자바 프로그래밍에 관한 모든 방법론을 공부하게 될 것입니다. 


   이번 Chapter에서는 자바의 역사, 디자인 철학, 주요 기능들에 대해서 소개할 것입니다. 프로그래밍 언어를 배움에 있어 가장 어려운 것은 사실 얻을 것이 없는 고립된 환경 때문입니다. 대신에 언어의 구성요소들에 대해 다른 사람들과 함께 공부하는 것이 좋습니다. 상호보완 이라는 것은 자바의 대명사와 같습니다. 사실, 다른 사람들이 없이는 자바의 전반적 양상을 논하기는 힘듭니다. 이러한 문제들을 해결하도록 돕기 위해 이번 Chapter에서는 자바 프로그램의 일반적인 양식(Form), 기본적인 컨트롤 구조, 연산에 대한 전반적인 개요를 제공할 것입니다. 하지만, 깊게 파고들진 않고 대신에 모든 자바 프로그램을 위한 일반적 공통 개념에 집중할 것입니다.

 

 


자바의 기원


   컴퓨터 언어의 혁신은 프로그래밍의 기술 분야의 향상과 컴퓨팅 환경의 변화 이 두 가지에 의해 좌우됩니다. 

자바도 예외는 아니죠. C언어와 C++언어로부터 풍부한 유산을 상속한 자바는 프로그래밍 분야의 현재 상태를 반영하고 수정된 결과가 추가되었습니다. 특히, 온라인 환경에 대응하기 위해 자바는 상당히 광범위한 아키텍처(Architecture)를 위해 간소화된 프로그래밍 기능을 제공하고 있다.


   자바는 1991년 Sun Microsystems사의 James Gosling, Patrick Naughton, Chris Warth, Ed Frank, Mike Sheridan에 의해 구상된 것입니다. 자바는 맨 처음 “Oak”라고 불리었습니다. 그러다 1995년에 Java라는 현재 명칭으로 변경되었죠. 놀라운 것은 자바의 탄생에 있어 근본적인 자극제는 인터넷이 아니었다는 사실입니다. 근본적인 탄생 동기는 독립적 플랫폼을 지원하는 언어를 만들기 위해서였습니다. 예를 들어, 토스터기, 전자레인지, 리모컨 등과 같은 환경에서 구동되길 원했죠. 문제는 대부분의 컴퓨터 프로그래밍 언어가 특정 목표를 기준으로 컴파일 되도록 설계되었다는 것입니다. 예를 들면, C++와 같은 언어들이 그러했습니다. 


   비록, C++ 프로그램을 통해 어떤 CPU에서건 프로그램을 컴파일 할 수 있었지만, 그렇게 하려면 CPU 안에 C++ 컴파일러를 모두 내장해야 했습니다. 이렇게 되면 또 다른 문제가 발생하죠. C++ 컴파일러는 아주 비쌌고 이를 만들기 위해 엄청난 시간이 소요되었습니다. 그래서 더 나은 해결책을 찾던 도중 제임스 고슬링과 그의 동료들이 휴대용 기기와 같은 다양한 환경의 CPU들에서 동작할 수 있도록 크로스 플랫폼을 지원하는 코드를 만들기로 했습니다. 이러한 노력 덕분에 Java가 탄생할 수 있었던 것이죠.


 

 

C#과 Java는 어떠한 관련성이 있을까?


   자바가 만들어지고 몇 년 후 마이크로소프트 사에서는 C# 언어를 개발하게 됩니다. 

이는 중요한 사건으로 인식되는 데 그 이유는 C#이 Java와 많이 닮았기 때문입니다. 사실, 많은 C#의 기능들은 Java와 유사합니다. 자바와 C# 두 언어는 동일하게 C++ 스타일 구문을 채택하고 광범위한 프로그래밍을 지원하며 같은 오브젝트 모델을 활용하였기 때문이죠. 물론, C#과 Java의 차이점은 존재합니다. 그러나 직관적으로 봤을 땐 두 언어는 유사하다고 볼 수 있습니다. 이 뜻은 독자가 이미 C# 언어를 공부 해서 잘 알고 있다면 자바 또한, 쉽게 습득할 수 있다는 것입니다. 역으로 미래에 C#를 배울 계획이라면, 자바 지식은 도움이 될 겁니다. 


  자바와 C#의 유사성으로 인해 이러한 질문들이 듣게 됩니다. “C#이 Java를 대체하는 언어가 될까요?” 이 질문에 대한 답은 No 입니다. 그 이유는 자바와 C#은 각기 다른 컴퓨팅 환경에 적합하도록 설계되어 있기 때문이죠. 따라서, C++와 Java가 오랫동안 공존하듯 C# 과 Java도 그렇게 될 것입니다.

 

 

인터넷에 기여한 자바


   인터넷의 도움으로 자바는 프로그래밍의 최전선에 자리잡게 되었습니다. 

그리고 역으로 자바 덕분에 인터넷도 지대한 영향을 받았죠. 자세하게 설명하면 자바가 일반적인 웹 프로그래밍을 간단하게 해주었고, 온라인 세상에 있는 컨텐츠를 바꾸는 방법을 applet이라 불리는 것을 통해 네트워크 프로그램의 새로운 종류에 혁신을 제공했습니다. 또한, 자바는 인터넷의 문제인 이식성(혹은 휴대성)과 보안에 영향을 주었습니다. 이에 대해 자세히 살펴보도록 하죠.

 

 

Java Applets


   Applet(이하: 애플릿)은 자바에 적합한 브라우저에 전송 및 자동 실행되도록 설계된 특별한 자바 프로그램입니다. 

자세히 설명하면 애플릿은 사용자와 상호작용 없이 애플릿 그 자체를 다운로드(download)할 수 있죠. 예를 들어 사용자가 애플릿이 포함된 링크(Link)를 클릭하게 되면 애플릿은 자동적으로 다운로드 되고 브라우저에서 자동 실행되게 됩니다.

애플릿은 또한, 작은 프로그램들을 위해 만들어졌습니다. 이 프로그램들은 보통 서버에서 받은 데이터를 표시하고 사용자 입력을 제어하거나 대출금 계산 같은 간단한 기능을 제공하게 되죠. 이러한 간단한 기능들은 서버에서 실행되기 보다 자체 기기 내에서 실행되어야 했습니다. 그래서 궁극적으로 애플릿은 서버에서 클라이언트(Client)로 특정 기능들을 이동시킬 수 있도록 도와주는 것이죠.


   애플릿의 등장으로 인터넷 프로그래밍은 변화하게 되었습니다.

 그 이유는 사이버 공간에서 오브젝트(Obejct: 물체)들을 자유롭게 이동시킬 수 있는 공간을 확장 시켜주었기 때문입니다. 일반적으로 2가지의 방법으로 서버와 클라이언트 간에 오브젝트를 이동시킬 수 있는데 하나는 passive information(수동적 정보, 받은 정적 데이터), 다른 하나는 dynamic(동적), active(활동적) program 입니다. 예를 들어 독자가 이메일을 읽었을 경우 독자는 실제로 패시브 데이터(passive data)를 읽은 것과 동일합니다. 만약에 어떤 프로그램을 다운로드 했다면 그 프로그램이 실행되기 전까지는 패시브 데이터를 받은 것과 동일합니다. 반대로, 애플릿이 동적으로 작동하면 자체적으로 프로그램을 실행할 수 있습니다. 예를 들어 서버에 의해 게시되어 클라이언트 컴퓨터에서 활동하는 프로그램들(active agent program)이죠. 


   Dynamic과 같은 가치 있는 네트워크 가능한 프로그램들은 또한, 심각한 문제를 가지고 있는 데 그 문제는 바로 이식성과 보안 문제입니다. 어떤 프로그램을 다운로드하고 자동적으로 실행된다면 이는 클라이언트 프로그램에 심각한 유해성을 야기할 수 있습니다. 여러분들이 알다시피 자바는 이러한 문제를 아주 훌륭하고 효과적인 방법으로 문제를 해결하였습니다. 그렇다면 이러한 문제 해결방법에 대해 자세히 알아보죠.

 

 

보안(Security)


   독자들도 알다시피 우리는 “일반적인” 프로그램을 위험을 감수하면서 다운로드 합니다. 그 이유는 다운로드한 파일 중에 트로이목마와 같은 바이러스가 포함되어 있을 수 있기 때문이죠. 

이 문제의 핵심은 악의가 있는 코드가 시스템 리소스를 허가 없이 액세스 할 경우 심각한 피해를 초래하기 때문입니다. 예를 들어 바이러스 프로그램이 당신의 컴퓨터에 있는 신용카드 번호, 은행 계좌, 비밀번호와 같은 개인정보를 수집해버리는 것이죠. 그래서 자바의 애플릿은 클라이언트 컴퓨터에서 안전한 다운로드와 실행을 하도록 도와줘야 합니다. 

즉, 애플릿이 실행되는 즉시 악의적인 공격을 막아낼 수 있어야 합니다.


   자바는 자바가 실행되는 환경에서 애플릿을 구속시켜 이러한 문제를 방지하고 있습니다. 

그리고 프로그램이 실행되는 컴퓨터 내에서 허가되지 않은 부분에 접근하는 것 또한 막고 있습니다. (이후 내용에서 이 부분에 대해 자세히 다룰 것입니다). 아무런 해가 없이 애플릿을 다운로드 할 수 있는 것은 자바의 다양한 혁신적 측면 중 하나로 더 이상 보안에 대해 고려하지 않아도 되는 능력입니다.


 

이식성


   이식성은 인터넷 측면에서 가장 중요합니다그 이유는 다양한 종류의 컴퓨터가 있고 다양한 운영체제와 연결해야 하기 때문이죠. 만약 자바프로그램이 인터넷을 통해 어느 컴퓨터와 연결해 가상 환경에서 실행되어야 할 필요가 있습니다. 애플릿을 예로 들면 동일한 애플릿(버전이 달라도)은 반드시 다운로드 가능해야 하고 다양한 CPU 환경에서 실행될 수 있어야 합니다. 다양한 환경을 지원하기 위해 다양한 애플릿 버전을 가지는 것은 실용적인 생각이 아닙니다. ‘같은코드를 사용한다면 반드시 모든 컴퓨터에서 동작해야 합니다. 이는 이식 가능하고 실행할 수 있는 코드의 생성해야 할 필요성을 역설하는 것입니다. 다음 내용에서 보안에 도움이 되고 이식 가능하도록 만들 수 있는 메커니즘에 대해서 알아보도록 하죠.

 

 

자바의 마법 : ByteCode


   앞서 살펴본 보안과 이식성 문제를 해결하기 위해 자바의 해결방법은 자바 컴파일러에 의해 만들어진 산출물을 실행할 수 없도록 만드는 것입니다. 

즉, 이를 바이트 코드(ByteCode)라고 합니다. 바이트코드는 자바 런타임 시스템에서만 실행될 수 있도록 설계된 코드를 말합니다. 이때 자바 런타임 시스템(Java run-time system)은 일명 Java Virtual Machine(JVM)이라 불립니다. 근본적으로 JVM은 바이트코드를 위한 인터프리터로 설계되었습니다. 이는 조금 놀라운 사실인데 그 이유는 많은 모던 프로그래밍 언어들은 성능 제약 때문에 컴파일한 코드를 즉시 실행할 수 있도록 설계했기 때문입니다. 

그러나, 자바 프로그램은 사실 JVM의 도움을 통해 웹 기반 프로그램을 포함한 이런 근본적인 성능 문제를 해결하였습니다. 여기에 그 이유가 나와있습니다. 


  바이트 코드로 작성된 자바 프로그램을 해석해 다양한 환경에서 좀 더 쉽게 구동할 수 있도록 설계하였습니다. 

그 이유는 오직 JVM만이 각 플랫폼에서 구동이 가능할 필요가 있었기 때문이죠. 어떤 시스템에 런타임 패키지가 존재한다면 임의의 자바 프로그램을 실행 할 수 있도록 한것이죠. 여기서 기억할 것은 각기 다른 플랫폼에 존재하는 JVM은 반드시 같은 자바 바이트 코드를 해석할 줄 알아야 합니다. 만약 자바프로그램이 네이티브 코드(Native Code)로 컴파일 되었다면 동일한 프로그램을 인터넷에 연결된 각기 다른 CPU를 지원하기 위해 다른 버전의 프로그램으로 바꾸어줘야 할 것입니다. 물론, 이는 실행할 수 있는 해결책이 아닙니다. 

따라서, 바이트코드를 실행하는 JVM은 진정한 휴대용 프로그램을 만들 수 있는 가장 쉬운 방법인 것입니다.




영어원문 Oracle - java a beginner's guide 

번역,의역 및 작성 : 개발 토끼

검수 : 초코 토끼

오역 및 오타의 지적은 겸손히 받겠습니다




+ Recent posts