Note:이 연재는 'Do it! Kotlin Programming'에서 일부의 내용을 연재하고 있습니다. 완전한 내용은 책을 참고해 주세요!
설정을 마치면 다음과 같은 화면이 나타납니다. 이제 프로젝트를 만들 준비가 된 것이죠. 그러면 본격적으로 첫 번째 프로젝트를 만들어 볼까요? 앞으로 실습을 진행하면서 여러 번 프로젝트를 생성하기 때문에 이 내용을 잘 익혀둡니다.
Tip:[Import Project]는 다른 개발 도구의 프로젝트를 IntelliJ IDEA용으로 가져오는데 사용하고, [Open]은 현재 작업공간의 프로젝트를 여는 데 사용합니다. [Check out from Version Control]은 버전 관리 저장소로부터 소스를 가져올 수 있습니다. IntelliJ IDEA는 자주 업데이트 되므로 [Configure]를 통해 업데이트 내용을 반영하거나 기타 설정을 할 수 있습니다.
1. Welcome to IntelliJ IDEA 화면에서 [Create New Project]를 눌러 새 프로젝트를 만들겠습니다. [Create New Project]를 누르면 다시 새로운 프로젝트 설정 화면이 나타납니다. 가장 먼저 해야 할 일은 왼쪽의 [Kotlin]를 선택하고 오른쪽의 [Kotlin/JVM]을 선택한 다음 [Next] 버튼을 누릅니다.
2. 이제 두번째 화면에서 프로젝트 이름과 위치, SDK의 위치 등을 지정할 수 있습니다. 프로젝트 이름은 HelloKotlin으로 할 것입니다. 프로젝트의 위치는 자신의 계정 하위의 디렉터리가 기본 설정됩니다. 만일 한글이 포함된 경우 빌드가 안될 수 있으니 공간이 충분하고 너무 깊지 않은 영문으로 이루어진 디렉터리를 지정합니다. 만일 SDK의 위지가 정의되지 않은 경우 [New...] 버튼을 누르고 Zulu의 OpenJDK의 설치 위치를 지정해 줍니다. 모든 내용을 채운 후 [Finish]를 누릅니다.
▶ JDK 설치 경로를 잊으셨나요? JDK가 설치된 위치는 c:\Program Files\Zulu\zulu-8 입니다.
3. 프로젝트 첫 화면은 다음과 같습니다. 가장 윗부분에 HelloKotlin이라는 프로젝트 이름이 보이시나요? 프로젝트 이름 왼쪽에 있는 화살표 모양을 누르면 프로젝트 구조가 펼쳐집니다. 그런 다음 src 폴더에서 마우스 오른쪽 버튼을 누르고 [New → Kotlin File/Class] 메뉴를 선택해 보겠습니다.
▶ 왼쪽의 프로젝트 네비게이션 창이 나타나지 않은 경우 Alt +1 키를 눌러 열 수 있습니다.
▶ 윈도우에서는 src 폴더 위에서 Alt + Insert 키를 눌러 New 메뉴를 바로 실행할 수도 있습니다.
4. 그러면 새 코틀린 파일의 이름을 정하는 화면이 나타납니다. HelloKotlin을 입력하고 [OK]를 누르면 새 코틀린 파일이 만들어집니다.
Note: 쾌적한 코딩을 위해 글꼴 설정은 기본!
본격적인 코딩을 시작하기 전에 가독성이 높은 코드의 글꼴과 크기를 변경해 보겠습니다. 프로그래밍을 할때는 한 글자만 틀려도 작동하지 않기 때문에 숫자 0과 영문 O를 구분하거나 1과 소문자 l을 구분하는 것이 중요합니다. 이것을 명확히 구분해주는 글꼴을 사용해 봅시다.
설정을 위해 [Ctrl + Alt + S]를 누르거나 [File → Settings]를 눌러 설정 화면을 열어볼까요? 설정 화면에서 왼쪽 상단의 검색 상자에서 font를 입력하면 왼쪽 메뉴에 [Editor > Font] 메뉴로 이동합니다.
글꼴을 변경해 볼까요? 보통 개발자들은 쾌적한 코딩을 위해 적절한 글꼴을 선택하여 사용합니다. 이 책에서 사용하는 글꼴은 D2Coding입니다. D2Coding은 한글을 완벽하게 지원하여 가독성이 좋습니다. 다음 위치에서 내려받을 수 있습니다. 글꼴을 설치한 후에는 IntelliJ IDEA를 다시 시작합니다.
D2Coding 글꼴의 다운로드: https://github.com/naver/d2codingfont
최근 언어의 소스 코드에서 사용하는 여러가지 심볼인 powerline 심볼을 추가했으며 ligature 문자를 지원하여 특수 문자의 구분도 명확하게 할 수 있어 매우 편리합니다. 예를 들어 람다의 화살표식(->)이 심볼로 들어 있습니다. 마우스 휠로 글꼴 크기를 조정하면 매우 편리하겠죠. [General]을 누른 다음 Change font size (Zoom) with Ctrl + Mouse Wheel 체크 박스를 선택합니다. 그러면 [Ctrl] 키와 마우스 휠로 글자 크기를 마음대로 확대, 축소할 수 있습니다.
편집기 화면에 main을 입력하고 [Tab] 키를 누르면 자동으로 메인 함수가 만들어집니다. 이를 자동 템플릿 완성 기능이라고 부릅니다. 앞으로 자주 사용하게 될 기능이니 꼭 익숙해 지길 바랍니다.
fun main(args: Array<String>) {
}
혹은 다음과 같이 main()
함수의 매개변수를 사용하지 않는 경우 생략할 수도 있습니다.
fun main() {
}
다음과 같이 메인 함수에 출력문을 작성해 봅시다.
안녕 코틀린! | HelloKotlin.kt |
fun main() {
println("Hello Kotlin!")
}
코드를 입력했으니 이제 실행을 해야겠죠? 상단의 메뉴 [Run → Run…]을 찾아 눌러 실행합니다. 윈도우에서 Ctrl + Shift + F10 키를 눌러 프로그램을 실행할 수도 있습니다. 이후Debug 선택 화면에 실행 설정이 나타나면서 녹색 삼각형 버튼을 누르고 실행할 수도 있습니다.
▶ 더 간편한 방법으로 화면 상단에 보이는 [▶] 버튼을 눌러도 됩니다.
프로그램이 올바르게 실행되었다면 아래에 다음과 같은 화면이 나타납니다.
Tip:각 실행창의 단축키 이용
편집 화면의 각 창은 단축키를 가지고 있습니다. 왼쪽 제일 하단부의 아이콘을 클릭하면 각 창의 단축키를 볼 수 있습니다. 예를 들어 프로젝트(Project) 창은 윈도우에서는 Alt + 1, 맥에서는 Cmd + 1로 이동할 수 있습니다. 각 도구 창의 단축키는 다음과 같습니다.
단축키를 잘 활용해 손쉽게 각 편잡 창을 이동할 수 있도록 합니다. 특히, 자주 실행하여 결과를 볼 것이기 때문에 실행 창인 Alt+4 단축키는 외워 두는게 좋을 것 같습니다. 이 책에서는 주로 윈도우 운영체제의 단축키를 기준으로 설명합니다.
Hello Kotlin 코드는 간단하면서도 많은 내용을 가지고 있습니다. 앞으로 많은 장을 걸쳐 공부하게 될 내용도 가지고 있죠. 하지만 '먼저 맞는 매가 덜 아프다'는 속담이 있듯이 개념을 잘 몰라도 먼저 간단히 읽어봅니다. 이번 장에서는 전부 이해하려고 노력하지 않아도 됩니다. 추후에 다시 나오게 된다면 아하! 하며 좀 더 쉽게 이해하게 될 것입니다.
코틀린에서 main()
함수는 실행 진입점입니다. 자바와 같은 객체 지향 언어에서는 프로그램을 실행하려면 최소한 하나의 클래스와 그 안에 실행할 수 있는main()
함수가 있어야 합니다. 하지만 코틀린은 선언된 클래스가 없는데도 불구하고 main()
메서드 하나로 println()
함수를 통해 콘솔에 문자열 "Hello Kotlin"을 출력 하고 있습니다. 어떻게 이런 일이 가능할까요?
main()은 함수의 구조를 하고 있습니다. 보통 함수라고 불리는 용어는 클래스의 멤버가 되는 경우 메서드(Method) 혹은 특정 클래스의 멤버 메서드라고 부를 수 있습니다.
실제로 코틀린 코드는 JVM상에서 실행하기 위해서main 메서드는 파일명을 기준으로 자동으로 클래스가 생성됩니다. 만들어진 파일은 IntelliJ IDEA의 메뉴에 [Tools → Kotlin → Show Kotlin Bytecode]를 누른 후 생성된 화면에서 [Decompile]을 사용해서 어떤 형태로 소스가 해석 되었는지를 확인해 볼 수 있습니다.
HelloKotlin.kt 파일에서 그림처럼 각 번호를 따라 누르면 아래와 같은 소스를 볼 수 있습니다.
public final class HelloKotlinKt {
public static final void main() {
String var0 = "Hello Kotlin!";
System.out.println(var0);
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
}
생성된 소스에서 main()
메서드를 보면 HelloKotlinKt
클래스 안에 속한 멤버 메서드로 선언되어 있는 것을 알 수 있습니다. 이것은 자바 가상 머신인 JVM에 실행되기 위해, 문자열은 String var1
으로 선언되어 System.out.println()
에 의해 콘솔 장치에 출력 되는 것이죠.
main 메서드는 많은 개념을 내포하고 있는데요. 코드를 정의된 main()함수를 다시 한번 살펴 봅시다.
public static void main(String[] var0) {
public
은 가시성 지시자로 이 메서드의 접근 방법을 가리키고 있습니다. public
은 클래스인 HelloKotlinKt
외부 어디서는 접근 할 수 있다는 의미를 가지고 있습니다. 두번째 키워드로 static
은 이 메서드가 정적 메서드임을 나타내고 있습니다. static
으로 선언하면 프로그램의 정적 메모리 영역에 객체가 만들어지기 때문에 객체의 생성 없이 호출해 사용할 수 있게 됩니다. final
은 최종 메서드임을 나타내고 void
는 반환 할 것이 없는 경우 지정합니다.
Note:동적 메모리 영역
프로그램이 사용하는 메모리 영역에는 여러가지가 있습니다. 명령어가 들어가 있는 코드 영역과 프로그램이 컴파일 되면 문자열이나 정적 변수나 문자열 등이 들어간 정적 메모리 영역인 데이터(Data)가 있습니다. JVM에서는 이 영역을 메서드 정적 영역(Method Static Area)으로도 부르고 있습니다. 또 실행 중 생성되는 객체의 경우에는 동적 메모리 영역인 힙(Heap)이라고 불리는 곳에 만들어 집니다.
추가적으로 코드 블록인 중괄호({}) 안에 사용된 변수나 함수 호출 블록들은 임시로 쓰이는 메모리 영역인 스택(Stack)에 들어가며, 중괄호 블록이 끝나면 임시로 사용된 변수는 스택에서 제거가 됩니다.
프로그램의 일반적인 메모리 영역(program_memory.png)
데이터 영역은 정해서 있어서 실행 중에 오류가 날 가능성은 적습니다. 힙과 스택은 프로그램이 동작하는 도중에 그림의 화살표 방향으로 채워지기 때문에 너무 많이 메모리를 할당하는 객체를 있다면 'Out of Memory'오류가 날 수 있고, 함수 호출이 재귀적으로 너무 많이 일어나면 'Stack Overflow'가 발생할 수 있습니다. JVM을 사용하는 프로그램은 동적 할당 영역의 객체가 사용된 뒤 아무런 참조가 없으면 자동으로 삭제 시키는 GC(Garbage Collector)가 있습니다. 일종의 쓰레기 청소부가 우리도 모르게 쓸모 없는 객체를 치워주는 일을 한다고 생각하면 좋습니다.
main()
에서 매개변수 args: Array<String>
를 사용할 경우 자바의 String[] args
로 변환됩니다. 이 args
는 main()
에 전달할 외부의 인수들을 가리키게 되고, 명령행으로부터 입력 받은 값들이 차례로 배열에 들어가게 됩니다. 예를 들어 명령행 인자를 사용하는 방법은 다음과 같습니다. HelloKotlin.kt를 작성할 때와 동일하게 Project창의 src 위에서 [Alt + Insert]키를 누르고 MainArgs를 입력해 다음과 같이 작성합니다.
main()의 매개변수 사용해 보기 | MainArgs.kt |
fun main(args: Array<String>) {
println(args[0]) // 외부의 첫번째 인자
println(args[1]) // 외부의 두번째 인자
println(args[2]) // 외부의 세번째 인자
}
먼저 실행을 위해 [Shift + Alt + F10]을 누르면 main을 가진 실행 클래스들이 다음과 같이 나열 됩니다.
여기서 새롭게 작성한 MainArgsKt를 선택해 실행합니다. 실행 결과는 어떤가요?
Result |
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at MainArgsKt.main(MainArgs.kt:2) Process finished with exit code 1
여기서 ArrayIndexOutOfBoundsException 예외가 발생했습니다. 명령행으로부터 아무런 인자가 설정되어 있지 않기 때문이죠. 그러면 인자를 설정해 봅시다.
IntelliJ IDEA에서 직접 인자를 전달해 실행하고자 한다면 [Run] 메뉴에 [Edit Configurations]를 사용해 Program arguments에 필요한 명령행 인자를 나열할 수 있습니다.
그 다음 다시 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Result |
Good 안녕 123
명령행으로부터 받은 인자는 각각 args[0], args[1], args[2]
에 문자열 형태로 저장됩니다.
여기서 프로그램의 진입점 역할을 하는 main()
함수를 HelloKotlin.kt와 MainArgs.kt 파일을 통해 살펴봤습니다. 짧은 코드지만 많은 개념과 원리가 숨어 있다는 것을 알게 되었을 텐데요. 이렇게 쉬운 코드에 어려운 개념이 잔뜩 숨겨져 있었다니! 놀랐을 수도 있습니다. 하지만 항상 모든 것의 기본이 가장 어려운 것입니다. 이런 개념과 원리를 하나씩 밟아 가면서 기본에 충실하면 아무리 복잡한 코드가 나와도 손쉽게 이해할 수 있게 될 것입니다. 이제 코틀린과 함께하는 여행을 떠나 봅시다!
"어떤 것을 완전히 알려거든 그것을 다른 이에게 가르쳐라."
- Tryon Edwards -