Kotlin Idioms

이미지 출처: https://kotlinlang.org/assets/images/open-graph/kotlin_250x250.png

Kotlin Idioms

kotlinlang 사이트의 가이드문서를 기반으로 포스팅 되었음을 밝힘니다.
Kotlin에서 무작위로 자주 사용되는 Idiom 모음입니다.
코딩언어를 배울때 Basic Syntax라는 말은 많이 들어본거 같은데 Idiom이라는 말은 처음들어본거 같습니다. (ㅡ_ㅡ;)
직역하면 관용구 정도가 되는거 같은데 느낌상 주요문법 정도라고 생각하면 될 것 같습니다.
Getting Started > Idioms
출처: https://kotlinlang.org/docs/reference/idioms.html
샘플코드: https://github.com/hanjoongcho/kotlin-cookbook

Table of Contents

DTO 만들기

1
2
3
4
5
6
7
8
9
10
11
12
// 아래처럼 클래스를 선언하면 멤버변수 및 생성자 오버로딩을 별도로 하지 않아도 되는군요~

data class Customer(val name: String, val email: String) {}

fun main(args: Array<String>) {
var customer = Customer("Hanjoong Cho", "hanjoongcho@test.com")
println(customer.name)
println(customer.email)
}
--------------------------------------------------------
Hanjoong Cho
hanjoongcho@test.com

함수 파라미터 기본값 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
fun foo(a: Int = 0, b: String = "apple") {
println("Index $a is $b")
}

fun main(args: Array<String>) {
foo()
foo(1)
foo(2, "peach")
}
--------------------------------------------------------
Index 0 is apple
Index 1 is apple
Index 2 is peach

리스트에서 필터사용하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
fun main(args: Array<String>) {

// listOf 함수를 이용하여 리스트 선언
var list = listOf(-3, -1, 0, 1, 3, 5)

// 필터를 이용하여 0보다 큰값만 필터링
val positives = list.filter { x -> x > 0 }

// 필터를 이용하여 0보다 큰값만 필터링
val positives2 = list.filter { it > 0 }

// in 연산자를 이용해서 리스트를 순회
for (item in positives) {
println(item)
}

// in 연산자와 indices를 이용해서 index로 리스트를 순회
for (index in positives2.indices) {
println("$index: " + positives2[index])
}
}
--------------------------------------------------------
1
3
5
0: 1
1: 3
2: 5

String 리터럴 안에 표현식 넣기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 문자열 리터럴 안에 변수값을 넣을수 있습니다.
fun main(args: Array<String>) {
var name = "Hanjoong Cho"


// Kotlin
println("Name: $name")

// Java
println(String.format("Name: %s", name))
}
--------------------------------------------------------
Name: Hanjoong Cho
Name: Hanjoong Cho

map 순회하면서 key & value 출력하기

1
2
3
4
5
6
7
8
9
10
11
12
fun main(args: Array<String>) {
// hashMapOf 함수로 map 인스턴스 생성 및 key & value 설정
var map = hashMapOf("key1" to "apple", "key2" to "banana")

// map 순회하면서 key & value 출력
for ((k, v) in map) {
println("$k -> $v")
}
}
--------------------------------------------------------
key1 -> apple
key2 -> banana

in 연산자를 이용한 for, if문 제어하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
fun main(args: Array<String>) {
// i값이 1부터 시작해서 10까지 1씩 증가하면서 순회
for (i in 1..10) {
print("$i ")
if (i == 10) println()
}

// i값이 1부터 시작해서 9까지 1씩 증가하면서 순회
for (i in 1 until 10) {
print("$i ")
if (i == 9) println()
}

// i값이 2부터 시작해서 10까지 2씩 증가하면서 순회
for (i in 2..10 step 2) {
print("$i ")
if (i == 10) println()
}

// i값이 10부터 시작해서 1까지 1씩 감소하면서 순회
for (i in 10 downTo 1) {
print("$i ")
if (i == 1) println()
}

var num = 3
// num값이 1 ~ 10 사이에 포함되면 true
if (num in 1..10) {
print("$num is fit the range")
}

}
--------------------------------------------------------
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9
2 4 6 8 10
10 9 8 7 6 5 4 3 2 1
3 is fit the range

리터럴 할당이 한번만 가능한 읽기전용 객체

1
2
3
4
5
6
7
8
9
10
11
12
fun main(args: Array<String>) {
// Read-only list
val readOnlyList = listOf("a", "b", "c")
println(readOnlyList)

// Read-only map
val readOnlyMap = mapOf("a" to 1, "b" to 2, "c" to 3)
println(readOnlyMap)
}
--------------------------------------------------------
[a, b, c]
{a=1, b=2, c=3}

Map 객체 이용하기

1
2
3
4
5
6
7
8
9
10
11
fun main(args: Array<String>) {
var map = hashMapOf("key1" to "apple", "key2" to "banana")
println(map["key1"])
println(map)
map["key3"] = "pineapple"
println(map)
}
--------------------------------------------------------
apple
{key1=apple, key2=banana}
{key1=apple, key2=banana, key3=pineapple}

lazy로 상수 초기화 하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fun main(args: Array<String>) {
val lazyValue: String by lazy {
println("computed!")
"Hello"
}
println(lazyValue)
println(lazyValue)
println(lazyValue)
}
--------------------------------------------------------
computed!
Hello
Hello
Hello

상속없이 함수 확장하기

1
2
3
4
5
6
7
8
fun main(args: Array<String>) {
fun String.spaceToCamelCase() {
println("call String.spaceToCamelCase()")
}
"Convert this to camelcase".spaceToCamelCase()
}
--------------------------------------------------------
call String.spaceToCamelCase()

nullable 객체 컨트롤하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
fun main(args: Array<String>) {
val files = File("Test").listFiles()

// files 객체가 null이면 null를 출력하고 null이 아니면 size를 출력함
println(files?.size)

// files 객체가 null이면 empty를 출력하고 null이 아니면 size를 출력함
println(files?.size ?: "empty")

// map에 email 키값이 없을경우 "email not registered"를 리턴함
val map = mapOf("name" to "Hanjoong Cho")
val email = map["email"] ?: "email not registered"
println(email)

// 상수가 null이 아니면 블럭실행
val data = 81
data?.let {
println("Execute if not null data is $data")
}

// map이 null이 아니면 transformData 함수를 실행하고 결과값을 리턴
// map이 null이면 -1을 리턴
val mapped = map?.let { transformData(map) } ?: -1
println(map)
println(mapped)
}
--------------------------------------------------------
null
empty
email not registered
Execute if not null data is 81
{name=Hanjoong Cho}
{name=HANJOONG CHO}

Table of contents


Open source project on GitHub


Jupyter/IPython Notebook


Open API


NoSQL


Jekyll


Gradle


Kotlin


C++

  • C++ keywords
  • 윤성우 열혈강의 C++ 프로그래밍 예제코드 [펼치기]
    1. C언어 기반의 C++ 1
      • printf와 scanf를 대신하는 입출력 방식
      • 함수 오버로딩(Function Overloading)
      • 매개변수의 디폴트 값(Default Value)
      • 인라인 함수(Inline)함수
      • 이름공간(namespace)에 대한 소개
    2. C언어 기반의 C++ 2
      • 새로운 자료형 bool
      • 참조자(Reference)의 이해
      • 참조자(Reference)와 함수
      • maloc & free를 대신하는 new & delete
      • C++에서 C언어의 표준함수 호출하기
    3. 클래스의 기본
      • C++에서의 구조체
      • 클래스(Class)와 객체(Object)
      • 객체지향 프로그래밍의 이해
    4. 클래스의 완성
      • 정보은닉(Information Hiding)
      • 캡슐화(Encapsulation)
      • 생성자(Constructor)와 소멸자(Destructor)
      • 클래스와 배열 그리고 this 포인터
    5. 복사 생성자
      • ‘복사 생성자’ 와의 첫 만남
      • ‘깊은 복사’와 ‘얕은 복사’
      • 복사 생성자의 호출시점
    6. friend와 static 그리고 const
      • const와 관련해서 아직 못다한 이야기
      • 클래스와 함수에 대한 friend 선언
      • C++에서의 static
    7. 상속(Inheritance)의 이해
      • 상속에 들어가기에 앞서
      • 상속의 문법적인 이해
      • protected 선언과 세 가지 형태의 상속
      • 상속을 위한 조건
    8. 상속과 다형성
      • 객체 포인터의 참조관계
      • 가상함수(Vitual Function)
      • 가상 소멸자와 참조자의 참조 가능성
    9. 가상(Virtual)의 원리와 다중상속
      • 멤버함수와 가상함수의 동작원리
      • 다중상속(Multiple Inheritance)에 대한 이해
    10. 연산자 오버로딩 1
      • 연산자 오버로딩의 이해와 유형
      • 단항 연산자의 오버로딩의
      • 교환법칙 문제의 해결
      • cout, cin 그리고 endl의 정체
    11. 연산자 오버로딩 2
      • 반드시 해야 하는 대입 연산자의 오버로딩
      • 배열의 인덱스 연산자 오버로딩
      • 그 이외의 연산자 오버로딩
    12. String 클래스의 디자인
      • C++ 표준과 표즌 string 클래스
      • 문자열 처리 클래스의 정의
    13. 템플릿(Template) 1
      • 템플릿(Template)에 대한 이해와 함수 템플릿
      • 클래스 템플릿(Class Temlpate)
    14. 템플릿(Template) 2
      • Chapter 13에서 공부한 내용의 확장
      • 클래스 템플릿의 특수화(Class Temlpate Specialization)
      • 템플릿의 인자
      • 템플릿과 static
    15. 예외처리(Exception Handling)
      • 예외상황과 예외처리의 이해
      • C++의 예외처리 메커니즘
      • Stack Unwinding(스택 풀기)
      • 예외상황을 표현하는 예외 클래스의 설계
      • 예외처리와 관련된 또 다른 특성들
    16. C++의 형 변환 연산자
      • C++에서의 형 변환 연산

ETC