Statement & Expression
표현식(Expression)과 서술문(Statement)
Statement - 진술, 서술, 서술문
- 실행 가능한(Executable) 최소의 독립적인 코드.
- for 문과 같은 제어문 등이 포함된다.
- 쉽게 얘기해 “~문” 이라고 불림
- 코드는 오류를 발생시키지 않는 Statement의 집합이다.
Expression - 식, 수식, 표현식
- Statement의 부분 집합
- 이것도 소스 코드의 일부이기에 Statement이다.
- 평가(Evaluation)를 통해 하나의 ‘값’이 되는 코드 - 수학 연산, 함수 호출 등
- 사칙 연산은 모두 Expression이다.
- 코드 작성 기준으로 생각하면 결국 값이 되는가? 를 생각해보면 된다.

→ 하나의 값이 될 예정인 것은 Expression 이다.
- 언어별로 표현식의 종류가 다르다.
- 할당문의 예
- C : Expression
- Java : Expression
int a = b = c = 0; // 사용 가능 if (( a = b ) < 3) // 사용 가능 // 연속 할당
- Python3 : Statement
a = 0 b = 0 c = 0 # 연속할당 불가능
- Kotlin : Statement : print 하거나 if문에 사용하거나 연속할당 할 수 없음.
https://kotlinlang.org/spec/expressions.html - C : Expression
- 할당문의 예
Kotlin language specification
Kotlin does not explicitly distinguish between statements, expressions and declarations, i.e., expressions and declarations can be used in statement positions. This section focuses only on those statements that are not expressions or declarations. For info
kotlinlang.org
Kotlin language specification
Example: integer literal 0x01 has value 111 and therefore has type ILT(kotlin.Byte,kotlin.Short,kotlin.Int,kotlin.Long)\operatorname{\text{ILT}}(\operatorname{\texttt{kotlin.Byte}}, \operatorname{\texttt{kotlin.Short}}, \operatorname{\texttt
kotlinlang.org
기본 문법
https://kotlinlang.org/docs/basic-syntax.html
기본 정보
- 파일의 확장자는 kt
- 파일 이름과 클래스 이름이 같지 않아도 된다.
- 한 파일에 두 개 이상의 클래스를 선언할 수 있다.
- 한 파일에 클래스가 하나만 있는 경우 파일과 클래스 이름을 같게 하는 것을 권장한다.
- 클래스에 소속되지 않는 함수, 변수가 있다.
- Top level function / variable 이라 부른다.
- 문장 끝에 “;” 를 생략할 수 있다.
- 소스코드 제일 상단에 package 선언, 그 다음 import 구문들을 적는다.
package com.exmaple.hellokotlin
import kotlin.text.*
- 폴더 구조와 패키지 구조가 같지 않아도 된다.
- Console 앱의 진입점은 main 함수이다.
fun main() {
println("Hello")
}
타입(Type)
- 타입은 이름 : Type 의 형식을 따른다.
- 변수
val a: Int = 1 var name: String = "Hello Kotlin"
- 할당되는 값을 통해 타입을 추론할 수 있는 경우 타입 표기를 생략할 수 있다.
val b = 2
- 변수
- 함수의 반환 타입
fun sum(a: Int, b: Int): Int {
return a + b
}
특별한 값을 반환하지 않는 함수는 Unit 타입을 사용하거나 생략할 수 있다.
변수
- 한 번만 할당 할 수 있는지, 여러 번 할당 할 수 있는지에 따라 선언이 다르다.
- val : 한 번만 값 할당 가능.

- var : 여러 번 할당 가능.

기본 출력
- print, println

기본 입력
- readln():String : String 타입으로 터미널에서 입력을 받는다.
주석
- Java의 주석(// 과 /* */) 을 모두 지원하며 /* */ 주석의 경우 중첩할 수 있다.

예제
message 변수에 "Hello" 를 할당하고 print 문을 이용해 출력하라
fun main() {
val message = "Hello"
print("$message") // 혹은 print(message)
}

Basic Types
Null Safety
- kotlin의 모든 타입은 기본적으로 null을 허용하지 않는 타입
- null을 허용하고자 할 때는 기본 타입 뒤에 ? 를 추가하여 선언한다.
var city: String = "London"
var state: String? = null
- null을 허용하는 타입의 경우 사용할 때 null 여부를 체크해야 한다.
- null 대응
- if를 이용해 null 체크하고 사용
val l = if (b != null) b.length else -1
- Safe call(?) 연산자를 이용한 안전한 멤버 함수 사용
val b: String? = null
println(b?.length)- null을 할당하는 것은 문법적, 런타임에서 문제가 되지 않는데, Property나 함수를 사용할 때 문제가 발생
- null 일 때 Property나 멤버 함수에 접근할 때 문제 발생
val b: String? = null
println(b?.length)
val a: String? = "Hello"
println(a?.length)

- null 대응하기
- Elvis 연산자 (?:)를 이용
- 연산자 앞의 값이 널이 아니면 사용하고 null 이면 연산자 뒤의 값을 사용
fun main() { var str: String? = null var result = str ?: "Hello" println(result) }
- str가 null 이면 “Hello” 라는 값을 대신해서 사용한다.
- Not null assertiton operator ( !! )
- null 허용 타입을 null이 아닌 타입으로 변환해 반환.
- 변수를 선언할 때는 null을 허용하는 타입으로 선언, 코드를 짜다보면 어떠한 특정 시점에서 null이 아니라는 게 확신을 가질 때 일시적으로 null을 허용하지 않는 타입으로 변경
var value:String? = "ABC" val value2 = value!!
- 코드의 동작 순서 상 절대 null 이 아닌 상황에서만 사용 , !! 를 사용할 당시 null 인 경우 Exception이 발생한다.
- Elvis 연산자 (?:)를 이용
Any, Numbers
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/
- Kotlin의 최상위 클래스. Java의 Object 클래스에 해당하는 클래스이다.
- Any? : Nullable 한 모든 클래스들의 최상위 객체
- Any : Null을 허용하지 않는 모든 클래스들의 최상위 객체
- 숫자 : Kotlin에서는 Int, Float 등도 모두 클래스이다.
- Null이 아닌 숫자는 java의 int, float 등으로 처리 됨.
- Nullable 숫자인 경우 java의 Integer, Double 등의 클래스 객체로 생성됨.
var c:Int = 10 // Java형 => int c = 10; var a:Int? = null // Java형 => Integer a = new Integer();
- 정수형 타입

- 타입을 생략할 경우 할당하는 값이 정수 범위이면 자동으로 정수로 추론된다.

- 실수형 타입


- 16진수 0x, 2진수 0b, 가독성을 높이기 위해 _ 를 중간에 넣을 수 있다
- Unsigned integers
- UByte: 8-bit, 0~255
- UShort: 16-bit, 0~65535
- UInt: 32-bit, 0~2^32-1
- ULong: 64-bit, 0~2^64-1
- 형 변환 함수
- 숫자 타입 : 자동으로 형 변환 되지 않음. 함수를 통해 명시적으로 변환
- Boolean
- true, false 값을 가지는 객체(=null 가능)
- true, false 값을 가지는 객체(=null 가능)
- Char
- 한 글자를 저장하는 타입. 작은 따옴표를 사용한다.
- String
- 문장을 저장하는 변수. 큰 따옴표로 선언한다.
- 여러 줄 문장은 큰 따옴표를 3개 적어 선언한다.
- 기본적으로 불변(Immutable) 타입
- 대문자로, 소문자로 하는 각종 변환을 할 경우 원본의 데이터는 그대로 놔두고 변환을 한 새로운 String 객체가 생성된다.
- String template
- $ 기호 또는 ${ }를 이용해 변수 값이 포함된 문자열을 만들 수 있다.
- 변수와 템플릿 문자열 사이에 공백이 없다면 { } 를 반드시 사용한다.
- { } 에는 expression이 들어갈 수 있다.

Range & Progression
Range : 숫자의 범위를 의미하는 데이터 타입 1..2 또는 1.rangeTo(2)
- (1..4) 또는 1.rangeTo(4) → 1부터 4까지의 범위 , 끝이 닫힌 범위
- (1..<4) 또는 1.rangeUntil(4) → 1부터 4미만까지의 범위,. 끝이 열린 범위
- 1.0..4.0과 같이 Double/Float 타입도 가능하다.
- 정수 타입은 반복문에서 iteration 할 수 있다. (iteration : 결과를 생성하기위한 프로세스의 반복)
- downTo 연산자를 사용하면 역순으로 iteration이 가능하다.

- step 함수를 이용하여 간격을 정해 iteration 할 수 있다.

Range에서 가장 많이 사용할 것 .random 함수와 iteration
Progression : sequence of numbers, 정수형 타입(Int, Long, Char)을 대상으로함
- first, last, step 속성을 가진다.
- Range에 대해 iteration을 하는 것은 암시적으로 progression이 생성된 것.
- Prograssion은 iterable 하므로 filter, map 등의 Collection 함수들을 사용할 수 있다.
- Range에 대해 iteration을 하는 것은 암시적으로 progression이 생성된 것.
Range는 시작점과 끝점 사이의 모든 값을 포함하는 연속된 값의 시퀀스를 표현
Progression은 시작값, 끝값, 그리고 증가 또는 감소하는 단계값을 가지는 값의 시퀀스를 표현
- Range : 1 .. 10 = 연속된 값의 시퀀스
- Progression : 1 .. 10 step 2 : 1~10까지의 2씩 증가하는 값을 가진 시퀀스
타입 체크
- is 또는 !is 연산자를 이용한다.

- is 연산자를 사용한 경우 smart cast가 이루어진다.

Type Cast
- as 연산자를 사용하며 cast가 불가능 한 경우 exception이 발생하므로 unsafe cast 연산자라고 한다.
- cast가 불가능할 경우 null을 반환하는 safe cast 연산자는 as? 이다.

fun main() {
val x = 123
val int :Double = x as Double // 사용 시 CastError 발생
// as? 사용 시 Error 발생 하지 않고 null로 바뀜
val int :Double? = x as? Double
println(int)
}
함수의 기본
- 함수는 fun 키워드를 이용해 정의한다.
- 함수의 return type은 파라미터 정의 뒤에 : 와 함께 적는다.
- 함수의 body로 expression을 사용할 수 있다.
- 특별한 값을 반환하지 않는 경우 return type을 Unit로 정의하거나 생략할 수 있다.
- 함수의 return type은 파라미터 정의 뒤에 : 와 함께 적는다.
터미널 입력과 출력
- 입력 함수
- readln( ) : String
- 출력 함수 : 파라미터로 String 전달
- print( ), println( )
실습
- 파라미터로 받은 정수의 부호를 바꾸어 반환하는 함수 inv 를 선언
- main 함수에서는 사용자로부터 정수를 입력받은 다음 위 함수의 결과를 출력하라.
fun inv(value:Int):Int = -value
val input = readln().toInt()
println("${inv(input)}")
Package And Import
- package 선언은 파일의 가장 위에 한다.
- import 구문을 이용해 다른 패키지를 불러 사용할 수 있다.
- Java와 다른 점
- package와 실제 폴더 구조가 달라도 된다.
- as 키워드를 이용해 package에 별칭을 부여할 수 있다.
Package definition
- 최상위(Top-level)에 선언된 변수, 함수들은 기본적으로 public
- private으로 선언할 경우 같은 파일에서만 access 할 수 있다.
- internal로 선언할 경우 같은 모듈(함께 컴파일되는 파일들)에서 access
- protected는 사용할 수 없다
- 다른 패키지의 최상위 레벨 변수나 함수를 쓰려면 import 해야한다.
Statement & Expression
표현식(Expression)과 서술문(Statement)
Statement - 진술, 서술, 서술문
- 실행 가능한(Executable) 최소의 독립적인 코드.
- for 문과 같은 제어문 등이 포함된다.
- 쉽게 얘기해 “~문” 이라고 불림
- 코드는 오류를 발생시키지 않는 Statement의 집합이다.
Expression - 식, 수식, 표현식
- Statement의 부분 집합
- 이것도 소스 코드의 일부이기에 Statement이다.
- 평가(Evaluation)를 통해 하나의 ‘값’이 되는 코드 - 수학 연산, 함수 호출 등
- 사칙 연산은 모두 Expression이다.
- 코드 작성 기준으로 생각하면 결국 값이 되는가? 를 생각해보면 된다.

→ 하나의 값이 될 예정인 것은 Expression 이다.
- 언어별로 표현식의 종류가 다르다.
- 할당문의 예
- C : Expression
- Java : Expression
int a = b = c = 0; // 사용 가능 if (( a = b ) < 3) // 사용 가능 // 연속 할당
- Python3 : Statement
a = 0 b = 0 c = 0 # 연속할당 불가능
- Kotlin : Statement : print 하거나 if문에 사용하거나 연속할당 할 수 없음.
https://kotlinlang.org/spec/expressions.html - C : Expression
- 할당문의 예
Kotlin language specification
Kotlin does not explicitly distinguish between statements, expressions and declarations, i.e., expressions and declarations can be used in statement positions. This section focuses only on those statements that are not expressions or declarations. For info
kotlinlang.org
Kotlin language specification
Example: integer literal 0x01 has value 111 and therefore has type ILT(kotlin.Byte,kotlin.Short,kotlin.Int,kotlin.Long)\operatorname{\text{ILT}}(\operatorname{\texttt{kotlin.Byte}}, \operatorname{\texttt{kotlin.Short}}, \operatorname{\texttt
kotlinlang.org
기본 문법
https://kotlinlang.org/docs/basic-syntax.html
기본 정보
- 파일의 확장자는 kt
- 파일 이름과 클래스 이름이 같지 않아도 된다.
- 한 파일에 두 개 이상의 클래스를 선언할 수 있다.
- 한 파일에 클래스가 하나만 있는 경우 파일과 클래스 이름을 같게 하는 것을 권장한다.
- 클래스에 소속되지 않는 함수, 변수가 있다.
- Top level function / variable 이라 부른다.
- 문장 끝에 “;” 를 생략할 수 있다.
- 소스코드 제일 상단에 package 선언, 그 다음 import 구문들을 적는다.
package com.exmaple.hellokotlin
import kotlin.text.*
- 폴더 구조와 패키지 구조가 같지 않아도 된다.
- Console 앱의 진입점은 main 함수이다.
fun main() {
println("Hello")
}
타입(Type)
- 타입은 이름 : Type 의 형식을 따른다.
- 변수
val a: Int = 1 var name: String = "Hello Kotlin"
- 할당되는 값을 통해 타입을 추론할 수 있는 경우 타입 표기를 생략할 수 있다.
val b = 2
- 변수
- 함수의 반환 타입
fun sum(a: Int, b: Int): Int {
return a + b
}
특별한 값을 반환하지 않는 함수는 Unit 타입을 사용하거나 생략할 수 있다.
변수
- 한 번만 할당 할 수 있는지, 여러 번 할당 할 수 있는지에 따라 선언이 다르다.
- val : 한 번만 값 할당 가능.

- var : 여러 번 할당 가능.

기본 출력
- print, println

기본 입력
- readln():String : String 타입으로 터미널에서 입력을 받는다.
주석
- Java의 주석(// 과 /* */) 을 모두 지원하며 /* */ 주석의 경우 중첩할 수 있다.

예제
message 변수에 "Hello" 를 할당하고 print 문을 이용해 출력하라
fun main() {
val message = "Hello"
print("$message") // 혹은 print(message)
}

Basic Types
Null Safety
- kotlin의 모든 타입은 기본적으로 null을 허용하지 않는 타입
- null을 허용하고자 할 때는 기본 타입 뒤에 ? 를 추가하여 선언한다.
var city: String = "London"
var state: String? = null
- null을 허용하는 타입의 경우 사용할 때 null 여부를 체크해야 한다.
- null 대응
- if를 이용해 null 체크하고 사용
val l = if (b != null) b.length else -1
- Safe call(?) 연산자를 이용한 안전한 멤버 함수 사용
val b: String? = null
println(b?.length)- null을 할당하는 것은 문법적, 런타임에서 문제가 되지 않는데, Property나 함수를 사용할 때 문제가 발생
- null 일 때 Property나 멤버 함수에 접근할 때 문제 발생
val b: String? = null
println(b?.length)
val a: String? = "Hello"
println(a?.length)

- null 대응하기
- Elvis 연산자 (?:)를 이용
- 연산자 앞의 값이 널이 아니면 사용하고 null 이면 연산자 뒤의 값을 사용
fun main() { var str: String? = null var result = str ?: "Hello" println(result) }
- str가 null 이면 “Hello” 라는 값을 대신해서 사용한다.
- Not null assertiton operator ( !! )
- null 허용 타입을 null이 아닌 타입으로 변환해 반환.
- 변수를 선언할 때는 null을 허용하는 타입으로 선언, 코드를 짜다보면 어떠한 특정 시점에서 null이 아니라는 게 확신을 가질 때 일시적으로 null을 허용하지 않는 타입으로 변경
var value:String? = "ABC" val value2 = value!!
- 코드의 동작 순서 상 절대 null 이 아닌 상황에서만 사용 , !! 를 사용할 당시 null 인 경우 Exception이 발생한다.
- Elvis 연산자 (?:)를 이용
Any, Numbers
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-any/
- Kotlin의 최상위 클래스. Java의 Object 클래스에 해당하는 클래스이다.
- Any? : Nullable 한 모든 클래스들의 최상위 객체
- Any : Null을 허용하지 않는 모든 클래스들의 최상위 객체
- 숫자 : Kotlin에서는 Int, Float 등도 모두 클래스이다.
- Null이 아닌 숫자는 java의 int, float 등으로 처리 됨.
- Nullable 숫자인 경우 java의 Integer, Double 등의 클래스 객체로 생성됨.
var c:Int = 10 // Java형 => int c = 10; var a:Int? = null // Java형 => Integer a = new Integer();
- 정수형 타입

- 타입을 생략할 경우 할당하는 값이 정수 범위이면 자동으로 정수로 추론된다.

- 실수형 타입


- 16진수 0x, 2진수 0b, 가독성을 높이기 위해 _ 를 중간에 넣을 수 있다
- Unsigned integers
- UByte: 8-bit, 0~255
- UShort: 16-bit, 0~65535
- UInt: 32-bit, 0~2^32-1
- ULong: 64-bit, 0~2^64-1
- 형 변환 함수
- 숫자 타입 : 자동으로 형 변환 되지 않음. 함수를 통해 명시적으로 변환
- Boolean
- true, false 값을 가지는 객체(=null 가능)
- true, false 값을 가지는 객체(=null 가능)
- Char
- 한 글자를 저장하는 타입. 작은 따옴표를 사용한다.
- String
- 문장을 저장하는 변수. 큰 따옴표로 선언한다.
- 여러 줄 문장은 큰 따옴표를 3개 적어 선언한다.
- 기본적으로 불변(Immutable) 타입
- 대문자로, 소문자로 하는 각종 변환을 할 경우 원본의 데이터는 그대로 놔두고 변환을 한 새로운 String 객체가 생성된다.
- String template
- { }를 이용해 변수 값이 포함된 문자열을 만들 수 있다.
- 변수와 템플릿 문자열 사이에 공백이 없다면 { } 를 반드시 사용한다.
- { } 에는 expression이 들어갈 수 있다.

Range & Progression
Range : 숫자의 범위를 의미하는 데이터 타입 1..2 또는 1.rangeTo(2)
- (1..4) 또는 1.rangeTo(4) → 1부터 4까지의 범위 , 끝이 닫힌 범위
- (1..<4) 또는 1.rangeUntil(4) → 1부터 4미만까지의 범위,. 끝이 열린 범위
- 1.0..4.0과 같이 Double/Float 타입도 가능하다.
- 정수 타입은 반복문에서 iteration 할 수 있다. (iteration : 결과를 생성하기위한 프로세스의 반복)
- downTo 연산자를 사용하면 역순으로 iteration이 가능하다.

- step 함수를 이용하여 간격을 정해 iteration 할 수 있다.

Range에서 가장 많이 사용할 것 .random 함수와 iteration
Progression : sequence of numbers, 정수형 타입(Int, Long, Char)을 대상으로함
- first, last, step 속성을 가진다.
- Range에 대해 iteration을 하는 것은 암시적으로 progression이 생성된 것.
- Prograssion은 iterable 하므로 filter, map 등의 Collection 함수들을 사용할 수 있다.
- Range에 대해 iteration을 하는 것은 암시적으로 progression이 생성된 것.
Range는 시작점과 끝점 사이의 모든 값을 포함하는 연속된 값의 시퀀스를 표현
Progression은 시작값, 끝값, 그리고 증가 또는 감소하는 단계값을 가지는 값의 시퀀스를 표현
- Range : 1 .. 10 = 연속된 값의 시퀀스
- Progression : 1 .. 10 step 2 : 1~10까지의 2씩 증가하는 값을 가진 시퀀스
타입 체크
- is 또는 !is 연산자를 이용한다.

- is 연산자를 사용한 경우 smart cast가 이루어진다.

Type Cast
- as 연산자를 사용하며 cast가 불가능 한 경우 exception이 발생하므로 unsafe cast 연산자라고 한다.
- cast가 불가능할 경우 null을 반환하는 safe cast 연산자는 as? 이다.

fun main() {
val x = 123
val int :Double = x as Double // 사용 시 CastError 발생
// as? 사용 시 Error 발생 하지 않고 null로 바뀜
val int :Double? = x as? Double
println(int)
}
함수의 기본
- 함수는 fun 키워드를 이용해 정의한다.
- 함수의 return type은 파라미터 정의 뒤에 : 와 함께 적는다.
- 함수의 body로 expression을 사용할 수 있다.
- 특별한 값을 반환하지 않는 경우 return type을 Unit로 정의하거나 생략할 수 있다.
- 함수의 return type은 파라미터 정의 뒤에 : 와 함께 적는다.
터미널 입력과 출력
- 입력 함수
- readln( ) : String
- 출력 함수 : 파라미터로 String 전달
- print( ), println( )
실습
- 파라미터로 받은 정수의 부호를 바꾸어 반환하는 함수 inv 를 선언
- main 함수에서는 사용자로부터 정수를 입력받은 다음 위 함수의 결과를 출력하라.
fun inv(value:Int):Int = -value
val input = readln().toInt()
println("${inv(input)}")
Package And Import
- package 선언은 파일의 가장 위에 한다.
- import 구문을 이용해 다른 패키지를 불러 사용할 수 있다.
- Java와 다른 점
- package와 실제 폴더 구조가 달라도 된다.
- as 키워드를 이용해 package에 별칭을 부여할 수 있다.
Package definition
- 최상위(Top-level)에 선언된 변수, 함수들은 기본적으로 public
- private으로 선언할 경우 같은 파일에서만 access 할 수 있다.
- internal로 선언할 경우 같은 모듈(함께 컴파일되는 파일들)에서 access
- protected는 사용할 수 없다
- 다른 패키지의 최상위 레벨 변수나 함수를 쓰려면 import 해야한다.