Book/Kotlin in Action

Kotlin in Action 1. Kotlin: what and why

도라프 2022. 10. 1. 00:32

GDSC에서 Kotlin 스터디를 시작하게 되었다. 

풀스택으로 가는 긴 여정! Kotlin 스터디를 하는 동안 안드 개발에도 발을 담궈보고 Kotlin Spring을 다뤄보는 경험을 하고 싶다!

과제는 '내가 생각하는 코틀린의 최대 장점을 생각해오기'이다!

 

스터디의 방식은 시험기간을 제외한 매주 금요일까지 Kotlin 기본서인 Kotlin in Action을 공부해서 Tistory에 올리는 것이다. Kotlin 마스터가 되어보자!

 

1. Kotlin: what and why

Kotlin은 무엇일까?

Kotlin은 Java 플랫폼을 타겟으로 한 새로운 프로그래밍 언어이다.

Java와 유사하지만 간결한 문법과 다양한 기능이 추가되었고, Java와 상호 운용이 100% 지원된다.

 

Java도 기억이 잘안나서 사실 Kotlin 코드를 보는데 이게 코드가 비슷한 건지..잘 모르겠어서 Java공부랑 병행해야할 것 같다는 생각을 했다..

 

 public class void main(String[] arges) //자바에서 메인함수를 호출하는 방법
 
 
 //Kotlin에서는 메인함수를 어떻게? 
 fun main(){
} //굉장히 간결하다!

 

 

<An early taste of Kotlin>

data class Person(val name: String,
				  val age: Int?= null) // 기본적으로 ?를 타입 뒤에 붙이면 null을 사용할 수 있다.

fun main(args: Array<String>){
	val persons= listOf(Person("Alice"),
    					Person("Bob",age = 29) 
    val oldest = persons.maxBy(it.age ?:0)//엘비스 연산자, lambda expression
    println("The oldest is : $oldest")
 }
 
 //결과 : The oldest is: Person(name = Bob, age = 29) //String이 자동 생성되었다.

맛보기 코드가 나와있는데, 앞으로 배우게 될 것이니 논의하지는 않겠음!

 

1.2.2 Kotlin Statically typed _ 정적타입 언어

런타임 시 변수의 '타입'이 결정되는 동적타입 언어와 다르게 정적타입 언어는 컴파일 시 변수의 '타입'이 결정된다. 

정적 타입 언어 사용시 타입 에러는 컴파일 시 에러가 뜨기 떄문에, 더 편하고 빠르게 에러 확인이 가능하다!

 

책에서 설명해주는 예시를 확인해보면

val x = 1

이 코드가 나와있다. 

여기서 Java와 다른 점이 나타나는데, Kotlin은 코드에서 모든 변수에 타입을 설정해주지 않아도 된다. val으로 변수를 선언해주면 Kotlin이 자동적으로 타입을 결정해준다. 위의 같은 경우에는 정수(Int)로 결정해준다. 

 

이렇게 문맥에 맞게 타입을 결정해주는 것을 타입 추론(Type Inference)이라 한다.

 

 

1.2.3 Functional and object-oriented

Java는 알다시피 객체 지향(object-oriented) 프로그래밍 언어이다. 그런데 functional programming은 무슨 뜻일까?

 

functionla programming의 개념은 다음과 같다

- first class function : 함수를 하나의 값처럼 활용할 수 있다. 함수를 변수에 저장할 수 있고 다른 함수의 인자로 보낼 수도, 다른 함수에서 리턴값으로 받아올 수도 있다. 그리고 함수값에서 리턴값을 지정하지 않아도 문맥상 정리를 

- Immutabilty : 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변 객체를 사용해 프로그램을 작성한다.

- No side effect 

함수형 프로그래밍에서는 입력이 같으면 항상 같은 출력을 내놓고 다른 객체의 상태를 변경하지 않으며, 함수 외부나 다른 바깥 환경과 상호작용하지 않는 순수 함수를 사용한다.

 

1장에는 특성이 많이 담겨있는데, 적고 싶은 부분은 서버 개발에 관련된 Kotlin on the server side 부분이다.

1.3.1 Kotlin on the server side

Kotlin의 서버 환경에서의 자아 큰 장점은 Java와 상호 운용(같은 프로젝트에 넣어도 같이 잘 돌아간다는 뜻)이 된다는 것이다!

이 말은 곧 Java 환경에서 개발된 코드를 수정하거나 컴포넌트를 작성할 때, Kotlin 개발자가 와서 작성해도 전혀 문제가 되지 않는다는 것이다!

 

내가 생각하는 Kotlin의 최대 장점 중 하나는 바로 이것이다.

개발자들은 수년 동안 Java로 이러한 종류의 응용 프로그램을 구축해 왔으며 구축에 도움이 되는 엄청난 양의 프레임워크와 기술을 축적했는데, Kotlin으로 이러한 프레임워크를 이어서 작성해도 "전혀" 문제가 되지 않는다.

 

우리는 자바로 사용되는 프레임워크에서 Kotlin을 통해 더 컴팩트하고, 관계성 있고, 유지하기 쉬운 시스템의 코드를 작성할 수 있다! 

 

Kotlin에서 주목할만한 장점 중 하나는 간결성이다. 

개발자는 깔끔한 코드를 읽을 수 있어야 하는데 코틀린에서 간결하고 깔끔한 API를 작성하도록 도와주는 여러가지 구문이있는데 이와 관련해서는 아래 링크를 참고하길 바란다.

https://taehyungk.github.io/posts/android-kotlin-dsl/

 

[Kotlin] DSL 만들기

Kotlin IN ACTION(출판사: 에이콘) 책을 통해 Kotlin을 배워보자

taehyungk.github.io

 

위의 예시로 Kotlin은 Builder 패턴을 지원해준다. (이 말은 곧 Kotlin에서 Builder Pattern은 필요없다는 의미이다!)

 

여기서 Builder 패턴은 무엇일까?

(빌더패턴을 공부하면서 내 자바 지식이 다 휘발되었음을 깨달았다..)

https://readystory.tistory.com/121

 

[생성 패턴] 빌더 패턴(Builder pattern) 이해 및 예제

빌더 패턴은 복잡한 객체를 생성하는 방법을 정의하는 클래스와 표현하는 방법을 정의하는 클래스를 별도로 분리하여, 서로 다른 표현이라도 이를 생성할 수 있는 동일한 절차를 제공하는 패턴

readystory.tistory.com

이 블로그에서 빌더패턴을 잘 설명해놨는데, 정리하자면 Builder Pattern은 인스턴스를 만드는 절차를 추상화하는 패턴인 생성패턴 중에 하나이다. (인스턴스 생성 절차는 객체 생성 절차라고 생각하면 될 것 같다.)

 

생성 패턴은 시스템이 어떤 구체 클래스를 사용하는지에 대한 정보를 캡슐화한다. 

생성 패턴은 클래스의 인스턴스들이 어떻게 만들고 어떻게 서로 맞붙는지에 대한 부분을 완전히 가린다.

그 중 Builder Pattern은 생성과 표기를 분리해 복잡한 객체를 생성한다. 그렇게 분리가 되면 서로 다른 표현이라도(표기법이라도) 이를 생성할 수 있는 동일한 절차를 제공한다. 

 

그러면 Java에서는 어떤 이유로 빌더 패턴을 사용할까? 

 

매개변수를 늘려가는 점층적 생성자 패턴을 쓸 수는 있지만, 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기가 어렵다. 그래서 점층적 생상자 패턴과 자바 빈 패턴의 장점을 결합한 것이 빌더 패턴이다.

 

Builder Pattern을 지원하는 Kotlin에서는 전체 추상화(abstraction) 과 코드 재사용 도구를 유지하면서 간결한 구문으로 모든 개체의 그래프를 만들 수 있다. Kotlin에서는 기본 생성자만으로도 값을 수정할 수 있고, 해당 컬럼에 기본값을 주게 되면 그 인자는 값을 할당해주지 않더라도 기본값이 들어가므로 생성할 수 있다.

 

간결성을 보여주는 간단한 예시 중 하나는 DSL(영역 특화 언어)을 이용한 HTML 생성 라이브러리이다.

 

- Kotlin에서 HTML 태그를 mapping해주는 함수와 Kotlin 언어 구문을 쉽게 합칠 수 있다.

//예시 코드
fun renderPersonList(persons: Collection<Person>) =
	createHTML().table {//HTML tag를 mapping해주는 함수
		for (person in persons) { //일반적인 Kotlin for문
			tr {
				td { +person.name } //HTML tag를 mapping해주는 함수
				td { +person.age }
			}
		}
	}
}

- DSL(영역 특화 언어)의 다른 예시 : SQL Database 구조를 Kotlin 코드의 쿼리로 구성할 수 있다. 

//예시 코드
object CountryTable : IdTable() {
	val name = varchar("name", 250).uniqueIndex()
	val iso = varchar("iso", 2).uniqueIndex()
}
class Country(id: EntityID) : Entity(id) {
	var name: String by CountryTable.name
	var iso: String by CountryTable.iso
}
val russia = Country.find {//sql database 구조를 순수한 Kotlin 코드로 만들고 쿼리를 진행할 수 있다.
	CountryTable.iso.eq("ru") 
}.first()

println(russia.name)

 

 

이 외에도 주목할 만한 장점이 Kotlin에는 많은데, 1장 정리는 여기서 끝내겠다.