본 게시글은 Kotlin In Action을 공부하고 정리한 글로 내용이 책과 조금 다를 수 있습니다.
2장에서 다루는 내용
∎ 함수, 변수, 클래스, enum, 프로퍼티를 선언 하는 방법
∎ 제어 구조
∎ 스마트 캐스트
2.1 기본 요소: 함수와 변수
모든 프로그램을 구성하는 기본 단위인 함수와 변수를 살펴본다.
Hello, World
모든 언어의 시작 'Hello, World'를 찍는 방법이다
fun main(args: Array<String>) {
println("Hello, World!")
}
<실행>

위 코드에는 어떤 코틀린 문법이나 특성이 있을까?
- 함수의 선언은 fun키워드를 사용한다.
- 파라미터 이름 뒤에 타입을 쓴다.
- 함수의 최상위 수준에 정의할 수 있다.
- 배열도 일반 클래스와 마찬가지다. 자바와 달리 배열을 처리하기 위한 문법은 없다.
- 출력은 println이라 쓴다.
- (;)붙이지 않아도 된다
함수
결과를 반환하는 함수의 경우 변환 값의 타입을 어디에 지정해야하는지 알아보자.
fun main() {
println(max(4,3))
}
fun max(a:Int,b:Int):Int{
return if(a>b) a else b
}

fun max (a: Int, b: Int): Int{
- Int값 a와 b를 받는 함수max는 Int값을 반환한다.
return if(a>b) a else b
- 조건문 a>b가 참일경우 a가 아닐경우 b가 출력 된다.
if가 문장이 아니고 결과를 만드는 식이라는 점이 중요하다.
(java일 결우 return문에 if문이 들어갈 수 없다.)
max함수를 더 간결하게 짤 수 있다.
fun main() {
println(max1(4,3))
}
fun max1(a: Int, b: Int): Int = if(a>b) a else b
결과 값은 동일 하다.
Int이후 중괄호 {}를 사용하지 않고 수식의 형태인 = 을 사용해서 더 간결하게 만들수 있다.
본문이 중괄호로 둘러 싸인 함수를 블록이 본문인 함수라 부르고, 등호와 식으로 이루어진 함수를 식이 본문인 함수라 부른다.
함수의 반환타입을 지정하지 않으면 더 간결한 문장이 가능하다.
fun max1(a: Int, b: Int) = if(a>b) a else b
앞에서 살펴본 코틀린의 기능인 타입추론 덕에 가능하다.
변수
코틀린에서는 타입을 지정하지 않고 생략하는 경우가 흔하다
val question = "점심 메뉴는 무엇을 먹을지에 대한 질문"
val answer = "120"
위에서는 타입표기를 생략했지만, 명시해도 괜찮다.
val answer : Int = "120"
초기화 식을 사용하지 않고 문자를 선언하는 경우 반드시 타입을 명시해야한다.
val answer : Int
answer = 120
val - value에서 따왔으며, 변경 불가능한 함수를 저장한다. 자바에서 final에 해당한다.
var - variable에서 따왔으며, 변경 가능한 함수를 저장한다. 자바에서 일반 변수에 해당한다.
가능하면 모든 변수는 val로 선언하고 필요할때만 var을 사용하라.
더 쉽게 문자열 형식: 문자열 템플릿
fun main(args: Array<String>) {
val name = if (args.size > 0) args[0] else "Kotlin"
print("Hello, $name!")
}
코드는 문자열 템플릿의 사용을 보여준다. name변수를 선언하고 다음 줄에 문자열 리터럴 안에 그 변수를 사용했다.
문자열 리터럴의 필요한 곳에 변수를 넣되 변수 앞에 $를 추가한다.
//java
System.out.println("Hello, " + name + "!");
$를 문자열에 넣고 싶으면 \로이스케이프 시켜 \$로 사용한다.
식도 {}를 사용 해서 문자열 템플릿 안에 넣을수 있다.
Ex) println("Hello, ${ args[0] }!") //Kotlin
{}안에서 ""를 사용 할수 있다.
Ex) println("Hello, ${ if (args.size > 0) args[0] else "someone" }!") //Kotlin
2.2 클래스와 프로퍼티
클래스를 선언하는 기본 문법에 대해 말하려 한다.
자바빈 클래스인 Person을 정의하고, name이라는 프로퍼티를 넣어 본다.
그리고 인텔리 제이 기능을 통해 같은 클래스를 코틀린으로 convert해보자.

차이를 보자면 getter가 보이지 않고, public도 보이지 않는다.
자바에서는 생성자 본문에 getter, setter와 같은 코드가 반복적으로 들어가는 경우가 많다.
코틀린에서는 이러한 대입 로직을 훨씬 적은 코드로 작성 할 수있다.
코틀린의 기본 가시성은 public이라 생략이 가능하다.
프로퍼티
클래스라는 개념의 목적은 데이터를 캡슐화하고 캡슐한 데이터를 다루는 고들르 한 주제에 다루는 것이다.
자바에서는 데이터를 필드에 저장하고, 멤버 필드의 가시성은 private다. 클래스는 자신을 사용하는 클라이언트가 그 데이터에 접근하는 통로로 쓸 수 있는 접근자 메서드를 제공한다. 보통 필드를 읽기 위한 게터를 제공하고 필드를 변경하게 허용하는 경우 세터를 추가 제공할 수 있다.
자바에서는 필드와 접근자를 한데 묶어 프로퍼티라 한다. 이를 사용하는 프레임 워크가 많다. 코틀린은 프로퍼티를 언어 기본 기능으로 제공하며, 코틀린 프로퍼티는 자바의 필드와 접근자를 완전히 대신한다. 클래스에서 프로퍼티를 선언할때 val이나 var을 사용한다.
class Person(
val name: String, //읽기 전용 프로퍼티로,
// 코틀린은 (비공개)필드와 필드를 읽는 단순한 (공개)게터를 만든다.
var isMarried: Boolean //쓸 수 있는 프로퍼티로,
// 코틀린은 (비공개)필드,(공개)게터, (공개)세터를 만든다.
)
코툴린에서 Person clss를 사용하면 다음과 같이 사용 할 수 있다.
fun main(){
val person = Person("Sso",false)
println(person.name)
println(person.isMarried)
}
>>Sso
>>false
출력은 다음과 같다.
커스텀 접근자
class Rectangle (val height : Int, val width: Int) {
val isSquare: Boolean
get() {
return height == width
}
}
get()으로 게터를 생성 할 수 있다.
get() = height == width로 return 이 없는 없는 더 간결한 문장으로 만들수 있다.
코틀린 소스코드 구조: 디렉터리와 패키지

import사용 예제이다.
경로 Chaper2.geometry.shapes에 저장된 List2-8.kt코드를 보자
package Chaper2.geometry.shapes
import java.util.Random //표준 자바 라이브러리 클래스인 Random 클래스를 임포트 했다
class Rectangle(val height: Int, val width: Int) {
val isSquare: Boolean
get() = height == width
}
fun createRandomRectangle(): Rectangle {
val random = Random()
return Rectangle(random.nextInt(), random.nextInt())
}
fun createRandomRectangle(): Rectangle = Rectangle(Random().nextInt(), Random().nextInt()) 이렇게도 표현이 가능하다.
경로 package Chaper2.geometry.example에 저장된 List2-9.kt코드를 보자.
package Chaper2.geometry.example
import Chaper2.geometry.shapes.createRandomRectangle // list2-8에 저장된 함수를 임포트
fun main(){
println(createRandomRectangle().isSquare)
}
import Chaper2.geometry.shapes.*로 작성해도 같은 결과 값을 얻을 수 있다.
'App > Kotlin' 카테고리의 다른 글
| 1장 코틀린이란 무엇이며, 왜 필요한가? (0) | 2022.06.30 |
|---|---|
| 0장 Kotlin In Action 공부 시작 (0) | 2022.06.30 |