Kotlin Basic Syntax(기본구문)

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

Kotlin 기본구문 익히기

kotlinlang 사이트의 가이드문서를 기반으로 포스팅 되었음을 밝힘니다.
Getting Started > Basic Syntax
출처: https://kotlinlang.org/docs/reference/basic-syntax.html
샘플코드: https://github.com/hanjoongcho/kotlin-cookbook

Table of Contents

패키지 선언

1
2
3
4
5
6
7
// 패키지의 선언은 소스파일의 제일 상단에 위치시켜야 합니다.
// 디렉토리와 패키지를 일치시킬 필요는 없습니다. 소스파일을 임의 디렉토리에 배치해도 무방합니다.
package my.demo

import java.util.*

// ...

함수 정의 1

1
2
3
4
5
6
7
8
9
10
11
// 정수 파라미터 2개를 받아 정수값을 리턴하는 함수
fun sum(a: Int, b: Int): Int {
return a + b
}

fun main(args: Array<String>) {
print("sum of 3 and 5 is ")
println(sum(3, 5))
}
--------------------------------------------------------
sum of 3 and 5 is 8

함수 정의 2

1
2
3
4
5
6
7
8
// 추론타입을 리턴하는 함수를 표현식과 함께사용
fun sum(a: Int, b: Int) = a + b

fun main(args: Array<String>) {
println("sum of 19 and 23 is ${sum(19, 23)}")
}
--------------------------------------------------------
sum of 19 and 23 is 42

함수 정의 3

1
2
3
4
5
6
7
8
9
10
// Unit타입(의미있는 값이 리턴하지 않음?? / kotlin.Unit)을 리턴하는 함수
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}")
}

fun main(args: Array<String>) {
printSum(-1, 8)
}
--------------------------------------------------------
sum of -1 and 8 is 7

함수 정의 4

1
2
3
4
5
6
7
8
9
10
// Unit타입 선언을 생략
fun printSum(a: Int, b: Int) {
println("sum of $a and $b is ${a + b}")
}

fun main(args: Array<String>) {
printSum(-1, 8)
}
--------------------------------------------------------
sum of -1 and 8 is 7

지역변수 정의 1

1
2
3
4
5
6
7
8
9
10
// 한번만 할당가능한(읽기전용) 지역변수 정의
fun main(args: Array<String>) {
val a: Int = 1 // immediate assignment
val b = 2 // `Int` type is inferred
val c: Int // Type required when no initializer is provided
c = 3 // deferred assignment
println("a = $a, b = $b, c = $c")
}
--------------------------------------------------------
a = 1, b = 2, c = 3

지역변수 정의 2

1
2
3
4
5
6
7
8
// 여러번 할당가능한 변수 정의
fun main(args: Array<String>) {
var x = 5 // `Int` type is inferred
x += 1
println("x = $x")
}
--------------------------------------------------------
x = 6

주석

1
2
3
4
5
6
// 한줄 주석
// This is an end-of-line comment

// 블럭 주석(Java와 달리 Kotlin의 블록 주석은 중첩 될 수 있습니다.)
/* This is a block comment
on multiple lines. */

string 템플릿

1
2
3
4
5
6
7
8
9
10
11
12
fun main(args: Array<String>) {
var a = 1
// simple name in template:
val s1 = "a is $a"

a = 2
// arbitrary expression in template:
val s2 = "${s1.replace("is", "was")}, but now is $a"
println(s2)
}
--------------------------------------------------------
a was 1, but now is 2

조건문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}

fun main(args: Array<String>) {
println("max of 0 and 42 is ${maxOf(0, 42)}")
}
--------------------------------------------------------
max of 0 and 42 is 42

null값 할당이 가능한 변수와 null값 체크 1

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
// A reference must be explicitly marked as nullable when null value is possible.
// Return null if str does not hold an integer:
fun parseInt(str: String): Int? {
return str.toIntOrNull()
}

fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)

// Using `x * y` yields error because they may hold nulls.
if (x != null && y != null) {
// x and y are automatically cast to non-nullable after null check
println(x * y)
}
else {
println("either '$arg1' or '$arg2' is not a number")
}
}


fun main(args: Array<String>) {
printProduct("6", "7")
printProduct("a", "7")
printProduct("a", "b")
}
--------------------------------------------------------
42
either 'a' or '7' is not a number
either 'a' or 'b' is not a number

null값 할당이 가능한 변수와 null값 체크 2

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
fun parseInt(str: String): Int? {
return str.toIntOrNull()
}

fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)

// ...
if (x == null) {
println("Wrong number format in arg1: '${arg1}'")
return
}
if (y == null) {
println("Wrong number format in arg2: '${arg2}'")
return
}

// x and y are automatically cast to non-nullable after null check
println(x * y)
}

fun main(args: Array<String>) {
printProduct("6", "7")
printProduct("a", "7")
printProduct("99", "b")
}
--------------------------------------------------------
42
Wrong number format in arg1: 'a'
Wrong number format in arg2: 'b'

타입확인과 자동 형변환 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// The is operator checks if an expression is an instance of a type. If an immutable local variable or property is checked for a specific type, there's no need to cast it explicitly
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` is automatically cast to `String` in this branch
return obj.length
}

// `obj` is still of type `Any` outside of the type-checked branch
return null
}


fun main(args: Array<String>) {
fun printLength(obj: Any) {
println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
}
printLength("Incomprehensibilities")
printLength(1000)
printLength(listOf(Any()))
}
--------------------------------------------------------
'Incomprehensibilities' string length is 21
'1000' string length is ... err, not a string
'[java.lang.Object@77459877]' string length is ... err, not a string

타입확인과 자동 형변환 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
fun getStringLength(obj: Any): Int? {
if (obj !is String) return null

// `obj` is automatically cast to `String` in this branch
return obj.length
}


fun main(args: Array<String>) {
fun printLength(obj: Any) {
println("'$obj' string length is ${getStringLength(obj) ?: "... err, not a string"} ")
}
printLength("Incomprehensibilities")
printLength(1000)
printLength(listOf(Any()))
}
--------------------------------------------------------
'Incomprehensibilities' string length is 21
'1000' string length is ... err, not a string
'[java.lang.Object@77459877]' string length is ... err, not a string

타입확인과 자동 형변환 3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fun getStringLength(obj: Any): Int? {
// `obj` is automatically cast to `String` on the right-hand side of `&&`
if (obj is String && obj.length > 0) {
return obj.length
}

return null
}


fun main(args: Array<String>) {
fun printLength(obj: Any) {
println("'$obj' string length is ${getStringLength(obj) ?: "... err, is empty or not a string at all"} ")
}
printLength("Incomprehensibilities")
printLength("")
printLength(1000)
}
--------------------------------------------------------
'Incomprehensibilities' string length is 21
'' string length is ... err, is empty or not a string at all
'1000' string length is ... err, is empty or not a string at all

for 반복문

1
2
3
4
5
6
7
8
9
10
fun main(args: Array<String>) {
val items = listOf("apple", "banana", "kiwi")
for (item in items) {
println(item)
}
}
--------------------------------------------------------
apple
banana
kiwi
1
2
3
4
5
6
7
8
9
10
fun main(args: Array<String>) {
val items = listOf("apple", "banana", "kiwi")
for (index in items.indices) {
println("item at $index is ${items[index]}")
}
}
--------------------------------------------------------
item at 0 is apple
item at 1 is banana
item at 2 is kiwi

while 반복문

1
2
3
4
5
6
7
8
9
10
11
12
fun main(args: Array<String>) {
val items = listOf("apple", "banana", "kiwi")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
}
--------------------------------------------------------
item at 0 is apple
item at 1 is banana
item at 2 is kiwi

when 표현식

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fun describe(obj: Any): String =
when (obj) {
1 -> "One"
"Hello" -> "Greeting"
is Long -> "Long"
!is String -> "Not a string"
else -> "Unknown"
}

fun main(args: Array<String>) {
println(describe(1))
println(describe("Hello"))
println(describe(1000L))
println(describe(2))
println(describe("other"))
}
--------------------------------------------------------
One
Greeting
Long
Not a string
Unknown

Using ranges 1

1
2
3
4
5
6
7
8
9
10
// in 연산자를 사용하여 숫자가 범위 내에 있는지 확인
fun main(args: Array<String>) {
val x = 10
val y = 9
if (x in 1..y+1) {
println("fits in range")
}
}
--------------------------------------------------------
fits in range

Using ranges 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// in 연산자를 사용하여 숫자가 범위 내에 있는지 확인
fun main(args: Array<String>) {
val list = listOf("a", "b", "c")

if (-1 !in 0..list.lastIndex) {
println("-1 is out of range")
}
if (list.size !in list.indices) {
println("list size is out of valid list indices range too")
}
}
--------------------------------------------------------
-1 is out of range
list size is out of valid list indices range too

Using ranges 3

1
2
3
4
5
6
7
8
// IntRange 반복
fun main(args: Array<String>) {
for (x in 1..5) {
print(x)
}
}
--------------------------------------------------------
12345

Using ranges 4

1
2
3
4
5
6
7
8
9
10
11
// or over a progression
fun main(args: Array<String>) {
for (x in 1..10 step 2) {
print(x)
}
for (x in 9 downTo 0 step 3) {
print(x)
}
}
--------------------------------------------------------
135799630

코틀린 컬렉션 1

1
2
3
4
5
6
7
8
9
10
11
// 컬렉션 반복
fun main(args: Array<String>) {
val items = listOf("apple", "banana", "kiwi")
for (item in items) {
println(item)
}
}
--------------------------------------------------------
apple
banana
kiwi

코틀린 컬렉션 2

1
2
3
4
5
6
7
8
9
10
// in 연산자를 사용하여 컬렉션에 개체가 포함되어 있는지 확인
fun main(args: Array<String>) {
val items = setOf("apple", "banana", "kiwi")
when {
"orange" in items -> println("juicy")
"apple" in items -> println("apple is fine too")
}
}
--------------------------------------------------------
apple is fine too

코틀린 컬렉션 3

1
2
3
4
5
6
7
8
9
10
11
12
// 람다 식을 사용하여 콜렉션 필터링 및 매핑
fun main(args: Array<String>) {
val fruits = listOf("banana", "avocado", "apple", "kiwi")
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { println(it) }
}
--------------------------------------------------------
APPLE
AVOCADO

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