[Java] 자바로 프로그래밍 입문하기: 1.1. 첫 프로그램 만들기.
1. 프로그래밍의 요소들
서론
첫번째 챕터의 목표는 프로그래밍이 시나 수필을 쓰는 것보다 더 쉽다는 것을 여러분들에게 납득시키는 것입니다.
글을 쓰는 것은 어렵습니다. 우리는 학교에서 항상 국어 수업을 들어왔는데도, 작문은 여전히 어렵죠. 반면 프로그램은 몇 안 되는 문장만으로도 만들 수 있습니다. 또, 흥미롭지만 접근하기 쉽지 않았던 문제들을 해결하는 데에도 도움이 됩니다. 이 챕터에서는 흥미롭고 다양한 프로그램들로 프로그래밍의 구성 요소들을 배움으로써 자바 프로그래밍의 입문을 시작할 것입니다.
이 강의에서 여러분은 자바 언어를 배울 것입니다. 이는 외국어를 배우는 것보다 더 쉬울 것입니다. 우리가 들어본 수많은 프로그래밍 언어들의 차이는, 사실 수십 개도 안 되는 단어들과 문법 따위로 규정되는 것이 전부입니다. 우리가 이 강의에서 다루는 것들은 모두 C나 C++, 그 외의 많은 언어들로 표현될 수 있습니다.
하나 명심할 것은, 우리는 프로그래밍을 배우는 것에 초점을 두고 있지, 자바의 세부사항을 배우는 것에 초점을 두고 있지 않다는 것입니다. 다만 자바는 널리 사용되므로, 자바로 프로그래밍을 공부하면 차후 많은 프로그램을 익숙하게 작성할 수 있을 것입니다. 그리고 자바를 배우면 C와 같은 저레벨 언어부터 매트랩같은 특수 언어까지도 배우기 쉬울 것이라 장담합니다.
첫 프로그램 만들기
이번 차시는 여러분이 간단한 프로그램을 통해 자바 프로그래밍의 세계로 첫걸음을 딛는 과정입니다.
자바 시스템은 여러분이 흔히 사용하고 있는 한글, 워드, 엑셀이나 인터넷 브라우저와 같이 응용 프로그램입니다. 따라서 자바와 IDE를 컴퓨터에 설치해야 합니다. IDE는 설치하지 않아도 프로그래밍을 할 수 있으나, 좀 더 쉽고 편하게 배울 수 있으므로 설치를 권합니다.
설치 방법은 다음 포스트를 참고하세요. 자바를 프로그래밍 할 수 있는 통합개발환경(IDE)는 IntelliJ, Eclipse, VS Code 순으로 점유율이 높습니다. 필자는 Eclipse를 사용하고 있으므로, Eclipse 설치 방법을 공유 합니다. 다른 IDE를 선택하더라도 문제가 되지 않으며, 프로그래밍을 배우는 수준에서, 상술한 IDE들의 기능적 차이는 없다고 봐도 무방하니 취향 껏 선택하시기 바랍니다.
Java 통합개발환경(IDE), Eclipse 설치하기 및 자바 프로젝트 생성하기
자바 프로그래밍의 과정을 3단계로 쪼개면, 다음과 같습니다.
- MyCode.java와 같은 파일 이름으로 프로그램 만들기.
- 터미널 윈도우에서 'javac MyCode.java' 를 입력해 프로그램 컴파일 하기
- 터미널 윈도우에서 'java MyCode' 를 입력해 프로그램 실행하기.
하지만 2번의 경우 IDE에서 자동으로 해주며, 3번의 경우도 IDE에서 버튼 하나만 누르면 자동으로 실행되고 결과를 볼 수 있습니다. 따라서 여러분이 집중해야 할 것은 1번의 과정입니다.
간단히 짚고 넘어가자면, 여러분이 사용하는 프로그래밍 언어는 사실 컴퓨터가 알아들을 수 없습니다. 사람이 프로그램을 쉽게 만들 수 있게 도와줄 뿐이죠. 따라서 그 사이에는 사람 언어를 기계 언어로 바꿔주는 번역가가 필요합니다. 그런 과정을 '빌드'라고 하며, '컴파일'은 빌드 과정 중 하나입니다.
프로그램 만들기
자바 프로그램은 파일 이름이 .java로 끝날 뿐, 단순히 글자를 나열한 것 그 이상 그 이하도 아닙니다. 마치 이 글처럼 말이죠. 여러분은 IDE 대신 메모장을 켜서 프로그래밍을 해도 전혀 문제가 되지 않습니다. 심지어 A4 용지를 꺼내서 펜으로 직접 코드를 써도, 그것은 여전히 프로그램으로서 유효합니다. 그냥 편지를 쓴다거나, 컴퓨터와 채팅을 하는 것이라고 생각해도 무방합니다. 여기서 명심해야 할 건 단 하나, 자바 문법에 맞게 글을 써야한다는 것입니다.
프로그램 컴파일 하기
프로그래밍 언어는 컴퓨터가 이해하기 쉽게 만들어졌을 것 같지만 사실은 여러분들, 즉 프로그래머가 이해하기 쉽게 만들어진 언어들입니다. 컴파일러는 자바 언어를, 좀 더 컴퓨터로 실행하기 적합한 언어로 번역해줍니다. 자바 컴파일러의 경우 .java 확장자를 지닌 파일(프로그래머가 이해할 수 있는 파일)을 입력으로 받아서, .class 확장자를 지닌 파일(컴퓨터가 이해할 수 있는 파일)을 출력으로 내놓습니다. IDE에선 프로그램 실행 시 자동으로 이를 처리해주며, 직접 해보고 싶다면 윈도우의 경우 CMD에서 'javac <filename>' 명령어를 사용하면 됩니다.
프로그램 실행하기
프로그램을 컴파일 했다면, 이젠 실행할 수 있습니다. 여러분의 프로그램이 컴퓨터의 제어권을 가져가는 멋진 순간입니다. 컴퓨터가 여러분의 지침을 따른다고 말하는 것이 더 정확하겠네요. 자바 프로그램은 자바 가상 머신(JVM, Java Virtual Machine) 내에서 구동됩니다. 따라서 이 프로그램을 더블클릭만으로 실행하긴 힘들고, IDE에서 실행 버튼을 누르거나, 직접 해보고 싶다면 윈도우의 경우 CMD에서 'java <filename>' 명령어를 사용하면 됩니다.
프로그램 1.1.1: Hello, World
public class HelloWorld { public static void main(String[] args) { System.out.print("Hello, World"); System.out.println();} } |
% java HelloWorld
Hello, World
<프로그램 1.1.1>은 완벽한 자바 프로그램의 예제입니다. 이름은 <HelloWorld>이며, <HelloWorld.java> 파일에 프로그램 코드가 있습니다. 이 프로그램의 유일한 행위는 터미널 윈도우에 메시지를 출력하는 것입니다. 이후에 저기서 쓰인 자바 용어들을 점진적으로 배워나갈 것이지만, 지금 당장은 중요치 않습니다.
<프로그램 1.1.1>을 프로그래머답게 설명하자면 다음과 같습니다. <프로그램 1.1.1>은 <HelloWorld>라는 이름의 단일 클래스로 이루어져 있으며, 단 하나의 메소드인 'main()'을 갖고 있다. 이 메소드는 다른 두 메소드 'System.out.print()'와 'System.out.println()'을 활용한다.
2.1절에서는 여러 개의 메소드를 정의하는 클래스들에 대해 배울 것이며, 우리가 작성할 모든 클래스는 전부 같은 구조를 갖습니다. 일단 지금은 '클래스'는 '프로그램'과 같다고 생각하세요.
메소드라 함은 다음 그림에서 'main() method'가 가리키고 있는 부분을 이야기 하는 용어입니다. 메소드의 첫째 줄에는 이름과 그 외 정보들을 적습니다. 이후에, 끝에 세미콜론이 찍힌 구문들을 적고, 이를 중괄호로 둘러쌉니다.
배우다보면, 프로그래밍의 의미는 클래스 이름을 정하고 그것의 main() 메소드에 구문들을 넣는 것이라고 생각할 수 있습니다. 앞으로 아주 다양한 프로그래밍의 구문들을 배워갈 것입니다. 벌써 터미널에 메시지를 출력하는 구문을 배운 것이고요.
자바 프로그램을 실행하면, 시스템은 여러분이 정의한 클래스 안에 있는 main() 메소드를 호출합니다. 그리고 구문(statements)들을 위에서부터 아래로 순서대로 실행합니다. 따라서 <HelloWorld>를 실행하면, 시스템은 main() 메소드를 호출하고, 두 개의 구문이 순서대로 실행될 것입니다. 첫째 구문은 System.out.print()이며, 큰따옴표 안에 있는 문장을 출력하는 구문입니다. 두 번째 구문은 System.out.println()이며, 줄바꿈을 하는 구문입니다.
1970년대부터, 프로그래밍 입문자의 첫 프로그램은 언제나 "Hello, World"를 출력하는 프로그램을 만드는 것이 전통이었습니다. 따라서 여러분들은 반드시 <프로그램 1.1.1>을 만들고, 컴파일하고, 실행해보셔야 합니다. 이는 프로그래밍을 배우는 수많은 사람들이 걸어온 발자취를 따라가는 영광스러운 일입니다. 터미널에 무언가를 출력하는 것이 그다지 흥미롭진 않을 수 있겠지만, 우리가 프로그램에서 필요로 하는 아주 기본적인 능력 중 하나는 이 프로그램이 어떻게 기능하는지 알아볼 수 있는 것입니다.
배우다보면, 우리의 프로그램들은 전부 <프로그램 1.1.1>과 같을 것입니다. main() 안의 구문들이 바뀐다는 것을 빼고요. 따라서 빈 페이지에서 프로그램을 작성하는 것보다는, <HelloWorld>를 복사해서 활용하는 것도 좋을 것입니다.
오류(Error)
만약 <프로그램 1.1.1>을 작성해보았다면, 벌써 오류를 접해봤을지도 모르겠네요. 오류를 쉽게 설명하자면, 사람의 잘못에 의해 일어나는 프로그램의 이상 행동입니다. 오류는 여러분이 프로그래밍을 하는 동안에는 끊임 없이 나타날 것입니다.
편집하고, 컴파일하고, 실행하는 것 사이의 경계는 흐릿해지기 쉽습니다. 여러분들은 프로그래밍을 배울 때, 저 경계를 뚜렷히 해야합니다. 불가피하게 나타나는 오류들을 잡아내기 더 쉬울테니까요. 문자 메시지를 보낼 때 오타를 수정하는 것처럼, 대부분의 오류는 수정하거나 피할 수 있습니다.
컴파일 에러는 프로그램을 컴파일 할 때 발생하는 오류입니다. 다른 오류로는 런타임 에러가 있습니다. 이는 프로그램이 실행되면서 발생하는 것들입니다. 버그라고 말하기도 하는 오류들은 굉장한 골칫거리들입니다. 여러분이 습득하게 될 기술 중 하나는 오류를 찾아내는 것입니다. 신중하고 조심스럽게 코딩하는 것은 많은 오류의 범람을 피할 수 있습니다.
프로그램 1.1.2: Using an argument
public class UseArgument { public static void main(String[] args) { System.out.print("Hi, "); System.out.print(args[0]); System.out.println(". How are you?"); } } |
% java UseArgument Alice
Hi, Alice. How are you?
% java UseArgument Bob
Hi, bob. How are you?
입출력
우리는 우리 프로그램에 무언가를 입력하고 싶습니다. 결과를 출력할 수 있는 어떤 데이터들 말이죠. 프로그램에 데이터를 입력하는 가장 간단한 방법은 <UseArgument>(프로그램 1.1.2)에 나와있습니다. <UseArgument>가 실행될 때마다, 이 프로그램은 해당하는 인자를 읽어 터미널에 메시지의 일부로 다시 출력합니다.
프로그램에 인자를 입력하는 방법에 대해서는 다음 포스팅을 참고하세요.
CMD 및 Eclipse에서 인자(Argument)와 함께 자바 프로그램 실행하기
인자를 전달하는 메커니즘에 대해서는 차후에 설명할 것이며, 지금 당장은 코드에 'args[0]'을 사용하는 것이 인자를 활용하는 방법이라고만 생각하세요.
우리가 입력한 것을 프로그램이 다시 출력하는 것은 어찌 보면 별 것 아니라고 생각할 수 있지만, 프로그램의 가장 강력한 기능 중 하나는 사용자가 입력한 것에 대해서 그에 맞는 반응을 보이는 것입니다. <UseArgument>는 자바의 기본적인 프로그래밍 메커니즘을 대변하며, 수많은 계산 문제들을 해결할 수 있게 합니다.
되돌아와서, 우리는 <UseArgument>를 통해, 문장(argument)을 다른 문장(terminal에 표시된 메시지)으로 대응시킬 수 있었습니다. 이는 우리의 자바 프로그램을 마치 입력 문자열을 출력 문자열로 바꾸는 블랙박스라고 생각할 수 있습니다. 가령, 자바 컴파일러는 한 문자열(.java 파일)을 이용해 다른 문자열(해당하는 .class 파일)을 만들어내는 것 그 이상 그 이하도 아닙니다.
당분간 우리는 프로그램의 입출력을 위한 자료의 형태와 그 크기 등의 다양한 한계에 직면할 것입니다. 1.5절에서는, 입출력을 위해 어떻게 정교한 메커니즘을 이용하는지 알아볼 것입니다. 차후에 특히 우리는 임의의 긴 입출력 문자열과 사운드나 그림 등 다른 유형의 데이터로 작업할 수 있게 될 것입니다.
댓글
댓글 쓰기