충격적인 소식이 하나 있다. 사실 환경변수까지 등록하지 않아도 자바 프로그램을 만들 수 있다. 하지만 알고 있기 바라는 생각과 메모장 코딩을 하기 위해 넣은 내용이다.
메모장은 윈도우 + r 키를 눌러 나오는 '실행'창에 notepad 라고 입력해도 나오고 "마우스 우클릭 -> 새로 만들기 -> 텍스트 문서" 를 선택해도 나오고 실행시키는 방법은 다양하다.
어쨌든 메모장(notepad)을 하나 실행시켜보자. 본격적으로 자바 프로그래밍 언어를 사용한 컴퓨터 프로그램을 만들어보자.
자, 그럼 다른 많은 교재에서 프로그래밍 공부의 시작을 알리는 프로그램. 티키신을 화나게 해서는 안된다는 그 프로그램. Hello World 프로그램을 작성해보자.
나같은 경우 처음 자바를 배울때 이 내용을 통째로 외우라고 했다. 지금은 이해하기 어려우니 일단 외우고 넘어가면 나중에 다 이해하게 된다라고. 그 말이 참 싫었지만 당시 나는 아는게 없었으니 외울수밖에 없었지만 이 글을 접하는 분들은 이해를 시도할 기회를 드리고 싶은 마음에 정리해 보았다.
이 Hello World 프로그램 하나만 빠싹하게 이해한다면 적어도 자바 전체의 1/3 정도는 이해한게 아닌가 조심스레 생각해본다.
내용이 너무 길고 지루하게 느껴진다면 그 시절의 나처럼 눈에 익혀두고 그냥 넘어가도 좋다. 분명히 하기위해 이 글을 보고계신 어떤 분들에게 다시 한 번 말씀 드린다. "백문이 불여일타. 여러번 쓰다보면 익숙해지고 자연스레 알게 되겠지. 이런게 있구나 하고 넘어가자." 한다면 그냥 넘어가셔도 좋습니다.
본격적으로 소스를 분석하기에 앞서 미리 알아두면 이해에 도움이 될 몇 가지를 살펴보자.
1. 참조 연산자 . (쩜, 닷) 참조 연산자는 마침표 . 를 사용한다. 예를들어 국회의사당의 주소지는 '서울특별시 영등포구 여의도동' 에 위치하고 있다. 이것을 참조 연산자를 사용해서 표현하면 다음과 같다. 서울특별시.영등포구.여의도동 참조 연산자라는게 어떤건지 확 감이 올거라 생각한다. 다음과 같은 폴더 구조를 가지고 있을 경우 참조 연산자를 사용해서 표현할 수 있다.
test.xxxelppa.package.subPackage
이 내용에 덧붙여 한가지 더 얘기를 하자면, 위의 예시에서 폴더 이름을 package 라고 했다. 이제부터 흔히 보던 폴더 개념을 package라고 생각해주면 좋겠다.
2. 문장의 마침표 ; (세미콜론) 컴퓨터는 융통성 없는 시키는것만 시키는대로 잘 하는 기계라고 했다. 문장도 어디서 끝나는지 정확하게 명시해줘야 원하는 결과를 받아볼 수 있다. 이 때 사용하는게 세미콜론 ; 이다. 이 세미콜론을 만나면 하나의 문장이 종료 되었음으로 인식한다.
3. 모든것을 뜻하는 * *는 asterisk (애스터리스크, 아스타리스크, 아스타, 스타) 라고 부르는 것으로 '하위에 포함된 모든것'을 의미한다. 위의 첨부 이미지와 같은 경우를 보자. 만약 subPackage 라는 폴더 안에있는 모든 것을 사용하고 싶다면 다음과 같이 쓸 수 있다. test.xxxelppa.package.subPackage.*
이제 정말로 예시로 작성한 프로그램을 한줄씩 살펴보자.
728x90
import java.lang.*;
사람이 사용하는 언어에도 정해진 규칙이 있고, 단어마다 고유의 정의된 의미와 뜻이 있는 것처럼
프로그래밍 언어에도 미리 약속되어있는 예약어 라는 것이 있다.
사람이 쓰는 말에서, 문장은 주어부와 술어부가 있어야 해.
문장에 주어는 꼭 있어야해.
한국어에 '과일'이라는 단어는 '나무를 가꾸어 얻는, 사람이 먹을 수 있는 열매' 를 뜻해.
프로그래밍 언어도 언어인 이상 똑같거나 비슷한 내용과 구조를 가지고 있다.
'이런 예약어를 만나면 그 다음에 오는 내용은 약속한대로 처리 해줘' 라고 정의 해둔 것이다.
이 import 도 미리 약속된 예약어 중 하나로, "다음에 오는 내용을 자유롭게 사용할 수 있도록 이 파일에 포함시켜줘" 라는 뜻이다.
다음에 오는 내용을 보면 java.lang.*; 라고 되어있다.
여기서 아는게 하나 등장했다. 바로 참조연산자 . 이다. 이제 우리는 저 문장을 다음과 같이 멋있게 이해할 수 있다.
뭔진 모르겠지만 java 폴더 안에 lang이라는 폴더가 있는데, 그 안에 있는 모든 것을 사용하기 위해 추가했구나.
그럼 이 java.lang이 뭘까?
자바를 설치할 때 마지막 과정을 기억하는 사람이 있을지 모르겠다.
설치 프로그램을 실행시켜 설치가 완료된 마지막 화면은 다음과 같았다.
여기서 Next Steps 를 클릭하면 브라우저가 하나 뜨면서 API 문서를 연결 해줬었다.
링크에 들어가서 다음 과정을 따라서 설치해보자. 사이트에 접속후 스크롤을 맨 아래로 내리면 다음과 같이 "Java for Developer" 라는 링크가 있다. 이걸 선택해서 들어가자.
그럼 다음과 같은 화면이 나타난다.
여기서도 스크롤을 맨 아래로 내려보면 다음과 같은 링크가 보일것이다.
Java Archive의 오른쪽 DOWNLOAD 버튼을 클릭하면, 원하는 버전의 자바를 선택해서 다운받을 수 있는 화면으로 이동한다.
그럼 여기서 Java SE 8을 선택하자.
Java를 설치하러 왔더니 SE라는 모르는게 나왔다. SE는 Standard Edition, 표준 에디션의 줄임말로 Java에는 SE 이외에도 몇가지 제품군이 있다.
1. Java SE Java Standard Edition 으로 가장 기본이 되는 에디션 제품이다.
2. Java EE Java Enterprise Edition 으로 기업용 프로그램을 만들때 최적의 환경을 제공하는 제품이다.
3. Java ME Java Micro Edition 으로 가전제품 들 모바일 기기에 사용할 프로그램을 만들때 최적의 환경을 제공하는 제품이다.
우리는 여기서 SE를 설치할 것이다.
클릭해서 들어가보면 크게 두가지 분류를 확인해볼 수 있다. 1. JDK (Java SE Development Kit, 자바 개발 도구) 2. JRE (Java SE Runtime Ecvironment, 자바 실행 환경) 만약 자바로 만들어진 프로그램을 실행만 할거라면 JRE 즉, 자바 실행 환경만 받아 설치하면 된다. 그런데 우리는 개발을 할 것이기 때문에 개발자 도구인 JDK를 받을 것이다. JRE는 JDK내에 포함되어 같이 설치 되기 때문에 개발하는 입장에서는 JDK만 설치하면 된다.
그래서 다운 받으려고 했더니 또 두가지로 나뉜다. (윈도우 플랫폼에서 개발할 예정이기 때문에 윈도우만 예로 들었다.) 1. Window X86 : 32비트 운영체제일 경우 선택 2. Window X64 : 64비트 운영체제일 경우 선택
32비트는 뭐고 64비트가 무엇인지 몰라도 괜찮지만, 모르고 넘어가면 찜찜하니까 설명을 남긴다.
컴퓨터를 아예 모르고 자바를 시작한 사람들을 위해 비트가 무엇인지 간략하게 소개를 하겠다. 한화(KRW)의 가장 작은 단위가 1원 2원 하는 원 이라면, 컴퓨터는 비트가 메모리 크기를 나타내는 가장 작은 단위이다. 메모리 저장공간의 크기를 나타내는 비트에는 무엇인가를 저장할 수 있다. 컴퓨터는 1비트의 메모리에 1 또는 0의 두 종류 중 하나의 값을 저장할 수 있다. 이것을 켜진 상태(1)와 꺼진 상태(0) 또는 참(1)과 거짓(0) 이라고도 표현한다.
우리는 보통 10진수를 사용한다. 10진수는 0부터 9까지 열가지 숫자를 사용해서 표현한다. 그렇기 때문에 0, 1, 2, ... , 8, 9 까지 세고난 다음엔 자리 올림을 통해 9보다 1이 큰 수를 10 이라고 정의하고 있다. 컴퓨터는 2진수 숫자 체계를 사용한다. 그렇기 때문에 0과 1만을 가지고 숫자를 표현한다. 2진수로 10진수의 숫자를 센다고 하면 다음과 같다.
10진수
0
1
2
3
4
5
6
7
8
2진수
0
1
10
11
100
101
110
111
1000
2진수는 0, 1 다음에 자리올림이 발생한다는 특징이 있다. 만약에 2비트의 공간이 있다고 하면, 이 메모리에는 몇가지 종류의 데이터가 들어갈 수 있을까? 잘 모르겠을때는 단순하게 나열해보자. 2비트의 메모리 공간에 담을 수 있는 데이터의 종류 : 00, 01, 10, 11 이렇게 네가지 종류의 데이터를 담을 수 있다. 3비트일때는 어떨까? 3비트의 메모리 공간에 담을 수 있는 데이터의 종류 : 000, 001, 010, 011, 100, 101, 110, 111 이렇게 여덟가지 종류의 데이터를 담을 수 있다. 이를 공식화 하면 n비트의 메모리에는 2^n 종류의 데이터를 담을 수 있다.
컴퓨터는 n비트의 메모리에 2^n 개의 데이터를 담을 수 있다는것 까지 알았다.
운영체제의 비트수에 대해 얘기하다 여기까지 왔는데, 32비트 운영체제는 한번에 2^32개의 데이터를 처리할 수 있음을 뜻한다. 64비트 운영체제는 한번에 2^64개의 데이터를 처리할 수 있음을 뜻한다.
계산해보면 알겠지만 어마어마한 숫자다. 즉, 설치한 운영체제가 한번에 처리하는 데이터의 크기에 따라 맞는 프로그램을 설치하도록 정보를 제공하고 있는 것이다.
비트에 대한 마지막 이야기로 메모리 크기 단위에 대해 소개하려 한다.
백원이 열개면 천원이라고 하는 것처럼 (뭐, 10백원 이라고 해도 천원이지만 보통 그렇게 안쓰니까)
4비트(bit) 는 1니블(nibble) 8비트(bit) 는 1바이트(byte) 1,024바이트(byte) 는 1킬로바이트(KB) 1,024킬로바이트(KB) 는 1메가바이트(MB) 1,024메가바이트(MB) 는 1기가바이트(GB)
이런식으로 단위가 형성되어 있다. (1,024 라는 숫자가 %5Ccombi%20%5E%7B%2010%20%7D%7B%202%20%7D%20인걸 기억한다면 보다 쉽게 접근할 수 있다.)
비트에 대한 소개는 이쯤에서 마치겠다.
728x90
자신이 몇비트의 운영체제가 설치되어 있는지 확인하는 방법은 키보드의 윈도우키 + pause/break 를 같이 누르면 다음과 같은 화면에서 확인할 수 있다. 참고로 pause/break 키는 보통 키보드의 우측 상단에 위치해 있다.
만약 이 버튼을 찾지 못하겠다면 다음 이미지와 같이 '내 컴퓨터' 에서 마우스 우클릭 후 '속성'을 선택하면 동일한 화면에 진입할 수 있다.
다시 다운로드 화면에서, 사용 약관에 동의하고 다운 받을 파일을 선택하면 오라클 계정 로그인 화면이 나온다.
로그인에 성공하면 설치 파일을 다운받을 수 있다. (계정이 없다면 만들어야 한다.) 자, 다운 받았다고 생각하고 이제 이 설치 받은 파일을 실행시켜보자.
설치는 계속 Next를 눌러주면 된다.
위의 과정에서 설치 경로를 바꿀 수 있는데, 가능하면 바꾸지 말고 설치하자.
자세히 보면 차이를 알겠지만, 이번엔 JRE를 설치할 경로를 물어보고 있다. 이것 역시 되도록이면 수정하지 말고 설치를 하도록 하자.
설치가 완료되면 위와 같은 화면이 나오는데, Next Step 버튼을 클릭하면 설명에서 나와있는 것처럼 튜토리얼과 API 문서를 열어볼 수 있다고 한다.
명령 프롬프트를 하나 열어보자. 명령 프롬프트는 윈도우 키를 누르고 cmd (command) 를 입력하면 나오는 프로그램이다.
이렇게 열거나 혹은 윈도우키 + r 을 누르면 '실행' 이라는 창이 하나 뜬다. 거기에 cmd 라고 기입해도 좋다.
그러면 다음과 같은 검정 화면이 하나 뜬다.
이 화면에서 java -version 이라고 입력해보자.
위와 같이 설치한 자바 버전이 나오면 설치는 잘 된 것이다. 그렇다면 다음 명령어도 입력해보자. javac 어떤 결과가 나오는가?
javac 라는게 생소할거다. javac에서 c는 compile 을 의미한다. compile 이란 java로 작성된 프로그램을 컴퓨터가 이해할 수 있는 언어로 번역해주라는 명령어이다.
분명히 자바를 설치 했는데, 왜 저 명령을 알 수 없다고 하지? 그건 환경변수 문제이다. 환경변수에 대해 이곳을 참고해주면 좋겠다.
간략하게 언급하자면, 운영체제에게 '내가 이런 명령어를 쓰면 어디서든 쓸 수 있게 해줘!' 하고 등록하는 곳이 환경변수이다. javac 라는 명령에 대해 이러한 설정이 되어있지 않기 때문에 컴퓨터가 모른다고 하는거다. javac가 어디 있는지부터 확인해보자.
javac는 처음 자바를 설치할 때 경로를 따로 수정하지 않았다면, 보통 다음과 같은 곳에 존재한다. (혹시 해당 위치에 없다면 javac를 탐색기에서 검색 하거나, 설치할 때 경로를 기억해뒀다면 쉽게 찾을 수 있다.)
c:\Program Files\Java 경로에 가면 내가 받은 jdk와 jre가 설치되어 있는것을 볼 수 있다. 그리고 설치한 jdk의 버전 폴더에 들어간 다음 bin 이라는 폴더에 들어가보면 java를 설치하면 사용할 수 있는 명령들이 나열되어 있다. 여기에 javac 라는 명령이 있는것을 알 수 있다.
우리는 여기있는 명령을 사용하기 위해서 환경변수라는 곳에 이 경로를 등록해줄 것이다. 환경변수를 등록하는 곳은 몇비트의 운영체제가 설치 되었는지 확인했던 화면에 있다. 우선 윈도우7에서의 등록하는 화면을 보고나서 윈도우10에서의 화면이 어떻게 생겼는지 살펴보겠다.
좌측에 '고급 시스템 설정' 을 클릭하면 '시스템 속성' 창이 하나 뜬다. 여기서 '환경변수' 버틀을 클릭하면 환경변수를 등록할 수 있는 화면이 나타난다.
위쪽의 환경변수는 현재 접속중인 계정에 대해서만 등록을 하는 부분이고 아래쪽은 모든 사용자 계정에 대해 사용할 수 있도록 등록해주는 부분이다.
하나의 컴퓨터에 여러 사용자 계정을 등록해서 사용한다면 모르겠지만, 그렇지 않다면 (혹은 그렇다 하더라도) 시스템 변수 쪽에 추가를 해주도록 하다. '새로 만들기'를 선택하자.
우선 JAVA_HOME 을 등록해주자. 이 경로는 jdk 버전이 써진 폴더 경로 까지만 넣어주자. JAVA_HOME 을 따로 등록하는 이유는 java를 사용하는 다른 프로그램에서 JAVA_HOME 이라는 이름의 환경 변수를 참조하는 경우가 있기 때문이다. 그냥 바로 PATH에 등록해도 상관 없지만, 음.. 관행이라 생각하고 JAVA_HOME을 넣어주자. (백슬러시 \ 를 주의해서 넣어주자)
등록하고나면 시스템 변수 쪽에 PATH 라는 이미 등록되어있는 항목이 있다. 이 내용을 수정해줘야 한다.
PATH 를 편집하면 위와같은 화면이 나온다. 이때 정말 주의애햐 할 것은, 철자 하나라도 오탈자가 생기면 안된다. 커서를 맨 뒤로 이동시키고 ;%JAVA_HOME%\bin 을 정확하게 입력하자. 맨 앞의 세미콜론 (;) 은 앞서 등록한 내용이 거기까지임을 알려주는 것이다. 그리고 %JAVA_HOME%은 환경변수에 방금 등록한 JAVA_HOME의 경로를 그대로 가지고 온 것이다. 이 경로에 맨 뒤에 백슬러시 (\)를 넣지 않았으므로 \bin 이라고 해서 C:\Program Files\Java\jdk1.8.0_181\bin 이라는 경로를 등록해준게 된다.
윈도우10의 경우 다음과 같이 생겼다.
새로만들기를 통해 기입한 내용은 다음과 같다. %JAVA_HOME%\bin 혹시 이 화면이 좀 더 복잡하게 느껴진다면, 텍스트 편집 버튼을 클릭해서 윈도우7 에서처럼 편집할 수 있으니 참고 바란다. (JAVA_HOME 을 등록하는 부분은 윈도우7 과 동일하므로 생략했다.)
다음은 '텍스트 편집' 버튼을 눌렀을 때 뜨는 창의 모습이다.
윈도우7에서와 동일한 규칙으로 값을 입력하면 된다.
여기까지 성공했으면 아까 알 수 없다고 했던 javac 를 명령 프롬프트에 다시 기입해보자. ** 환경변수를 수정했으면 명령프롬프트를 끄고 다시 실행해야 적용 된다.
여기까지 잘 적용 했다면, 아까와는 다르게 뭔가 주루룩 나왔다. 잘 보면 javac 라는 명령어를 어떻게 사용하는지에 대한 설명 (usage) 이 나온 것이다.
그러면 이제 정말 본격적으로 자바 소스를 작성할 준비가 됐다. 다음부터는 본격적으로 소스를 작성해 보겠다.
3. 자료의 형태(data type) : 상수, 변수, 배열, (구조체), 클래스 그리고 사용자 정의 자료형.
개념적인 부분을 중심으로 설명을 할 것이기 때문에 특정 언어에 종속된 소스 코드 작성을 지양하려 한다. 그렇지만 필요할 경우 pseudocode 라고 하는 의사어 코드를 사용하려 한다. 의사어 코드는 일반적으로 알고리즘을 어떻게 구현할지 등을 전달 할 목적으로 일반적인 언어를 사용해 모델링 하는데 쓰인다. 여기서는 알고리즘이 아닌 내용 전달을 위한 용도로 사용할 예정이다. 의사어 코드가 사람마다 문법이 달라 보통 서두에 약속을 하는데, 그럴 필요 없을 정도의 수준으로 작성할 예정이다.
1. 상수 (constant, literal)
상수를 사전에 찾아보면 '변하지 않고 항상 같은 값을 가지는 수' 를 뜻한다. 그래서 보통 1, 2, 3 과 같은 숫자를 생각할 수 있지만 프로그래밍에서는 보통 다음과 같이 얘기한다. '변하지 않는 수'
이렇게 얘기하면 '에이 그게 그거잖아' 할 수 있지만 차이가 있다. 위에서 말한 숫자들은 모두 상수라고 할 수 있겠지만, 컴퓨터에서 말하는 상수는 1, 2, 3 이외에도 존재하기 때문이다.
마지막으로 타이틀 옆에 constant와 literal 이라고 적었다. 안타깝게도 본 글의 목적에 벗어나는 내용이다.
2. 변수 (variable)
상수와 반대되는 개념으로 변수가 있다. 사전을 찾아보면 '계속 변하는 값이면서, 그 값을 저장하는 공간' 이라 정의하고 있다. 사견을 더하면 '계속 변하는 값' 이라기보다 '변할 수 있는 값' 이라고 하고 싶다.
예를 들어 수학 문제를 보면 다음과 같은것을 쉽게 볼 수 있다.
여기서 우리는 이 x를 변수라고 부른다. 위 문제에서 부등식의 참 거짓 여부를 떠나 우리는 x에 정수인 어떤 값이든 넣어볼 수 있다. 일반적으로 수학에서 보던 변수와 프로그래밍에서의 변수는 매우 흡사하다.
이런 변수를 다른 관점에서 한 번 살펴보려 한다. 바로 크기의 관점이다. 수학에서 변수의 범위를 한정하는 (위의 예시에서 정수) 것과 비슷한것 같지만 조금 다르다.
일상의 예를 들어 체육 활동과 관련된 교구들을 정리한다고 생각하자. 교구들에는 탁구공, 야구공, 축구공, 허들, 철봉 등 다양한 종류가 있다. 모두 한 곳에 몰아 넣어 보관할 수 있지만, 그랬다가는 필요할 때 한참을 찾아야 할지 모른다. 그래서 보통 스포츠 종목에 따라 분류하거나 도구의 크기에 따라 분류해서 보관한다.
자료형도 종류와 크기에 따라 서로 다른 공간에 나누어 담을 수 있도록 해두었다. 정수는 정수끼리, 실수는 실수끼리. 정수 안에서도 작은 숫자를 담는 공간과 큰 숫자를 담는 공간. 자바에서의 기본 자료형을 정리하면 다음과 같다.
종류
타입
크기
byte
정수
8 bit (1 byte)
short
16 bit (2 byte)
int
32 bit (4 byte)
long
64 bit (8 byte)
float
실수
32 bit (4 byte)
double
64 bit (8 byte)
char
문자
16 bit (2 byte)
boolean
논리
1 bit
정수 타입만 봐도 벌써 크기에 따라 네가지 종류가 있다. 같은 타입에도 크기에 따라 여러 종류가 있는지 이해하기 위해 잠시 체육관 상황으로 가보자.
탁구공과 축구공을 상자에 담아 보관하려 한다. 이때 규칙이 하나 있다. 하나의 상자에는 하나의 공만 담아 보관해야 한다. 축구공이 들어갈만한 크기의 상자에 탁구공을 하나 넣었다고 하자. 장점이라면 탁구공의 형태가 유지된다. 단점이라면 탁구공이 상자에 비해 너무 작아 공간을 낭비한다.
그럼 탁구공이 들어갈만한 크기의 상자에 축구공을 하나 넣었다고 하자. 장점..은 모르겠고 들어갔을지도 의문이다. 만약 넣었다고 하자. 탁구공 상자를 보여주며 '이곳에 축구공을 넣었어' 라고 하면 그 안에 들어간 축구공이 온전할거라 생각할 수 있을까? 바람을 뺐든 조각을 내서 넣었든 (그래도 들어갔을지 모르겠지만) 온전한 형태의 축구공을 상상할 수 없다. (뭐.. 공간을 절약 했다고 할 수 있을지도..)
같은 공이어도 그 크기에 따라 어떤 상자에 담아야 공간 낭비를 줄이고 보관할 수 있다. 변수도 동일하게 생각하자. 4byte 크기의 정수를 short 타입의 변수에 담으면 어떻게 될까? 담겼을지 모르겠지만 담겼다고 한들 값이 망가졌을지도 모른다.
반대의 상황으로 2byte 크기의 정수를 long 타입의 변수에 담았다고 하자. 잘 담기야 했겠지만 공간 낭비다.
자바에 byte나 short 변수가 있지만 일반적으로 1byte, 2byte 크기의 변수를 저장할 때에도 int 타입의 변수를 사용한다. 그 이유는 JVM이 메모리 스택을 쌓을 때 4byte 단위로 저장하기 때문이다. byte나 short와 같은 1byte, 2byte 사이즈의 자료형 변수들도 메모리에 저장할 때는 내부 변환에 의해 4byte 크기에 넣게 된다.
1byte면 8비트로 최상위 비트를 부호 비트로 사용한다고 했을 때, 양수 최대값은 2의 7제곱 빼기 1 (0을 포함하기 때문) 이다. 즉, 127이란 말인데 4byte인 경우 32비트로 동일 조건으로 계산해보면 약 21억의 숫자를 저장할 수 있는 공간에 127을 넣는다니. 심지어는 내부 변환으로 인해 더 느리다.
그럼 왜 이런 자료형을 만들었을까? 하지만 이런 경우는 변수가 단독으로 사용되었을 때 얘기다. 이건 또 무슨 소리.
결론부터 얘기하면 배열로 가면 얘기가 달라진다. 지역변수를 선언하게 되면 메모리의 stack영역에 할당 된다. 이 stack 영역은 4byte 단위로 저장되기 때문에 byte, short 타입이어도 1byte, 2byte 쪼개서 관리하지 않고 4byte 크기로 잘라 사용한다. 그래서 내부에서 두 번 일하지 않도록 정수는 int 타입을 사용하는게 좋다.
하지만 배열같은 경우 메모리의 heap 영역에 할당 되고 stack 영역에는 주소(reference)가 저장 된다. 그래서 byte 변수 10개를 선언하면 40byte 를 할당하고, 길이 10인 byte배열을 선언하면 10byte + 배열 오버헤드 만큼 할당한다.
잘 전달 되었는지 모르겠지만, 결론은 이렇다. 배열이나 클래스의 인스턴스로 사용하면 변수 타입 사이즈에 맞게 메모리를 할당하고 지역변수로 단독 사용을 할 경우 byte, short, int 모두 4byte 만큼 메모리를 할당한다. 그러니 두번 일 시키지 말고 정수는 int를 쓰자.
3. 배열 (array)
1. 일정한 차례나 간격에 따라 벌여 놓음. ex> 배열 순서
2. 컴퓨터 동일한 성격의 데이터를 관리하기 쉽도록 하나로 묶는 일. ex> 배열 변수를 선언하다.
이번에 우리는 2번 뜻을 알아볼 것이다. 동일한 성격의 데이터라는 것이 무엇이며, 이것을 관리하기 쉽도록 묶었다는 것을 무엇일까?
문제는 이게 왜 필요하냐는 거다. 개념적으로 알아보자.
10개의 정수를 구분해서 기억해야 한다. 그래서 변수 10개를 선언하고 각 변수에 다음과 같이 값을 할당 했다.
int variable_1 = 100; int variable_2 = 200; int variable_3 = 300; ... int variable_10 = 1000;
지금은 10개의 정수만 사용하기 때문에 복사 붙여넣기 몇 번으로 작성할 수 있다. 만약 기억해야 하는 정수가 100개라면 어떨까? 변수를 정수1 부터 정수100 까지 만들고 하나씩 값을 할당한다고 상상해보자. 열심히 복사하면 된다 하겠지만 관리할 수 있을까? 소스 길이도 엄청 길어지고 관리도 힘들고 또 n번째 정수가 수정되어야 한다면.. 재앙이다. 그래서 배열이 생겼다.
컴퓨터에서 배열이 이렇게 생기진 않았지만, 길이 n의 배열을 가시화 할 때 다음과 같이 표현 한다.
위의 숫자는 배열의 순서를 나타내는 숫자로 보통 '인덱스'라고 하며 0부터 (제로 베이스) 센다.
정수 10개를 배열에 담는다고 하면 다음과 같이 하면 된다.
int arrVariable[] = 길이 10의 int 배열
위와 같이 선언했을 때 다음과 같은 이미지를 떠올리면 된다.
100개가 필요하면 길이 10이 아닌 100인 int 배열을 선언하면 된다. 지금은 이렇게 묶음으로 관리하는게 얼마나 좋은지 와닿지 않을 수 있다. 하지만 반복문을 만나고 알고리즘 공부를 시작하면 배열 없는 세상은 상상할 수 없을거다.
적당한 예시가 떠오르지 않아 이정도밖에 전달하지 못하고 있지만 추후에 처음 보는 사람도 쉽게 이해할만한 예시가 떠오르면 내용을 추가하겠다.
4. 구조체 (struct)
사실 구조체를 언급하는건 반칙이다. 자바에는 구조체가 없기 때문이다. 그럼에도 불구하고 왜 굳이 구조체를 넣었을까? 클래스라는 개념으로 가는 징검다리라고 생각했기 때문이다.
구조체는 C언어에 있는 개념이다. 앞서 배열에 대해 알아보았을 때, 동일한 성격의 데이터를(자료형) 관리하기 쉽도록 묶은 것이라고 했다. 사람들은 동일한 성격의 데이터만 묶은게 불만이었나보다. 동일하지 않은 성격을 가진 데이터들도 하나로 묶어 관리하고 싶었나본데, 그게 바로 구조체이다.
예를 들면 학교에서 학생들의 성적을 관리한다고 하자. 5과목의 점수를 score 라는 이름의 배열을 만들어 관리한다고 하면 다음과 같다. 학생1의 점수 score_1 [90, 80, 95, 80, 90] 학생2의 점수 score_2 [95, 85, 80, 90, 95] 학생3의 점수 score_3 [93, 82, 95, 80, 85]
score 라는 이름의 배열을 사용해서 훌륭하게 점수를 관리할 수 있게 되었는데, 혹시 공통된 부분이 있지 않은가? 언어를 만든 사람들을 포함해서 프로그램을 만드는 사람들은 보통 의미없이 중복해서 반복하는걸 싫어한다. 그래서 다음과 같이 묶으면 어떨까? 생각했다.
'학생' 이라는 구조체를 그림으로 나타내본 것이다. 학생들이 갖는 공통된 속성을 구조체라는 덩어리로 묶어 가지고 있다가 새로운 학생이 생기면 저 구조만 복사해다가 그 학생에 맞는 정보로 채워주면 된다.
구조체의 장점은 배열과 달리 서로 다른 성격의 데이터들도 묶었다는 것이다.
** 첨언을 하자면 C언에어는 클래스 개념이 없다.
그래서 그런건 아니지만, 구조체도 자바에서의 클래스 처럼 어디선가 가져다가 사용을 해야한다. 다시 말해서 선언만 가지고는 쓸모가 없다.
자바에서 클래스가 의미를 갖기 위해 객체화 (실체화) 한다고 말했었다. 이와 같이 구조체 역시 프로그램 내에서 정의된 구조체를 가져다 써야 의미를 가질 수 있다.
더 중요한 얘기가 있는데, 그건 클래스 설명 말미에 추가하겠다.
5. 클래스 (class)
앞서 살펴본 구조체의 업그레이드 버전(?)이 바로 클래스이다. 즉, 구조체를 포함하여 더 큰 개념이 자바에서 클래스라고 할 수 있다. 클래스에 포함되는 내용은 크게 두가지로 구분할 수 있다. 첫번째가 속성, 두번째가 행위이다.
앞서 학생을 예시로 들었으니 그 내용을 활용하여 알아보자.
첫번째로 속성에 대해 알아보자. 보통 명사로 표현할 수 있는 것들을 속성이라고 할 수 있다. 구조체에서 작성한 이름과 점수라는 것은 그 학생이 갖는 속성이다. 조금 더 추가하자면 나이, 성별, 취미, 특기 등 이러한 것을 속성으로 가질 수 있다.
두번째로 행위에 대해 알아보자. 보통 동사로 표현할 수 있는 것들을 행위라고 할 수 있다. 학생이 할 수 있는 행위에는 무엇이 있을까? 등교하다. 하교하다. 점심먹다. 등 정말 많이 있다.
클래스는 이것을 하나로 묶을 수 있다. 얼마나 매력적인가. 속성과 행위 모두를 반드시 포함해야할 필요는 없다. 선택적으로 필요한 내용만 추가하면 된다.
지금까지 말한 내용을 바탕으로 학생 클래스를 만들면 다음과 같이 그려볼 수 있다.
자바에서 속성에 해당하는 내용을 보통 멤버 필드 라고 하고, 행위를 멤버 메소드 라고 한다. 혹시 기억할지 모르겠지만, 클래스는 개념적으로 설계도라고 할 수 있다고 했다. 위에 그림으로 표현한 '학생'이라는 클래스를 보면 다음과 같은 생각을 할 수 있다.
학생은 이름, 나이, 성별, 취미, 특기, 점수를 가지고 있고 등교하다, 하교하다, 점심먹다를 할 수 있구나. 이 사실을 바탕으로 이 클래스는 무엇을 하는 것인지 또 이것을 가지고 내가 어떤 행위를 할 수 있는지 머릿속으로 그려볼 수 있다. 자료의 형태를 내 마음대로 구성할 수 있다니. 매력적이지 않은가.
자, 그러면 여기서 가장 중요한 얘기 하나가 남았다. 지금까지 다양한 종류의 자료형을 살펴봤다. 그 중에서 정수 타입의 자료형 int를 떠올려 보자. 4byte 크기의 정수값을 갖는 자료형이라는 것을 알 수 있다.
앞서 살펴본 학생 클래스도 똑같이 대입해보자. 멤버 필드로 이름, 나이, 성별, 취미, 특기, 점수를 가지며 등교하다, 하교하다, 점심먹다의 행위(= 기능)를 할 수 있는 자료형이라는 것을 알 수 있다.
하고싶은 얘기는 클래스도 자료형이다. 그것도 사용자가 정의한 자료형. 나중에 공부를 하다보면 본질이 무엇인지 혼란스러울 때가 올지 모르겠다. 그럴때 이것만은 잊지 말자.
1. 클래스도 자료형이고 사용자가 정의했을 뿐이다. 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 : 워라) 라고 부르기도 한다.
자바가 왜 이식성이 뛰어난지에 대해 알게 되었다. 하나를 얻으면 하나를 잃는 법. 이식성이 뛰어난 대신 발생하는 단점이 있다.
728x90
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만큼 고생하고 높은 품질의 프로그램을 만드는 것이 가능하다.
이제 시작인데 졸음이 몰려오는 기분이다. 언어가 언제부터 왜 생겨났는지 그 배경을 시작으로 어떻게 발전해 왔는지에 대해 아는것은 중요하다. 하지만 이런 내용들에 대해선 지금은 다 각설하고 하나는 기억하고 넘어가자.
자바는 1995년 썬 마이크로 시스템즈에서 개발한 프로그래밍 언어이고, 창시자는 제임스 고슬링(James Arthur Gosling)이다.
내용을 통째로 생략했지만, 누가 언제 어디서 만들었는지 정도는 알아야 하지 않을까?
본격적으로 프로그래밍 언어가 무엇인지 생각해보자. 단어에서 알 수 있는 사실은 프로그래밍 언어도 하나의 언어 라는 것이다. 이 사실을 잊지 말자. 언어는 다음과 같이 정의 되어있다.
"생각, 느낌 따위를 나타내거나 전달하는 데에 쓰는 음성, 문자 따위의 수단. 또는 그 음성이나 문자 따위의 사회 관습적인 체계."
즉, 프로그래밍 언어는 컴퓨터에게 나의 생각, 느낌을 전달하는 하나의 체계다.
728x90
체계가 갖춰져 있다는 것은 어떤 의미에서 약속된 무엇인가 있다는 것을 뜻한다.
예를 들어 한국어를 생각해보자.
자음, 모음이 있고, 이를 어떻게 쓰는지. 글자는 어떻게 구성하고 단어는 무엇이며 어떤 뜻을 가지고 있는지. 문장은 주어가 있고 술어가 있어야 한다는 등 사용함에 있어서 지켜야 할 규칙이 존재 한다. 이러한 규칙들을 지켜줘야 전하고 싶은 말을 온전히 전할 수 있다.
사람간 소통을 하기 위한 언어로는 한국어, 영어, 중국어, 독일어, 포르투갈어 등 다양한 언어가 있고 쓰는 문법도 다르다. 프로그래밍 언어도 동일하다. 자바, C, C++, C#, 파이썬 등등 다양한 언어들이 존재하고 또 각자 특징과 장단점들이 존재하며 쓰는 문법에도 차이가 있다. 단지 프로그래밍 언어로 소통하는 대상이 사람이 아닌 컴퓨터일 뿐이다.
사람과 소통하기 위한 언어와 컴퓨터와 소통하기 위한 언어의 큰 차이점이 있다.
사람은 개떡같이 말해도 찰떡같이 알아들을 수 있는데, 컴퓨터는 '이정도면 찰떡같이 말했군' 싶어도 개떡같이 알아듣는 경우가 많다. (하지만 결국 나의 잘못이라는걸 깨닫게 된다.) 그만큼 컴퓨터는 하나부터 열까지 모든 것을 실수 없이 문법에 맞춰 정확히 얘기 해줘야 의도대로 동작한다는 것을 기억 했으면 한다.
뭔가 생각한 결과가 나오지 않았을땐, 자신부터 의심하자.
말이 조금 샜지만 프로그래밍 언어, 소통 대상이 사람이 아닌 컴퓨터일 뿐이라고 기억하자. 쉽게 생각하자.
프로그래밍 언어를 처음 배우던 때를 기억한다. '이런게 있습니다. 보고 넘어가세요. 나중에 이해 됩니다.' 생각해보면 무슨 의도인지 알겠으나, 그냥 넘어가라는 말이 싫었다. 마치 '넌 아직 어려서 몰라. 크면 다 알게 된단다.' 같은 느낌이다. 돌려 말했지만 무시 당하는 기분.
728x90
어느날 생각했다. 이렇게 배우는 방법밖에 없는걸까. 처음부터 이해할 수 없을까.
이번 글의 목표는 개념적인 부분을 이해하는 것이다. 때문에 문법적인 언어 사용 방법보다는 그게 왜 생겼고 왜 필요한지에 대한 내용을 전달하는 부분에 중점을 두었다.
부족한 설명이지만 한 사람에게 한 줄이라도 도움이 되었으면 하는 바람이다. 내용을 정리 해보며 나는 잘 알고있는지 되물어보는 시간을 가지려 한다.