2. 자바 언어가 가지는 특징 : 배워본 언어가 없는데 비교를 어떻게 해.
지금까지 내가 접한 입문서의 전반부에 자주 등장하는 내용이다.
프로그래밍 언어가 무엇인지를 시작으로 언어의 발전 과정을 시간의 흐름으로 살펴본다.
그리고 뒤이어 다루는 주제는 그 언어의 특징이다.
처음 자바의 특징을 볼 때 당황했다.
비교 대상이 있어야 특징을 이해할 것 아닌가.
'나중에 다시 보면 이해할 수 있습니다. 지금은 그냥 한 번 쭉 읽어보고 넘어가세요'라고 말하기 시작하는 부분이다.
프로그래밍을 처음 접하면 난해한 내용이지만 시도는 해볼만 하다.
많은 특징들이 있지만 자주 다루는 몇 가지 내용을 선정했다.
1. 이식성이 높은 언어이다.
2. 속도가 느리다.
3. 객체 지향 언어이다.
4. 메모리를 자동으로 관리한다.
5. 오픈소스 라이브러리가 풍부하다.
사람마다 스타일이 다르기 때문에 '이런게 있구나' 넘어가려면 그냥 넘어가 주셔도 좋다.
그래도 한번쯤은 읽어보면 언젠가는 도움이 될거라 생각한다.
1. 이식성이 높은 언어이다.
이식성이 좋다라는건 어디서든 사용 가능하다는 것을 말한다.
예를 들어 다음 이미지는 카카오톡 pc버전을 다운받는 화면의 일부이다.
pc 버전을 다운 받는데 "Windows, WindowsXP 전용, Mac OS X 10.8 이상" 다양한 선택지가 있다.
위에 나열한 "Windows, WindowsXP 전용, Mac OS X 10.8" 이런 것들을 플랫폼 이라고 한다.
이렇게 플랫폼별로 다운받는 설치파일이 다른 이유는 무엇일까?
기차를 탈 때 플랫폼(열차 승강장)이란 말을 들어본적이 있을것이다.
만약 플랫폼이 기차 입구 발판에 비해 너무 높거나 낮으면 기차에 오르는게 쉽지 않을 거다.
사람이니까 어느 정도 불편함은 감수하고 타기는 하겠다만,
컴퓨터 프로그램은 플랫폼 (예를들어 OS 또는 실행환경) 이 달라지면 그에 맞춰 새롭게 만들어줘야 한다.
왜? 컴퓨터는 융통성이 없기 때문이다.
그런데 자바는 이식성이 좋기 때문에 이러한 불편함 없이, 플랫폼에 상관 없이 프로그램을 하나만 작성해도 어느 곳에서든 실행할 수 있다는 것을 의미한다. 어떻게 그런 일이 가능할까?
그 비밀은 자바를 설치하면 같이 설치되는 JVM (Java Virtual Machine) 이라는 자바 가상머신에 있다.
JVM은 자바로 작성 된 프로그램을 실행하는 주체이다.
다시 말해서 우리가 자바 언어로 작성한 프로그램을 실행해주는 녀석이다.
식탁에 10가지 20가지 반찬이 있으면 뭐하나. 먹는 주체인 내가 있어야 그 반찬도 만들어진 의미가 있다.
자바로 프로그램 작성하면 뭐하나. 실행해 줄 주체인 JVM이 있어야 의미가 있다. 그래서 자바를 설치하면 JVM은 자동으로 설치된다.
실제로 그렇지는 않지만 이해를 돕기 위해 만든 이미지를 보자.
보통 프로그램은 플랫폼(운영체제)에 의해 바로 실행되는데,
자바 프로그램은 플랫폼이 아닌 JVM에 의해 실행된다는 특징을 가지고 있다.
자바를 설치하게되면 JVM을 설치하게 되는데, 이 JVM이 플랫폼에 맞춰 만들어져 사용자에게 제공 된다.
위 이미지는 실제로 자바를 다운받는 사이트에서 플랫폼 별로 설치 파일을 제공하는 것을 보여준다.
즉, 어떤 플랫폼에서든 JVM이 설치되어 있기만 하면, 자바로 작성된 프로그램은 어디서든 실행할 수 있다는 것을 의미한다.
이것을 WORA (Write Once Run Anywhere : 워라) 라고 부르기도 한다.
자바가 왜 이식성이 뛰어난지에 대해 알게 되었다.
하나를 얻으면 하나를 잃는 법.
이식성이 뛰어난 대신 발생하는 단점이 있다.
2. 속도가 느리다.
1번에서 봤지만 자바 프로그램은 플랫폼에 의해 바로 실행될 수 없는 구조를 가지고 있다.
어디서든 실행이 가능한 대신 JVM이라는 도구를 거치기 때문에, 플랫폼에 의해 바로 실행되는 프로그램에 비해 속도가 느리다.
예를 들면 이런 상황이다.
한국 사람이 영어권 사람과 대화를 하는데, 영어권 사람이 한국말을 유창하게 한다면 중간 통역 필요 없이 바로바로 대화를 이어갈 수 있다.
하지만 한국어를 1도 모르는 영어권 사람과 대화를 하려면 한국어, 영어 모두 할 줄 아는 중간 통역가가 필요하다.
같은 시간동안 누가 더 많은 얘기를 나눌 수 있을까?
최근 기술적으로 JVM의 성능이 많이 발전하여 플랫폼에 의해 바로 실행되는 프로그램과 속도 차이가 많이 줄었다고는 하지만, 중간에 한번 거치면서 무조건 발생할 수 밖에 없는 비용이 발생한다.
그렇기 때문에 플랫폼에 의해 바로 실행되는 프로그래밍 언어로 작성된 프로그램에 비해 느린편이다.
3. 객체 지향 언어이다.
자바가 언어라는건 알겠는데 객체 지향이라는건 무슨 말인가.
무슨 말인지 잘 모르겠다면 사전을 검색해보자.
객체를 한영사전에서 검색하면 Object 라고 나온다.
오브젝트라고 하면 객체라고 했을 때보다 그 의미 전달이 잘 될것이다.
일상에서 자주 쓰는 말은 아니지만 물건, 물체 등으로 다시 말해 '실존하는 어떠한 것'을 뜻한다.
이 객체라는 것을 보다 잘 이해하기 위해서는 클래스라는 것을 같이 이해해야 한다.
자바에는 클래스라는 개념이 있다.
클래스라는 것은 개념적으로 설계도라고 생각하자.
(구글에서 자동차 설계도를 검색한 결과중 하나이다.)
클래스는 개념적으로 설계도와 같은 것이라고 했다. 그럼 객체는 무엇일까? 설계도를 바탕으로 만든 실체가 바로 객체다.
이 말이 이해가 된다면 다음 말도 이해할 수 있다.
자동차는 객체가 아니다. 클래스다. 하지만 눈 앞에 주차 되어있는 저 자동차는 클래스가 아니다. 객체다.
스마트폰은 클래스지 객체가 아니다. 하지만 손에 쥐고있는 스마트폰은 객체지 클래스가 아니다.
즉, 클래스 라는 것은 '이렇게 생겼을거고, 이건 어떻고 저건 어떻고' 이런 이미지를 떠올릴 수 있는 추상적인 것이다. (설계도를 보면 그게 뭔지 그려지는 것처럼)
그리고 그 설계도를 바탕으로 구현한 결과물, 눈 앞에 보이는, 물리적인 실체로 존재하는 것이 바로 객체다.
그렇기 때문에 클래스는 그 존재 자체로는 어떠한 의미 있는 기능을 할 수 없다.
자동차 설계도만 가지고 서울에서 부산까지 시속 100km 로 고속도로를 달릴 수 없지 않은가?
그 설계도를 가지고 공장에서 실물을 생산해야만 비로소 고속도로를 질주할 수 있다.
다시 말해 클래스는 객체로 만들어져야 프로그램 내에서 의미있는, 본인이 만들어진 목적에 맞는, 기능을 할 수 있다.
마치 자동차가 공장에서 생산 되어야 빠르고 편리하게 이동할 수 있는것처럼.
그래서 우리가 자바로 프로그래밍을 한다면 크게 두가지 일을 한다고 생각하면 된다.
첫번째로 내가 원하는 것이 무엇인지 파악하고 그 목적을 달성할 클래스를 만드는 것.
두번째로 내가 만든 클래스들을 실체화 (객체화)해서 완성된 하나의 프로그램을 만드는 것.
두번째 과정을 몇몇은 조립한다 라고 말하기도 한다.
그도 그럴것이 설계도 한장짜리 자동차를 본적이 있는가?
타이어, 핸들, 앞좌석, 트렁크 등등 각각 설계도가 있고 이를 실체화 한 각 부품들을 조립하여 완성된 자동차를 만든다.
떼려야 뗄 수 없는 클래스와 객체의 관계를 이해했다면 절반 이상은 성공했다.
그렇다면 본래 얘기하려 했던 객체 지향이라는건 무엇을 뜻하는 걸까?
컴퓨터 프로그램을 만들 때 객체를 적극 사용하겠다는 것을 뜻한다.
'객체를 사용하면 뭐가 좋은데?'
객체는 클래스라는 설계도가 실체화된 것이라 했다.
혹시 이런 객체를 만들 때 사용한 설계도를 한번만 쓰고 버리는 사람이 있을까?
그렇지 않다. 설계도만 있으면 동일한 제품을 (클래스만 있으면 동일한 객체를) 계속 만들어낼 수 있다.
정성껏 만든 설계도를 (클래스를) 한번만 쓰고 버리지 않겠다는 것이다.
이것을 다시 사용한다고 해서 재사용성 이라고 한다.
여기까지만 알아도 좋지만 조금만 더 생각해보자.
재사용성을 극대화 하려면 어떡해야 할까?
여러가지 해답이 있겠지만, 여기서는 더 작은 단위로 세분화해서 만드는 것이라 하겠다.
어떤 사람이 만든 클래스를 실체화하면(객체로 만들면) '컴퓨터의 전원을 켠다' 는 기능을 한다고 하자.
컴퓨터의 전원을 켜야할 경우 이 사람이 만든 클래스를 가져다 객체로 만들어 사용하면 된다.
하지만, 이 클래스는 전원을 켜는 대상이 컴퓨터가 아니면 사용할 수 없다는 단점이 있다.
만약 '전원을 켠다' 기능을 하는 클래스를 만들었다면 어땠을까?
컴퓨터, 스마트폰, 냉장고 등 전원을 켜고 싶은 어느 곳에서든 사용할 수 있다.
다시말해 사용 가능한 곳이 많아져 재사용성이 좋아지는 것을 알 수 있다.
객제지향이라 함은 이렇게 기능을 작은 단위로 나누어진 객체들을 조립하여 하나의 완성품을 만드는 패러다임이라 할 수 있다.
자바는 이 패러다임을 지향하는 언어이다.
4. 메모리를 자동으로 관리한다.
메모리는 컴퓨터에서 무엇인가를 기록하여 저장하는 장치이다.
이것을 자동으로 관리해준다는 것은 무슨 의미일까?
의미에 대해 알아보기 전에 컴퓨터라는 기계 자체에 대해 생각해볼 필요가 있다.
결론만 말하자면 컴퓨터는 '시키는 일을' '시키는 것만' '시키는 대로' 정말 잘 하는 기계라는 것이다.
더하라면 더하고, 똑같은 짓 100만번 시켜도 군소리 하나 없이 한다.
그게 아무리 오래 걸리고, 그 결과나 과정이 잘못된 것일지라도.
오류가 생기면 생기는 대로 직진이다.
'어.. 주인님 여기서 더해야 할 것 같은데 왜 빼기를 하셨나요?' 이런거 없다.
누구 말대로 묻지도 따지지도 않고 시키는 대로 한다.
그래서 이 컴퓨터에게 내가 원하는 결과를 얻고자 한다면, 하나부터 열까지 모든걸 알려줘야 한다.
컴퓨터란 기계가 이렇다 라는것을 알았으니 메모리 얘기를 해보자.
사용자가 컴퓨터의 메모리를 사용하기 위해서는 대략 다음과 같은 과정이 필요하다.
1. 사용 가능한 메모리가 있는지 확인 한다.
2. 사용 가능한 메모리가 있다면 메모리를 사용 하겠다고 선언 한다.
3. 메모리를 사용한다.
4. 사용이 끝났으면 더이상 사용하지 않겠다고 알려준다.
더이상 사용하지 않겠다고 알려주지 않으면,
사용자가 더이상 사용하지 않더라도 컴퓨터는 아직 사용 중이라고 생각 한다.
여기서 재앙이 시작된다.
예를들어 '메모리를 다 사용했으니 이제 사용 가능한 메모리로 만들어줘' 라고 하지 않는 것은
식당에 손님이 다 먹고 나갔음에도 그 테이블이 아직 사용중이라고 써놓은 것과 같은 상황이다.
식당 주인은 주인대로 어리둥절하고 기다리는 손님은 손님대로 답답한 상황이다.
그리고 주인 입장에서는 여간 까다로운 일이 아닐수 없다.
주방에서 요리도 해야하고, 손님도 받아야 하고, 홀 청소도 해야하고, 계산도 해야하고
장점이라면 주인 원하는 대로 모든걸 다 통제할 수 있다는 것이고
단점이라면 손님이 많아질수록 홀을 관리하는게 복잡하고 머리아픈 일이란 것이다.
그래서 자바는 알바생을 하나 채용했다.
그 이름 바로 GC (Garbage Collector) 라고 불리는 가비지 컬렉터, 쓰레기 수집가 이다.
이 GC의 주된 역할은, 식당에 비유하면 홀 이곳 저곳을 돌아다니다가 손님이 나간 테이블을 정리해주는 일이다.
즉, 메모리를 돌아다니면서 더이상 사용하지 않는 메모리를 발견하면
'다른 사용자가 사용할 수 있도록 만들어야겠어.' 하는 일을 한다.
이 얼마나 편리한가.
식당 주인 입장에서는 손님이 아무리 몰려와도 이미 손님이 앉은 자리에 또 앉히는 실수라거나
손님이 나가서 새로운 손님을 받아야 하는데, 뒷정리를 못해서 못받는 일이 생기거나 하는 실수를 하지 않을 수 있게 된 것이다.
(첨언을 하자면 이 GC가 변덕쟁이라 필요하다 싶을때만 작동한다.
심지어 사용자가 GC야 청소해줘. 요청해도 GC 판단하에 할 필요 없다 싶으면 작동하지 않는다.)
이렇게 자동으로 관리해주는 GC라는 훌륭한 알바생이 있기 때문에
식당 주인은 요리에만, 개발자는 코딩에만 집중할 수 있다는 장점이 생긴다.
5. 오픈소스 라이브러리가 풍부하다.
라이브러리는 도구이다.
목재로 수납 박스를 만들거나 식탁 혹은 책상을 만든다고 생각해보자.
맨손으로 만든다고 하면 아주 훌륭한 분이지만, 우리는 도구를 사용할 줄 아는 사람이다.
이런 순간 사용하기 위해 준비해둔 공구세트를 가져다 제품을 만들 것이다.
이것 자체가 생활속에서 우리가 라이브러리를 사용하는 예이다.
다른 언어들도 그렇지만, 자바에서도 자주 사용하는 기능들에 대해
라이브러리라는 것으로 가져다 사용할 수 있게 공개한 것들이 굉장히 많다.
특히 자바는 이 라이브러리들을 오픈소스로 공개한 것들이 많이 있다.
이런 상황을 생각해보자.
어떤 A요리사가 정말 기가막힌 맛의, 한 번 맛보면 계속 생각나는 소스를 하나 개발했다고 하자.
요리사는 소스의 비밀을 혼자만 알고 싶을수도 있고, 세상에 모든걸 공개해서 더 나은 소스가 만들어지길 바랄수도 있다.
후자의 경우가 오픈소스에 해당한다. (아니 이건 정말 소스잖아.)
오픈소스로 라이브러리를 공개하면, 사용자 입장에서 상황에 맞게 수정해서 사용할 수 있게 된다.
자바 오픈소스 언어로 후자의 길을 걸어왔기 때문에 잘 만들어진, 레시피가 모두 공개된 라이브러리들이 많이 있다.
이렇게 공개된 것들은 수많은 선배 및 동료 개발자 분들의 노력으로 만들어진 것으로,
내가 그냥 만드는 것보다 성능면에서나 안정성 면 등 다방면에서 우수한 라이브러리들이다.
적극 활용하자.
이 라이브러리들을 잘 활용하면 100만큼 고생할 것을 20만큼 고생하고 높은 품질의 프로그램을 만드는 것이 가능하다.
그 외에도 몇가지 특징들이 있겠지만, 대표적으로 자주 다루는 특징들을 살펴 보았다.
'프로그래밍 언어 > 나 혼자 떠드는 자바' 카테고리의 다른 글
나 혼자 떠드는 자바 : 자바 실행 환경 (자바 설치 방법) (0) | 2021.05.01 |
---|---|
나 혼자 떠드는 자바 : 자료의 형태(data type) : 상수, 변수, 배열, (구조체), 클래스 그리고 사용자 정의 자료형 (0) | 2021.05.01 |
나 혼자 떠드는 자바 : 프로그래밍 언어란 (0) | 2021.05.01 |
나 혼자 떠드는 자바 : 내용구성 (0) | 2021.05.01 |
나 혼자 떠드는 자바 : 시작하며 (0) | 2021.05.01 |