본문 바로가기

Java프로그래밍

객체기반SW설계 1차시: C와 Java 비교

반응형


자동차 vs. 전기자동차




위 사진은 Elon Musk라는 사람이다.

'일란 머스크'라고 읽는다.

남자다.

남아프리카공화국 태생이지만,

미국에 산다. 미국 영주권이나 시민권이 있을 것이다.


이 사람이 한 일 중에 하나가

전기자동차를 대중화시킨 것이다.

'테슬라'라는 회사를 세워서

다소 가격은 비싸지만 실제로 사람들이 구매할 수 있는 전기차를 

생산해 낸 것이다.



기름을 넣고 달리는 자동차와

전기로 달리는 자동차는 확연히 다르다.

이런 차이만큼이라,

서로 다른 것이

C언어와 Java언이다.


C언어: 함수기반으로 프로그래밍

C언어로 프로그래밍 한다는 것은,

함수들을 만들고,

이것들을 레고블럭처럼 조합해서

프로그램을 완성하는 것이다.

예를 들어, 

C언어가 제공하는 printf, scanf, 등등 여러 가지 함수들이 많았다.

결국 C 프로그래밍한다는 것은

이런 함수들을 호출하는 순서와 방법들의

조합이었던 것이다.


Java언어: 객체기반으로 프로그래밍

반면에,

Java 언어는 object기반, 혹은 객체기반 언어이다.

여러 가지 객체들을 만들어 놓고,

이것들을 조합해서 프로그램을 완성하는 것이다.

그러면,

객체란 무엇인가?

쉽게 말해서, 데이터와 그 데이터를 접근할 수 있는 함수들로 이루어진 것을 말한다.

이 객체에 대해서 배우는 것이

Java언어를 배우는 것이니,

지금 당장 와닿지 않더라도 걱정할 필요가 없다.


C언어 프로그램과 운영체제

C언어로 프로그램을 만들면,

빌드 과정 (컴파일 + 링크 과정)을 거쳐서

실행파일로 만든 다음에

사용한다.

예를 들어, 이렇다.

윈도우즈가 깔린 PC에서

Visual Studio 같은 것을 이용해서 프로그램을 만든다고 하자.

C언어 소스코드로 프로그램을 짜고,

빌드하고, 실행파일이 나오면 그걸 수행시킨다.

이 때,

이 실행파일을 다른 운영체제,

예를 들어, Linux, Android, Mac OS X, iOS가 설치된

PC나 기기에 넣고 돌릴 수 있을까?

안 된다.

되게 하려면, 소스코드를 가져다가,

그 PC나 기기에서 빌드를 해서

새로 실행파일을 만들어야 한다.

왜냐하면,

빌드하는 과정에서 '그 운영체제'에만 돌아가도록 만들어진

실행파일이 만들어지기 때문이다.


크로스 컴파일

윈도우즈 PC에서 빌드하면서 리눅스 PC에서 돌아가도록 실행프로그램을

만들 수도 있다. 

그런데, 이 실행프로그램은 윈도우즈 PC에서는

실행이 안 되고.

리눅스 PC에서만 돌아간다. 

이렇게 빌드하는 것을 크로스 컴파일(cross compile)이라고 한다.

여기에서 빌드해서 저리로 넘겨 (cross) 주기 때문이다.


포팅

윈도우즈 PC에서 작성한 C언어 소스파일을

리눅스 PC로 옮겨서 빌드만 다시 해서 실행파일을 만들면,

바로 수행이 가능할까?

결론은 그럴 수도 있고, 아닐 수도 있다.

'아닐 수 있는' 경우는

소스코드를 작성하면서, 

윈도우즈 운영체제만 제공하는 특수한 함수를 사용하는 경우이다.

당연히 리눅스에서는 그런 함수를 제공하지 않으니,

리눅스에서는 빌드과정이 제대로 될리 없다.

그러면 어떻게 해야 하나?

'특수 함수'를 리눅스에서 유사한 기능을 제공하는 함수로

바꿔야 한다. 즉, 소스코드를 수정해서.

이 과정을 포팅 (porting)이라고 한다.

실제로 이 포팅과정을 회사에서는 많이 한다.

같은 윈도우즈 운영체제라 할지라도 버전에 따라서,

예를 들어 윈도우즈 XP, 7, 8, 10 등등,

제공함수가 달라지기 때문에,

이 때마다 소스코드를 수정해서 포팅을 해야 하는 것이다. 


Java프로그램과 운영체제

Java언어로 소스코드를 작성하면,

C언어와 마찬가지로 빌드과정을 거쳐서

실행파일을 만든다.

그런데, 이 실행파일은

윈도우즈, 리눅스, 맥, 어디서든 돌아간다.

원래

Java언어의 설계 목적 중의 하나가

C언어가 운영체제때문에 겪는 문제점을 없애기 위한 것이기 때문이다.

어떻게 이런 마법이 가능한 걸까?

세상에 공짜는 없다.

결론부터 말하자면 가상머신 (Virtual machine) 때문이다.

어느 운영체제이든,

우선 가상머신을 동작시키고,

그 위에서 Java 프로그램을 동작시킨다.

이러면,

Java프로그램 입장에서는

자기가 어느 운영체제 위에 있는지

알 수도, 알 필요도 없어진다.

그래서, 운영체제와 상관없이

한 번 빌드된 Java프로그램은

어떤 컴퓨터든지 가상머신만 있다면

수행될 수 있는 것이다.

그럼,

가상머신은 무엇인가?

쉽게 말하자면, 하나의 프로그램에 불과하다.

다만 이 프로그램은 자기 안에서 다른 프로그램이 수행되도록 한다.




위 그림에서

JVM이라고 표시된 것들이,

Java Virtual Machine (자버 가상머신)이라고,

위에서 설명한 가상머신들이다.


그리고,

참고로

C언어에서는 소스코드를 컴파일해서 나오는 

이진파일들을 오브젝트코드라고 부르는데,

Java언어에서는 바이트코드라고 부른다.


C언어와 비교하여 Java 언어를 설명합니다.





반응형