본문 바로가기

Study/Book

다재다능 코틀린 프로그래밍 / 코틀린 시작하기

반응형

Chapter 1 코틀린 시작하기

코틀린은 객체지향 프로그래밍 + 비동기 프로그래밍 + 함수형 프로그래밍 + 스크립트

왜 코틀린을 선택해야 하는가?

- 보일러 플레이트 코드를 덜 쓰도록 해준다.

- 컴파일 시간 안정성

- 프로젝트에서 코틀린 코드와 JAVA 코드를 함께 사용할 수 있다. 프로젝트에 코틀린 점진적 도입 가능

 

Chapter2 JAVA개발자를 위한 코틀린 필수사항

1. 더 적은 타이핑

- 새미콜론 생략 가능

- 변수타입 지정 생략 가능

- 클래스와 함수 생략 가능

명령문이나 표현식이 메소드에 속할 필요가 없고, 메소드는 클래스에 속할 필요가 없다.

코드가 컴파일되거나, 스크립트로 실행될 때 코틀린은 JVM에서 실행하기 위해 필수적으로 필요한 랩퍼 클래스와 메소드를 생성한다.

- try-catch는 선택사항

개발자가 직접 다루지 않은 예외는 자동으로 호출한 코드로 전파된다.

 

2. 현명한 경고

fun compute(n:Int) = 0
println(compute(4)) //compute에서 전달된 파라미터는 사용되지 않는다.

/*
-->
0
unused.kts:1:13: warning: parameter 'n' is never used
fun compute(n: Int) = 0
*/

스크립트가 실행될때 코틀린은 결과를 표시하면서 사용하지 않는 파라미터에 대한 경고를 함께 준다.

3. var보다는 val

var : 수정가능

val : 수정불가능

코드를 추측하게 하는 것은 좋지 않다.

StringBuilder : 수정 가능

val이나 var 어느 것을 사용하든지 String 객체는 변화로부터 안전하다.

그러나, StringBuilder의 객체는 안전하지 않는다.

val message = StringBuilder("hello")
message = SttringBuilder("another") // 이렇게 하면 message 변수 자체는 수정 불가능이기때문에 오류가 난다.
message.append("there") // 이건 가능. StringBuilder가 수정가능하기 때문.

4. 향상된 동일성 체크

Java의 equlas() 메소드  또는 코틀린의 == 연산자는 값을 비교한다. '구조의 동일성'

Java의 == 연산자 또는 코틀린의 === 연산자는 참조 대상을 비교한다. '참조상의 동일성'

println("hi" == "hi") // true
println("hi" == "Hi") // false
println(null == "hi") // false
println("hi" == null) // false
println(null == null) // true

위 비교가 java의 equls()로 실행되었다면 런타임에서 NullPointerException 이란 결과가 나왔을 것이다.

코틀린은 null을 안전하게 다루기 때문에 가능하다. 

5. 문자열 템플릿

큰따옴표 문자열 안에서 $ 심볼을 변수 앞에 붙여주면 어떤 변수라도 문자열 안에 들어간다.

${}을 사용하면 복잡한 명령문도 들어갈 수 있다.

6. RAW 문자열

"""
Dear $name, hihi
	party ~~
"""

/*
---->
Dear ej, hihi
	party ~~
*/

""" 
Dear $name, hihi
	|party ~~
"""

/*
--->
Dear ej, hihi
party
*/

trimMargin() 메소드를 사용하면 (|) 문자가 나올 때까지 공백을 제거한다. 

trimMargin("~") -> (~) 문자가 나올때까지 공백 제거

7. 표현식은 많이, 명령문은 적게

- 표현식(expression) : value를 return하는 무언가

- 명령문(statement) : 명령/지시. 아무것도 return하지 않는다. (if, else, for, while 등이 포함) 

명령문은 상태가 변하고, 변수를 변하게 하고, 파일을 작성하고, 데이터베이스를 업데이트하는 등 부작용을 갖고있다.

명령문보다는 표현식이 좋다. 표현식은 결과를 리턴해주고, 어떤 상태도 변화시키지 않는다.

fun canVote(name: String, age:Int):String{
	var status: String
	if(age > 17){
		status = "yes, please vote"
	} else {
		status = "nope, please come back"
	}
	return "$name, $status"
}	

fun canVote2(name:String, age:Int):String{
	val status = if(age>17){
		 "yes"
	}else{
		 "No"
	}
	return "$name $status"
}