728x90

 

4. 자바 실행 환경 : 조금 더 즐거운 통합 개발 환경.


지금까지 알아본 내용을 토대로 프로그램 개발 과정을 생각해보자.

 

1. 메모장을 실행시킨다.

2. 프로그래밍 언어 (자바) 문법에 맞춰 원하는 프로그램을 작성한다.

3. 고급언어로 작성한 프로그램을 컴퓨터가 이해할 수 있도록 번역 (컴파일) 한다.

4. 오류가 발생했다면 오류를 수정한다.

5. 컴파일 결과물을 실행하기 위해 명령 프롬프트를 실행한다.

6. 명령 프롬프트에서 실행할 파일 (자바에서는 .class 확장자를 갖는 바이트 코드 파일)을 실행시킨다.

7. 결과를 확인한다.

 

생략된 과정들 (예를들면 컴파일 하기 위해 자바를 설치하고, 명령 프롬프트에서 컴파일 및 실행 시키기 위해 환경변수를 등록하는 일)도 있지만 대충 생각해도 꽤 많은 작업을 해야 비로소 프로그램을 실행시킬 수 있다.

 

 

 

생각해보면 2번 과정에서 프로그램을 어떻게 작성하는지에 대한 내용만 달라질 뿐, 그 외의 과정들은 프로그램을 만들 때마다 반복하고 있음을 알 수 있다.

프로그래밍 언어를 공부할 때 이 사실을 하나 기억하고 있으면 좋겠는 사실이 하나 있다.

일반적으로 했던 일을 또 하는 반복작업을 싫어하고 또 이러한 부분에 대해 내가 아닌 누군가 자동으로 해주길 바라고 있다는 것이다.

그리고 보통 이 피할 수 없는 반복 작업들을 피하는 방법의 패러다임은 (사견이지만) '사람이 할 일을 컴퓨터에게 시켜라' 이다.

 

 

첨언이 길었다.

본격적으로 위에서 말한 반복 작업을 어떻게 피하는지 통합 개발 환경을 구축하면서 생각해보자.

 

 

다양한 통합 개발 환경을 제공하는 프로그램들이 있지만 보편적으로 많이 사용하고 접하기 쉬운 eclipse IDE 로 알아보려 한다.

 

 

프로그램을 다운받기 위해 사이트로 이동한다.

 

 

그러면 현재 기준 위와 같은 화면을 볼 수 있다.

여기서 바로 다운로드 버튼을 누르지 말고 스크롤을 아래로 내려보자.

 

 

그러면 아래쪽에 Other에 IDE and Tools 링크가 존재한다.

이 링크를 눌러 이동하자.

 

 

위와 같은 화면이 나왔으면 Download 버튼을 클릭하자.

 

 

그러면 위와 같은 화면이 나타난다.

이클립스가 종류가 참 많다.

엔터프라이즈급 자바 개발을 위한 IDE, 자바 개발을 위한 IDE, C/C++ 개발을 위한 IDE 등등

자신에 맞는 이클립스를 다운 받으면 된다.

 

지금 화면은 가장 최신 버전을 먼저 보여주고 있는데, 이클립스마다 설치 되어 있어야 하는 JDK 버전이 다르므로 반드시 확인해야한다.

먼저 자신이 사용할 JDK 버전을 골랐으면 그 버전에 맞는 이클립스 버전을 MORE DOWNLOADS 에서 선택해서 다운받으면 된다.

 

 

추가적으로 이 화면의 위쪽을 보면 다음과 같은 Release 라는 링크가 있다.

 

 

링크를 클릭해보면 위와 같이 지금까지 배포한 버전들에 대한 링크가 존재한다.

각 버전들이 언제 출시 되었는지 다음 표를 참고하자.

위키백과에서 검색한 결과중 일부를 가져온 것이다.

 

 

안드로이드 버전에서도 볼 수 있는데, 버전명의 첫 문자가 알파벳 순서로 증가하는걸 볼 수 있다.

그냥.. TMI다.

 

 

 

아무튼 그래서 Mars 링크를 클릭하면 위와 같이 더 다양한 종류의 패키지들을 볼 수 있다.

처음 봤을때는 그냥 무조건 최신 버전을 받았던 기억이다.

정리하면 다음과 같다.

 

M Milestone
RC Release Candidates
R Release
SR Stable Builds
RTM Release to Manufacturing

 

RC같은 경우 정식 배포 하기 위한 후보군들에 붙인다.

위로 올라갈 수록 최신 버전으로 이전 버전들 보다는 안정적인 배포 버전이라 생각하면 될 것 같다.

개인적으로 버전의 네이밍 룰을 알고난 이후부터 되도록이면 R 버전을 다운받는다.


** eclipse build type 참고

 

 

얘기가 조금 다른 길로 샜는데 다시 돌아와서 Java EE Developer 의 윈도우 64비트 버전을 다운 받았다.

 

 

그러면 위와 같이 브라우저에 설정되어있는 경로에 이클립스가 다운 받아진다.

 

 

다운받은 파일의 압축을 풀면 위와 같은 파일들이 포함되어 있는걸 볼 수 있다.

누가 봐도 실행파일로 보이는 eclipse.exe 파일을 실행 시켜보자.

 

 

728x90

 

 

 

 

처음 실행 시키면 workspace 경로를 설정하라는 안내가 나온다.

실수로 생각없이 다시 묻지 않기를 선택해서 바로 welcome 페이지가 뜨면서 실행된 화면이다.

혹시 workspace 위치를 변경 하려면 다음과 같이 하면 된다.

 

 

 

workspace는 단어의 뜻 그대로 작업공간을 의미한다.

굳이 폴더 이름이 workspace일 필요는 없지만 편의상 이름을 수정하지는 않는다.

여기서 지정한 곳을 기준으로 작업한 내용이 저장된다.

 

 

앞서 메모장에서와 동일한 작업을 하는 프로그램을 만들기 위해 프로젝트를 생성해보자.

Project Explorer 영역에서 마우스 우클릭을 하고 New 의 Project를 선택한다.

만약 Project Explorer가 보이지 않는다면 이클립스 상단의 Quick Access를 활용하면 된다.

 

 

 

이렇게 바로 검색을 통해 찾아내는 방법이 있다.

그런데 만약 Quick Access를 찾을 수 없다면 다른 방법이 있다.

메뉴에서 Package Explorer를 찾아내 보여주는 방법이다.

 

 

상단의 Window > Show View > Package Explorer 를 바로 선택 하거나.

필요한 view가 목록에 없을 경우 맨 아래 Other... 를 선택한다.

 

 

Other... 를 선택하면 보여줄 수 있는 모든 View 목록이 나오는데, 위치를 안다면 찾아가도 된다.

만약 이름만 기억이 난다면 다음과 같이 검색을 통해 한번에 찾아내는 방법도 있다.

 

 

 

얘기가 조금 돌아갔지만, Package Explorer 영역에서 New > Project 를 선택하면 위와 같은 창이 뜬다.

 

 

어디에 있는지 알면 바로 선택해도 되고, 그게 아니면 검색을 통해 Java Project를 찾아 선택한다.

 

 

Java Project를 선택하면 프로젝트 생성 마법사 창이 뜬다.

보이는 항목 중에 Use default location 을 보면 앞서 설정한 workspace 경로가 입력 되어 있다.

체크박스를 해제하면 다른 위치에 만들 수 있겠지만 추천하지는 않는다.

 

 

Project name을 기입하면 아래 생성되는 위치가 실시간으로 바뀌고 있는것을 볼 수 있다.

그리고 JRE 버전도 프로젝트 생성시 설정할 수 있다.

Project layout 항목을 보면 생성한 프로젝트 최상위 위치에 소스파일과 클래스 파일을 같이 둘지

아니면 소스와 클래스 파일을 서로 다른 폴더에 구분할지 설정하는 부분이다.

 

설정이 완료 되었으면 Finish 버튼을 선택한다.

 

 

그러면 알림창이 하나 뜨면서 perspective 를 변환할 것인지 물어본다.

perspective는 사전적으로 어떠한 관점을 뜻하는 단어다.

그런 의미에서 본다면 앞으로 할 작업을 어떤 관점에서 하겠냐고 이해하면 좋겠다.

 

 

eclipse IDE의 perspective는 보통 우측 상단에 표시된다.

현재 Java EE 로 설정 되어 있으므로 단순 Java 프로젝트를 위한 Java perspective로 전환할 것인가를 물어보는 것이다.

 

 

그렇게 하겠다고 Yes 버튼을 클릭하면 우측 상단의 Java perspective가 생기며 활성화 되는 것을 볼 수 있다.

그러면서 크게 차이는 못느낄수 있지만 Java 개발에 최적화된 기본 View 들을 제공해주고 있다.

얼마든지 언제든지 작업 환경에 따라 바꿔줄 수 있으므로 부담 가지지 말자.

 

 

이제 좌측에 보면 TestPrj 이름을 갖는 Java 프로젝트가 생성된 것을 볼 수 있다.

 

 

그럼 이번엔 앞서 메모장에서 만들었던 것과 동일한 작업을 하는 소스 파일을 생성해보자.

src를 마우스 우클릭을 하고 New > Class 를 선택한다.

 

 

파일이 생성될 Source folder 경로가 나오며 해당 위치에 생성할 소스 파일의 이름을 지정해주도록 되어 있다.

또한 중간 쯤에 보면 Which method stubs would you like to create? 항목이 있다.

이것들은 IDE에서 제공하는 기능으로 자바 파일 생성시 빈번하게 반복하는 작업을 대신 해줄까? 하는 내용이다.

선택을 해도 좋고 안해도 상관 없다.

 

 

Finish를 클릭하면 TestPrj 프로젝트 하위에 TestClass.java 파일이 생성되는 것을 볼 수 있다.

 

 

eclipse 실행시 설정했던 workspace 경로를 따라가서 생성한 프로젝트 하위의 src 폴더를 열어보면 파일이 생성되어 있는것을 볼 수 있다.

 

 

앞서 메모장에서 테스트한 내용을 기억할지 모르겠다.

그때는 .java 파일을 javac 컴파일 명령어로 처리를 했어야 .class 파일이 만들어졌다.

하지만 이클립스 IDE를 사용하면 (설정에서 안하게 할 수도 있지만, 기본 설정을 수정하지 않으면) 위와같이 bin이라는 경로에 .class 파일이 자동으로 생긴 것을 확인할 수 있다.

 

 

앞에서 다루었던 Hello, World! 문자열을 출력한 예제를 작성해보자.

 

 

이것 역시 메모장에서는

1. 명령 프롬프트 실행 (cmd)

2. .java 파일의 경로로 이동

3. javac 명령으로 컴파일

4. .class 파일을 java 명령으로 실행

하는 과정을 거쳐야 실행 결과를 받아볼 수 있었다.

 

하지만 이클립스 IDE에서는 실행과 관련된 Run 메뉴 하위의 Run As > Java Application 을 선택하면 된다.

 

 

그러면 이클립스 자체에 Console 이라는 view 가 생기면서 그곳에 실행 결과가 출력된다.

정말 편리하지 않은가?

심지어 ctrl + F11 키를 누르거나 Alt + Shift + X, J 단축키로도 한번에 실행할 수 있다.

 

메모장으로 프로그램을 작성할 때보다 훨씬 시간과 노력이 줄어드는것을 대출 봐도 알 수 있다.

그럼에도 처음에는 메모장에서 프로그램을 작성하는 연습을 하기를 추천하다.

 

 

 

이번에는 마지막으로 괜히 명령프롬프트를 활용해서 .class 파일을 찾아가 실행시킨 화면이다.

어떻게 실행시켜도 상관 없다는것을 보여주고 싶었다.

 

 

지금까지 나름의 자바 정리를 해봤다.

처음부터 되도록이면 다 설명을 해보고 싶은 욕심에 전달이 잘 됐을지 걱정이다.
한창 정리하다가 그만하게 될까도 걱정이었는데 그래도 어떻게든 마무리 하게 되어 다행이다.

 

 

 

 

728x90
728x90

 

4. 자바 실행 환경 : ​즐거운 메모장 코딩 2편.


메모장 코딩 1편에서는 'Hello, World' 문자열을 콘솔에 출력하는 예제를 살펴보았다.

2편에서는 앞서 얼렁뚱땅 넘어갔던 컴파일과 관련된 내용을 살펴보려 한다.

 

프로그래밍 언어에도 등급이 있다.

고급, 저급.

조금의 노력으로 드라마틱한 결과를 만들어낼 수 있어서 고급언어.

엄청난 노력과 시간을 쏟아 Hello World 한 줄 출력해내기 어려워서 저급언어.

라고 하진 않는다.

 

소스코드를 사람이 이해하기 쉬울수록 고급언어, 기계가 이해하기 쉬울수록 저급언어 라고 한다.

자바 정도면 사람이 이해하기 좋은 언어로 고급언어에 속한다.

잘 와닿지 않는다면 다음 저급언어의 예로 기계어를 구경해보자.

 

x = 10 + 2
y = x + 4

 

자바 언어에서는 위와 같이 표현할 수 있는 것을 기계어로 작성하면 다음과 같다고 한다.

 

001001 11101 11101 1111111111111000
001000 00001 00000 0000000000001010
001000 00001 00001 0000000000000010
101011 11101 00001 0000000000000000
001000 00010 00001 0000000000000100
101011 11101 00010 0000000000000100
001001 11101 11101 0000000000001000

 

가독을 위해 4자리씩 끊어 16진수로 표현하면 다음과 같다고 한다.

 

27BDFFF8
2020000A
20210002
AFA10000
20410004
AFA20004
27BD0008

 

확실히 자바 언어로 작성된 소스가 읽기에 편하다.

 

 

728x90

 

 

문제는 컴퓨터라는 기계는 고급언어가 아닌 저급언어인 기계어를 이해한다는 것이다.

그래서 우리는 고급언어로 작성된 프로그램을 컴퓨터가 이해할 수 있도록 번역해주는 과정을 거쳐야 한다.

그리고 이 과정을 컴파일이라고 한다.

 

여기까지만 알아도 좋지만, 자바 언어에 대해 알아가는 만큼 조금만 더 자세히 알아보자.

.java의 확장자를 갖는 자바 프로그램은 컴파일 과정을 거치면 실행 가능한 실행파일(보통 .exe 확장자를 갖는다.)이 아닌

.class 라는 바이트코드 파일이 생성된다.

 

왜 그런걸까?

 

앞서 JVM에 대해 언급할 때 소개한 그림을 다시 살펴보며 이해해보자.

 

 

자바는 플랫폼의 제약에서 벗어나기 위해 JVM이라는 자바 가상 머신을 사용하고 있다.

그렇기 때문에 자바 소스를 컴파일 하면 실행의 주체인 JVM이 이해할 수 있는 '바이트 코드'라는 파일이 만들어 진다.

 

 

 

이 바이트 코드 파일의 확장자는 .class 를 갖는다.

그리고 자바 프로그램은 플랫폼에 의해 실행의 주체인 JVM을 통해 미리 컴파일 된 class파일을 읽고 실행한다.

 

 

이번 포스팅은 메모장 코딩 1편 내용의 약간 보충으로 분량을 적게 잡았다.

그럼 다음 시간엔 IDE 라고 하는 통합 개발 환경 (IDE : Integrated Development Environment) 에 대해 알아보자.

 

 

 

 

728x90
728x90

 


4. 자바 실행 환경 : 즐거운 메모장 코딩 1편.


충격적인 소식이 하나 있다.
사실 환경변수까지 등록하지 않아도 자바 프로그램을 만들 수 있다.
하지만 알고 있기 바라는 생각과 메모장 코딩을 하기 위해 넣은 내용이다.

메모장은 윈도우 + 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 SE 8 Documentation 링크

 

 

사이트에서 오른쪽에 보이는 Java SE API 링크를 눌러보자.

그 전에 API라 함은 Application Programming Interface 의 줄임말로 프로그래밍 언어에서 제공하는 기능들을 설명한 문서이다.

쉽게 말해 백과사전이라 생각하면 좋다.

 

 

링크를 타고 들어가서 보면 Packages 라는 영역이 있고, 이곳을 찾아보면 java.lang 이라는 방금 보고온 단어가 있다.

java에서는 폴더를 다른말로 package 라고 부른다.

이 링크를 클릭해보자.

 

들어가보면 엄청나게 많은 영어들이 무언가를 열심히 설명하고 있다.

이 내용들이 모두 java.lang의 모든것들에 대한 설명이다.

그리고 이 많은 것들을 우리는 import java.lang.*;

이 한줄을 써줌으로 자유롭게 가져다 사용할 수 있는 환경을 갖추게 된 것이다.

 

이 줄에 대한 마지막 설명으로 package에 대해 언급해야겠다.

우리가 어린시절 레고 장난감을 정리할 때 그냥 큰 통에 몰아 담아두기도 하지만,

같은 색의 블럭끼리 혹은 같은 크기의 블럭끼리 분류해서 따로 담아 보관하기도 한다.

package도 이와 동일하다.

서로 비슷한, 관련있는 클래스들을 package 라는 단위로 묶어 관리하고 있다.

레고 블럭을 분류해서 보관하면 좋은 장점을 생각해보면 왜 이렇게 묶어 놨는지 금방 이해할 수 있다.

 

실제로 위에 첨부한 이미지의 Description 영역을 보면 package에 대한 설명으로,

어떠한 클래스들을 묶어놨는지 짐작할 수 있다.

그 예로 java.lang 이라는 package의 설명을 보면

"Provides classes that are fundamental to the design of the Java programming language."

"Java 프로그래밍 언어의 기본이 되는 클래스들을 제공합니다." 라고 되어있다.

 

API 문서를 보는 기본적인 방법은 다음에 다루겠다.

 

 

 

 

public class Exam_01 {


앞서 기억할지 모르겠지만, 자바의 프로그램은 클래스 단위로 작성 된다고 언급 했었다.

여기 그 익숙한 class 라는 예약어가 등장했다.

class 는 설계도 라고 했으니, 지금부터 설계도가 시작한다는 것을 의미한다.

 

아니. 방금 바로 위에서 API문서에 클래스들이 있다고 했는데, 그건 뭐고 이건 뭐지?

API에서 제공하는 것은 언어 자체에서 기본적으로 제공하는 클래스들이고, 지금부터 볼 내용을 사용자가 정의하는 클래스들 이다.

(사용자가 정의한다는 의미가 중요하다.)

 

그럼 앞에 있는 public 과 뒤에 있는 Exam_01 은 무엇이며 중괄호 { 는 무엇일까?

중괄호는 우리가 알고있는 괄호의 기능과 동일하게 범위를 나타낸다.

어떤 괄호를 사용하더라도 열고 닫는 쌍이 맞아야 프로그램이 오류가 나지 않는다.

그렇기 때문에 혹시 괄호를 열었다면 바로바로 닫아주고 그 안에 내용을 작성하는 습관을 가지자.

 

 

 

위와 같은 방식으로 작성하다보면 언젠가는 괄호 쌍이 맞지 않아 오류가 발생하는 안타까운 실수를 하기 쉽다.

그러니 아래와 같이 괄호를 열었으면 들여쓰기 레벨에 맞춰 바로바로 닫아주는 습관을 가지기를 권유한다.

 

 

우선 public에 대해 알아보자.

자바에서 public 이란 예약어는 접근 제한자이다.

이름에서도 느낌이 오듯 외부에서의 접근에 제한을 두겠다는 의미이다.

쉽게 생각해서 집 대문을 잠그는 이유가 무엇일까?

외부인으로부터 무자비한 접근을 막기 위함이다.

이 언어도 외부에서 들어와 이리저리 헤집어놓는것을 방지하기 위해 접근 제한자 라는 장치가 있는 것이다.

 

자바 언어에는 네가지의 접근 제한 레벨이 있으며 예약어는 세가지가 있다.

1. public

    접근을 제한하지 않는다.

2. protected

    같은 package에 존재하는 클래스 간 혹은 파생클래스에서만 접근이 가능하다.

3. default

    아무 예약어도 쓰지 않는 경우로, 같은 package에 존재하는 경우에만 접근이 가능하다.

4. private

    자기 자신의 클래스 내부에서만 접근이 가능하다.

 

3번의 경우가 있기 때문에, 접근 제한 레벨은 4등급 이지만 예약어는 세가지 이다.

보면 금방 알 수 있지만, 접근 가능 범위는 다음과 같은 순서를 갖는다.

public > protected > default > private

 

여기서는 public 이라는 예약어를 사용했기 때문에 어느곳에서든 접근이 가능한 클래스라는걸 의미한다.

또한 이 클래스라는 것에 대해 접근 제한자가 붙을때에는 약속된 것이 한가지 있다.

public 으로 선언된 클래스는 하나의 자바 소스 파일 안에서는 단 한번만 존재할 수 있으며,

public 으로 선언된 클래스의 이름은 자바 소스 파일의 이름과 대소문자까지 정확히 일치해야만 한다.

윷놀이에서 윷을 던져서 '걸'이 나오면 말을 세 칸 움직인다. 왜? 그렇게 약속 했으니까.

이것도 그렇게 약속했기 때문이라고 이해해야 한다.

 

 

그러면 자연스럽게 Exam_01 이 무엇인지 눈치가 빠르면 알 수 있다.

바로 이 설계도의 이름, 클래스의 이름이다.

클래스의 이름은 사용자가 정하기 나름인데, 클래스 명을 포함하여 자바에는 작명에 규칙이 몇가지 있다.

 

1. 기본적으로 예약어는 사용할 수 없다.

예약어라는것이 무엇인지 앞서 설명했기 때문에 왜 안되는지 이미 알고 있다.

2. 첫번째 문자는 (지금의 경우 E) 반드시 문자 혹은 언더바 (_) 혹은 달러 ($) 로 시작해야만 하며, 숫자로 시작할 수 없다.

public class 3rdTest { }

이런건 있을 수 없다. 굳이 숫자가 앞에 와야한다면

public class _3rdTest { } 또는 public class $3rdTest { } 이런 식으로 작성해야 한다.

3. 대소문자를 구분한다.

이거 중요하다. 자바는 대소문자를 구분하는 언어이기 때문에

Exam_01 과 exam_01은 서로 다른 것으로 인식한다.

예약어의 대소문자도 주의해서 사용해야 한다.

4. 딱히 길이 제한은 없지만 공백은 없어야 한다.

Exam_01 이라는 이름도 언더바를 사용해서 Exam과 01을 연결했다.

public class Exam 01 { } 이런것은 사용할 수 없다.

 

** 자바 클래스의 이름은 영문 대문자로 시작하는게 관례이다. 그래서 영문 대문자로 시작하는 사용자가 정의한 명칭을 보면 '아 이건 클래스겠구나' 라고 바로 알아볼 수 있다. 굳이 지키지 않아도 오류는 생기지 않지만, 우리들만의 약속 이다.

 

 

 

 

public static void main(String[] ar) {


다음 라인을 보니 이게 뭐지 싶다.

이 문장은 이해도 이해지만, 일단 대소문자까지 통째로 암기하고 있기를 추천한다.

퍼블릭 스태틱 보이드 메인 스트링 배열 에이알.

여기서 마음대로 바꿀 수 있는건 ar 저거 단 하나 뿐이다.

 

public은 앞서 본것 처럼 접근 제한 레벨을 나타낸 것이다.

public 이라고 썼기 때문에 이것이 감싸는 블럭은 모두가 접근해서 사용할 수 있음을 컴퓨터에게 알려주고 있다.

 

static 이라는 것도 예약어이다.

static에 대해서는 해야할 얘기가 많기 때문에 지금 다루기엔 너무 무겁다.

그래도 초면인데 통성명은 하는게 상도덕이니까(상업 활동은 아니지만) 간단히 소개를 해야겠다.

static을 사전에서 찾아보면 '고정된, 정적인' 이라는 뜻으로 나온다.

반대되는 말로 동적인 (dynamic, 다이나믹) 이라는 말이 있다. (dynamic은 예약어가 아니다.)

정적이라는게 무엇일까?

지금은 항상 그자리 그곳에 혼자 있는 녀석이다. 정도 이해하자.

 

혹시 기억을 해줄지 모르겠지만, 앞서 클래스와 객체의 관계에 대해서 설명을 했었다.

클래스는 설계도와 같은 것으로 스스로는 아무런 의미를 가질수 없다.

그 설계도를 바탕으로 구현된, 다시 말해 실체화 된 객체로 만들어져야 의미를 갖는다고 했었다.

static은 이렇게 클래스가 객체화 되었을 때 힘을 발휘한다.

바로 위에서 '항상 그자리 그곳에 혼자 있는 녀석' 이라 했는데, 클래스가 객체화 될 때 관여하는 관점에서 바라보면 다음과 같이 정리할 수 있다.

 

동일한 클래스로 생성된 객체들은 static으로 선언한 부분을 공유해서 사용한다.

즉, 동일한 클래스로 객체를 10개, 100개 만들어도 static 으로 선언된 부분은 한개만 존재한다는 것을 말한다.

그림으로 보면 다음과 같다.

 

 

 

이것으로 알 수 있는 사실은 public static void main(String[] ar) 이라고 한 부분의 블럭 { } 은

어찌 되었던지간에 Exam_01 클래스 내부에서 static 이라는 예약어(키워드)를 사용해서 선언한 (만든) 부분이기 때문에

Exam_01 클래스의 객체를 아무리 많이 생성해도 딱 한개만 존재한다는 것을 알 수 있다.

또한 더 나아가 Exam_01 클래스의 수많은 객체들이 모두 공유해서 사용할 것이라는 것도 알 수 있다.

 

static에 대해서 더 알고 싶다면 이전에 정리한 내용을 참고하길 바란다.

지금은 무엇인지 간단히 설명 했지만 다음에 더 자세히 설명할 기회가 있을 것이다.

 

혹시 사전을 폈다면 편김에 void의 뜻도 찾아보자.

'빈 공간, 하나도 없는' 이란 뜻이다.

(생활 속에서도 중요하지만 이름을 짓는것은 굉장히 신중해야 할 일이다.

예를 들어 핫소스를 담는 통에 이름이 마음에 안든다고 '참기름병' 이라고 써놨다고 해보자.

아는 사람은 '아, 이건 핫소스구나' 알 수 있지만 잘 모르는 사람은 '참기름이네?'하고 먹는 순간 재앙은 시작된다.

그렇기 때문에 변수, 메서드 또는 클래스 등의 이름을 지을때는 처음 보는 사람도 그게 무엇을 하는지 어느정도 예상할 수 있도록 이름을 잘 지어야 한다.

예약어도 그냥 아무 단어나 가져다 사용한것은 아니기 때문에 사전을 찾아보는건 이해하는데 도움이 많이 된다.)

무엇이 없다는 것일까?

 

이것에 대한 설명에 앞서 수학에 함수에 대해 언급해야겠다.

수학 시간에 함수에 대해 배울때 꼭 보는 유명한 그림이 있다.

 

 

 

수학시간엔 이 그림을 다음과 같이 설명한다.

어떠한 입력 x에 대해 y라는 결과를 도출하는 함수 f

그래서 y = f(x) = 2x 라고 정의했다고 하자.

이 때 f(2) 의 값은 4를 갖는다는걸 우리는 알고 있다.

 

자바에서의 함수(자바에서는 함수를 method 메서드라고 부른다. 이하 메서드) 도 똑같다.

(사실 함수와 메서드라는 명칭을 혼용해서는 안된다. 자바를 배웠다면 반드시 함수라고 하지 말고 메서드라고 하자.)

어떠한 입력을 주고, 그에 대한 결과를 받아보겠다는 것이다.

잘 이해가 안된다면 사람 사는것에 비유해보자.

친구A가 친구 B에게 학교를 마치고 집에 가는 길에 떡볶이를 사줬다고 하자.

(항상 그런건 아니지만) 그렇게 해주는데는 다 이유가 있다.

친해지고 싶어서. 마음에 드는 친구라. 혼자 먹기 싫어서. 혹은 그 친구가 가지고 있는 띠부띠부씰이 가지고 싶어서. 등등

아무리 사소한 것이라도 뭔가 원하고 바라는게 있기 때문에 친구A는 친구B에게 떡볶이라는 것을 입력한 것이다.

바라는게 없다면 뭣하러 떡볶이를 사줬겠는가. 내가 다 먹지.

 

자바에서도 메서드를 호출할 때 (사용하는 것을 호출한다고 한다) 뭔가 원하는 결과가 있으니까 부르는 것이다.

다시 void 얘기로 돌아와서, 이 void는 호출한 메서드의 실행 결과, 사용자가 원하는 어떠한 것의 형태이다.

즉, public static void main(String[] ar) { } 이 블럭이 다 실행되고 나면 어떠한 결과를 사용자에게 줄 것인가. 에 대한 답이다.

 

예를들어 편의점에 가서 '츄파츕스 하나 주세요' 라고 하면 우리는 '사탕'을 줄것이라 기대한다.

이것을 자바 메서드 관점에서 보면

'츄파춥스 하나 주세요' 라는 입력에 대해 '사탕'의 형태의 출력 결과를 받을것을 기대한다는 것과 같다.

 

그래서 public static void main(String[] ar) { } 의 블럭 내부 실행 결과 사용자가 기대하는 출력 결과는 void이다.

void는 '빈 공간, 하나도 없는' 이라고 했으니까

사용자는 이 블럭을 다 하고나서 뭔가 되돌려받길 원하지 않는다는것을 알 수 있다.

이것을 반환형 타입, 리턴값의 형태, 반환형 리턴값 타입. 등등의 말로 표현한다.

 

 

다음으로main 이다.

main은 자바 프로그램에서 정말 중요한 의미를 지닌다.

모든 자바 프로그램은 main에서 시작해서 main에서 끝난다고 할 수 있다.

즉, 자바 프로그램의 시작점이자 끝나는 종료지점이다.

외출을 하려면 대문을 열고 나가야 하지 않는가?

이 대문이 외출의 시작점 인것처럼 자바 프로그램은 main이 시작점이다.

 

이 main이 바로 메서드이고 우리는 이것을 너무나 당연하게도 main 메서드 라고 부른다.

자, 그럼 앞서 메서드는 입력과 출력이 있다고 했다.

출력에 대한 얘기는 void에 대해 얘기하면서 방금까지 신나게 했다.

이 입력에 대한 내용은 소괄호() 안에 명시하는게 규칙이다.

소괄호 안에 String[] ar 이라는 것이 보인다.

static과 마찬가지로 이것에 대해서 설명하기에 지금은 너무 무겁기 때문에, static 처럼 지금은 통성명만 하고 넘어가자.

String[] ar 을 통째로 main 메서드의 입력값. 다시 말해 y=f(x) 와 비교하면 매개변수 x 에 해당하는 내용이다.

 

그래서 마무리 정리를 하면,

public static void main(String[] ar) { } 은

모두가 접근할 수 있고(public), 항상 그자리에 있는(static), { } 내용을 실행하고 나서 아무것도 돌려주지 않는(void) main이라는 이름의 메서드이며, 입력 내용은 String[] ar 이라는 것이다.

 

 

 

 

 

System.out.println("Hello, World!");


자, 드디어 마지막 문장이다.

눈치가 빠르다면 이 문장을 보고 감이 딱 오는게 있을법도 하다.

1. System 이라는게 대문자로 시작했네? 클래스겠구나.

2. 마침표 (.) 로 연결 되어있네? System 이란 클래스 안에 out이라는게 연결 되어있고

   이 out에는 println이라는게 연결 되어있구나.

3. main 메서드에 대해 얘기할 때 소괄호 ( ) 가 입력값이라고 했는데, "Hello, Wolrd" 이게 입력값인가?

   그러면 println 은 메서드겠구나.

처음 봤는데 여기까지 생각했으면 천재가 아닐까.

 

그래. 백번 천번 양보해서 그렇다 치자. 그런데 저 System이란건 어디서 나온건데 갑자기?

지금까지 앞에서 본건 예약어이거나, 사람이 임의로 이름을 지어준 것들이었다.

그런데 main 이라는 프로그램의 시작부분안에 시작 하자마자 출처를 알 수 없는 System 이라는게 나타났다.

모를땐 사전을 찾아보자.

 

API 문서에서 java.lang 패키지를 선택해서 이동한 페이지에 다음과 같은 부분이 있다.

 

 

System 클래스는 몇가지 유용한 클래스 필드들과 메서드들을 포함하고 있습니다.

우선 이 System 이라는 클래스가 java.lang 안에 있다라는 사실이 중요하다.

왜냐하면 우리가 작성한 프로그램 제일 처음에 import java.lang.*; 라고 작성을 했기 때문에 System 이라는 클래스를 마음대로 사용할 수 있게 되었기 때문이다.

 

마저 더 살펴보면 System.out.println 이라고 참조 연산자로 서로 연결되어 있다.

링크가 걸려있는 System 을 선택해서 더욱 깊이 들어가보자.

 

 

이미지의 최상단에 보면 java.lang의 System 클래스에 대한 설명임을 알 수 있다.

그리고 Field Summary 영역에 out이라는 익숙한 단어가 설명되어 있다.

The "standard" output stream. 표준 출력 스트림.

이라고 설명하고 있다. 점점 재밌어진다. (나만?)

out을 눌러 보다 자세한 설명을 보러 가자.

 

 

"표준"출력 스트림. 이 스트림은 이미 열려있고 출력 데이터를 받아 들일 준비가되어 있다. 일반적으로 이 스트림은 호스트 환경 또는 사용자가 지정한 표시 출력 또는 다른 출력 대상에 해당합니다.

라고 설명 되어 있으며, 그 아래는 친절하게 사용 예시까지 보여주고 있다.

 

우리는 이 프로그램을 명령 프롬프트(cmd) 에서 실행 시킬 것이기 때문에, 이 문서에서 말하는 호스트 환경이 지금은 명령 프롬프트에 해당한다.

 

다시 돌아와서

System.out.println("Hello, World!");  문장은 "Hello, World!" 라는 data를 호스트 환경의 출력 장치에 출력하라는 명령을 뜻한다.

 

 

 

 

 

지금까지 각 라인이 무엇을 뜻하는지에 대해 살펴 보았다. 그러면 이제 직접 실행을 해볼 차례이다.

 

 


 

 

 

위와 같은 경로에 class 이름과 대소문자까지 모두 정확하게 일치하는 .java 확장자를 가지는 소스파일을 저장하자.

 

 

이 .java 파일은 사람이 이해할 수 있는 언어로 작성된 소스 파일이기 때문에

이제부터 컴퓨터가 이해할 수 있도록 '컴파일' 과정을 (번역) 실행할 것이다.

(컴파일에 대해서는 바로 다음 포스팅에서 자세히 다룰 예정이다. 궁금하다면 먼저 다음 글을 보고 와도 좋다.)

그 명령어는 다음과 같다.

 

javac Exam_01.java
Exam_01.java 라는 파일을 컴파일 해서 컴퓨터가 (프로그램 실행의 주체인 JVM이) 이해할 수 있는 언어로 바꿔주세요.

라는 명령이다.

이 명령을 사용하기에 앞서 주의할 점은

명령을 내리는 경로가 소스파일이 저장된 경로와 동일해야 한다는 것이다.

 

 

정상적으로 컴파일(번역)이 완료되면 위와 같이 별다른 메시지 없이 종료된다.

그러면 소스파일을 저장했던 곳에 어떤 변화가 있는지 확인해보자.

 

 

.class 라는 내가 만든 .java 와 동일한 이름의 파일이 새로 생성 되었다.

이 .class 파일이 JVM에 의해 실행 될 컴퓨터가 이해하는 언어로 변환된 자바 프로그램 파일이다.

 

어? class 는 설계도라 객체화 해야 의미가 있는 거라면서. 객체에 대한 얘기는 1도 안했는데 이게 가능해?

가능하다. 왜냐하면 이 클래스 안에는 main 이라는 메서드가 있기 때문이다.

 

그럼 이제 이 파일을 실행해보자.

실행 할때는 확장자를 제외하고 java 라는 명령어를 사용하면 된다.

 

 

명령 프롬프트에 Hello, World! 이 문장을 출력하기 위해 기나긴 시간 고생 많으셨다.

지금 작성한 Hello World! 를 명령 프롬프트에 출력하는 예제를 완벽하게 이해했다면 앞으로의 내용은 그리 어렵지 않게 이해할 수 있다.

그만큼 많은 내용을 담고 있기 때문에 처음 접한다면 부대낄수밖에 없지만 알고있길 바라는 마음에 정리해봤다.

 

 

 

 

728x90
728x90

 


4. 자바 실행 환경 : 자바 설치 방법.


글을 작성하는 현재 시점으로 자바의 가장 최신 버전은 Java 11 이지만 Java 8 을 설치해서 사용할 계획이다.
그리고 윈도우 플랫폼을 기준으로 한다.


프로그래밍 언어가 뭔지도 알았겠다. 그 중 자바가 뭔지도 좀 알았겠다. 이제 본격적으로 설치를 해보자.

 

설치 파일 다운로드 링크

 

링크에 들어가서 다음 과정을 따라서 설치해보자.
사이트에 접속후 스크롤을 맨 아래로 내리면 다음과 같이 "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 문서를 열어볼 수 있다고 한다.

 

java SE 8 Documentation 링크

 

사이트가 연결되니 나중에 꼭 참고해봤으면 좋겠다.

 


설치가 끝났다면 잘 설치 되었는지 확인 해보자.

명령 프롬프트를 하나 열어보자.
명령 프롬프트는 윈도우 키를 누르고 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) 이 나온 것이다.

그러면 이제 정말 본격적으로 자바 소스를 작성할 준비가 됐다.
다음부터는 본격적으로 소스를 작성해 보겠다.

 

 

 

728x90
728x90

 



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 타입의 변수에 담았다고 하자.
잘 담기야 했겠지만 공간 낭비다.

 

 

728x90

 

 

** 여기서 다루기에 적합하지 않지만 생각 난 김에 정리해두려 한다.

더보기

자바에 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. 모든 변수의 선언은 다음과 같이 한다.
[데이터 타입(자료형)] [변수명] = [변수에 넣을 값]



최대한 소스를 작성하지 않고 개념적인 부분만을 전달해보려 했는데, 잘 됐는지 모르겠다.

 

 

 

 

728x90
728x90

 


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만큼 고생하고 높은 품질의 프로그램을 만드는 것이 가능하다.

 


그 외에도 몇가지 특징들이 있겠지만, 대표적으로 자주 다루는 특징들을 살펴 보았다.

 

 

 

 

728x90
728x90

 


1. 프로그래밍 언어란.




이제 시작인데 졸음이 몰려오는 기분이다.
언어가 언제부터 왜 생겨났는지 그 배경을 시작으로 어떻게 발전해 왔는지에 대해 아는것은 중요하다.
하지만 이런 내용들에 대해선 지금은 다 각설하고 하나는 기억하고 넘어가자.

자바는 1995년 썬 마이크로 시스템즈에서 개발한 프로그래밍 언어이고, 창시자는 제임스 고슬링(James Arthur Gosling)이다.

내용을 통째로 생략했지만, 누가 언제 어디서 만들었는지 정도는 알아야 하지 않을까?


본격적으로 프로그래밍 언어가 무엇인지 생각해보자.
단어에서 알 수 있는 사실은 프로그래밍 언어도 하나의 언어 라는 것이다. 이 사실을 잊지 말자.
언어는 다음과 같이 정의 되어있다.


"생각, 느낌 따위를 나타내거나 전달하는 데에 쓰는 음성, 문자 따위의 수단. 또는 그 음성이나 문자 따위의 사회 관습적인 체계."


즉, 프로그래밍 언어는 컴퓨터에게 나의 생각, 느낌을 전달하는 하나의 체계다.

 

728x90

 



체계가 갖춰져 있다는 것은 어떤 의미에서 약속된 무엇인가 있다는 것을 뜻한다.

예를 들어 한국어를 생각해보자.


자음, 모음이 있고, 이를 어떻게 쓰는지. 글자는 어떻게 구성하고 단어는 무엇이며 어떤 뜻을 가지고 있는지.
문장은 주어가 있고 술어가 있어야 한다는 등 사용함에 있어서 지켜야 할 규칙이 존재 한다.
이러한 규칙들을 지켜줘야 전하고 싶은 말을 온전히 전할 수 있다.

사람간 소통을 하기 위한 언어로는 한국어, 영어, 중국어, 독일어, 포르투갈어 등 다양한 언어가 있고 쓰는 문법도 다르다.
프로그래밍 언어도 동일하다.
자바, C, C++, C#, 파이썬 등등 다양한 언어들이 존재하고 또 각자 특징과 장단점들이 존재하며 쓰는 문법에도 차이가 있다.
단지 프로그래밍 언어로 소통하는 대상이 사람이 아닌 컴퓨터일 뿐이다.

 

 


사람과 소통하기 위한 언어와 컴퓨터와 소통하기 위한 언어의 큰 차이점이 있다.


사람은 개떡같이 말해도 찰떡같이 알아들을 수 있는데, 컴퓨터는 '이정도면 찰떡같이 말했군' 싶어도 개떡같이 알아듣는 경우가 많다. (하지만 결국 나의 잘못이라는걸 깨닫게 된다.)
그만큼 컴퓨터는 하나부터 열까지 모든 것을 실수 없이 문법에 맞춰 정확히 얘기 해줘야 의도대로 동작한다는 것을 기억 했으면 한다.

뭔가 생각한 결과가 나오지 않았을땐, 자신부터 의심하자.


말이 조금 샜지만 프로그래밍 언어, 소통 대상이 사람이 아닌 컴퓨터일 뿐이라고 기억하자.
쉽게 생각하자.

 

 

 

728x90
728x90

 

정리는 다음 순서로 진행할 예정이다.

 

1. 프로그래밍 언어란

  • 프로그래밍 언어도 언어라고 부르는 이상 일상에서 사용하는 언어와 크게 다르지 않다.

 

2. 자바 언어가 가지는 특징

  • 배워본 언어가 없는데 어떻게 비교를 해?

    비교라는건 둘 이상의 서로 다른 무엇인가의 공통점과 차이점을 통해 서로의 장단을 샅피는 일이다.

    문제는 처음 배우는데 비교 대상이 없다. 그래서 일상의 예를 통해 자바의 특징에 대해 살펴 본다.

 

728x90

 

3. 자료의 형태 (data type)

  • 상수, 변수, 배열, (구조체), 클래스 그리고 사용자 정의 자료형

    이 세상 모든것은 아무리 사소해 보이는 것도 존재의 이유가 있다.

    이런 것들을 만들 수 밖에 없었던 선배 개발자 분들의 생각을 추측해 본다.

 

 

4. 자바 실행 환경

  • 자바 설치 방법
  • 즐거운 메모장 코딩
  • 조금 더 즐거운 통합 개발 환경

    문법적 사용법을 지양하고 개념적인 부분 중심으로 설명하려고 노력했다.
    하지만 그래도 프로그래밍인데 실습이 빠지면 섭섭하다.
    최소한의 코딩을 통해 개발 환경 구성 및 실행하는 방법을 알아 본다.



 

728x90

+ Recent posts