코틀린 소개와 문법

코틀린(Kotlin) 소개

  • Intellij 개발 도구를 제작한 JetBrains 에서 만든 프로그래밍 언어
  • 2011년 공개
  • 2017년 Google IO 행사에서 안드로이드 개발 공식 언어로 Kotlin 을 소개
  • 구글이 오라클의 Java 를 대체하기 위해서 Kotlin 을 선택
  • kotlin 공식사이트

특징

  • Kotlin 언어는 Java, C, JavaScript 로 변환되어서 서비스 된다
  • Java 언어보다 간단한 문법을 제공
  • Null 안정성을 위해서 Null 허용 변수와 허용하지 않는 변수로 구분한다
  • 예외처리를 강제 하지 않음
  • 모든 자료형 값을 객체로 관리
  • 연산자의 재구현을 지원
  • 객체지향 프로그래밍과 함수형 프로그래밍 방식 모두 가능

개발분야

  • Kotlin for Server Side : 서버 개발을 위한 라이브러리, Spring Framework 5 부터 Kotlin 공식지원
  • Kotlin for Android : 안드로이드 개발시 Kotlin 언어가 공식 언어
  • Kotlin for Javascript : JavaScript, ECMAScript 를 사용하는 Web 과 Node.js 개발이 가능하다
  • Kotlin for Native : iOS, Mac, Windwows, Linux 등의 환경에서 사용할 수 있는 코드 작성이 가능

개발환경

  • Android 개발시 : Android Studio 설치
  • 일반 Kotlin 개발시 : IntelliJ IDEA 설치
  • Java JDK 설치 : openJDK 또는 Oracle Java JDK 설치

IntelliJ Kotlin 프로젝트 생성

IntelliJ Kotlin new Project

  • Kotlin > JVM > Application 선택해서 프로젝트 생성

파일생성

  • src > main > kotlin > HelloKotlin.kt 파일 생성
    HelloKotlin 파일 생성

기본문법

  • 주석 : Java 와 동일
  • print
  • literal
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    fun main() {
    Annotaion(null).run()
    Print(null).run()
    Literal(null).run()
    }
    class Literal(val name: String?) {
    fun run() {
    integer()
    actual()
    charater()
    StringRun()
    }
    fun integer() {
    println(1)
    println(1000000000)
    println(1000000000L)
    println(10_0000_0000)
    }
    fun actual() {
    println(10.1234)
    println(20.1234F)
    }
    fun charater() {
    println('A')
    }
    fun StringRun() {
    println("Strings")
    }
    }

    class Annotaion(val name: String?) {
    fun run() {
    println("주석을 처리합니다")
    // 한줄 주석
    /*
    여러줄
    주석
    */
    }
    }

    class Print(val name: String?) {
    fun run() {
    print("Hello Kotlin\n")
    println("new line")
    println("Int Value : ${100}")
    val numberHundred = 100
    println("numberHundred Value : ${numberHundred}")
    }
    }

자료형

  • 자바와 다르게 첫대문자를 사용한다
  • 정수 : Long(8), Int(4), Short(2), Byte(1)
  • 부호없는 정수 : ULong(8), UInt(4), UShort(2), UByte(1)
  • 실수 : Double(8), Float(4)
  • 논리 : Boolean(1)
  • 문자 : Char(2)
  • 문자열 : String

변수선언

  • 자바와 다른 점은 타입을 생략하면 알아서 결정해준다
  • var : 값을 다시 저장 가능하다
  • val : 값을 다시 저장 불가능하다 (const 같은 개념)
  • 사용법
    1
    2
    // val 변수명:타입 = 값
    val name:String = "skyksit"

null 허용 변수

  • 변수 선언시에 null 허용 여부를 설정한다
    1
    2
    3
    4
    5
    // null 허용하지 않는 변수
    var notNullVariable:String = "Can't Null"

    // null 허용하는 변수
    var NullVariable:String? = null

함수

  • Java 는 클래스에 메서드 사용
  • Kotlin 는 C 처럼 함수를 사용
  • Kotlin 컴파일시에 Java Class 의 method 로 변환된다

함수문법

1
2
3
4
5
6
7
8
9
10
11
fun 함수명(매개변수): 변환값타입 {
코드들
}

fun main() {
firstFunction("SendValue")
}

fun firstFunction(arg1:String) {
println("전달받은 값은 ${arg1}")
}
  • 기본 값이 설정된 매개변수 : 매개변수가 없을 때 기본값을 설정할 수 있다
    1
    2
    3
    4
    5
    6
    7
    fun main() {
    firstFunction()
    }

    fun firstFunction(arg1:String="DefalutValue") {
    println("전달받은 값은 ${arg1}")
    }

함수 오버로딩 overloading

  • 함수명은 동일하지만 매개변수의 형태에 따라서 여러 함수를 정의할 수 있다
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    fun main() {
    sumSample()
    sumSample(a1=1, a2=2)
    sumSample(10.1, 20.2)
    }

    fun sumSample() {
    println("default sum ${0}")
    }

    fun sumSample(a1:Int, a2:Int) {
    println("Int sum ${a1+a2}")
    }

    fun sumSample(a1:Double, a2:Double) {
    println("Double sum ${a1+a2}")
    }

연산자

단항연산자

1
2
3
4
5
6
7
+a : 양수는 양수, 음수는 음수
-a : 양수는 음수, 음수는 양수
!a : truefalse, falsetrue
a++ : a 의 값을 사용하고 증가
a-- : a 의 값을 사용하고 감소
++a : a 의 값을 증가시킨 후 사용
--a : a 의 값을 감소시킨 후 사용

산술연산자

1
2
3
4
5
6
a + b : 더하기
a - b : 빼기
a * b : 곱하기
a / b : 나누기
a % b : 나머지
a..b : a 부터 b 까지의 객체를 만들어서 Return

대입연산자

계산 후 다시 변수에 넣어줌

1
2
3
4
5
a += b : a = a + b
a -= b : a = a - b
a *= b : a = a * b
a /= b : a = a / b
a %= b : a = a % b

비교연산자

1
2
3
4
5
6
a == b : a 와 b 가 같은지 true , false
a != b : a 와 b 가 다른지 true, false
a > b : a 가 b 보다 큰지
a < b : a 가 b 보다 작은지
a >= b : a 가 b 보다 크거나 같은지
a <= b : a 가 b 보다 작거나 같은지

제어문

IF

1
2
3
4
5
6
7
if (조건식) {
코드
} else if (조건식) {
코드
} else {
코드
}

When

1
2
3
4
5
6
7
when (변수 or 수식) {
1 -> 코드
2 -> 코드
3, 값4 -> 코드
in 1..10 -> 코드 // 1부터10사이일 경우 코드 실행
else -> 코드
}

반복문

for

1
2
3
for (변수 in 배열) {
//코드
}

while

do-while 과 다르게 조건식이 false 면 1번도 실행되지 않는다

1
2
3
while(조건식) {

}

do~while

while 과 다른 점은 조건식이 false 라도 코드는 1번 실행된다

1
2
3
do {
코드
} while(조건식)

return

함수를 중단하고 호출한 쪽으로 돌아간다

break

반복 횟수가 남아 있더라도 반복을 중단한다

continue

반복문에서 코드가 남아 있더라도 다음 반복으로 넘어간다

클래스

1
2
3
class 클래스명 {

}

init

객체 생성시에 자동으로 실행할 때 init 사용

1
2
3
4
5
6
class 클래스명 {
init {
//코드
}
}

constructor

생성자를 정의할 때 사용하고 매개변수의 개수나 자료형을 달리하여 여러 개를 만들 수 있다

1
2
3
4
5
6
7
8
9
10
class 클래스명 {
constructor() {

}

constructor(inputA:Int, inputB:Int) {

}
}

기본 생성자

클래스 정의시 클래스 이름 우측에 정의하는 생성자
기본 생성자의 매개 변수는 멤버 변수로 자동 등록된다

1
2
3
class 클래스명 (var InputA:Int, var InputB:Int) {

}

상속

  • 상속하는 클래스를 부모 클래스 (SuperClass)
  • 상속을 받는 클래스는 자식 클래스 (SubClass)
  • SuperClass 는 open 키워드를 사용해야 한다
    • open 을 사용하지 않으면 자바코드로 변경시 final 키워드가 붙는다
    • 자바는 상속을 막기 위해서 final 을 붙인다
    • 코틀린은 open 을 사용하지 않으면 상속이 안된다 (자바와 반대로 관리한다)

패키지

  • 파일을 물리적인 폴더로 나누어 관리하는 개념
    1
    2
    3
    4
    5
    6
    package com.skyksit.kotlin.util

    class UtilClass {

    }

import

  • 패키지 명을 생략할 수 있다
    1
    2
    3
    4
    5
    import com.skyksit.kotlin.util.UtilClass

    val util:UtilClass = UtilClass()

    val addValue = util.add(1, 2)

Module

  • 패키지를 모아서 관리하는 개념
  • Module 사용을 위해서는 등록을 해주어야 한다
  • 파일 > 패키지 > 모듈

접근제한

  • Kotlin 클래스의 모든 변수는 Java 로 변경될 때 private 로 정의된다
  • 클래스
    • private : 외부에서 객체를 생성할 수 없다
    • public (default) : 외부에서 객체를 생성할 수 있다
    • internal : 같은 모듈안에서만 객체를 생성할 수 있다
  • 변수, 메서드
    • private : 외부에서 접근할 수 없다
    • public (default) : 외부에서 접근할 수 있다
    • protected : 상속관계일 경우에만 접근이 가능하다
    • internal : 같은 모듈안에서만 접근이 가능하다

Property

  • 캡슐화를 적용한 변수를 메서드를 통해서 값을 설정하거나 사용하는 걸 Property 라 한다
  • Kotlin 은 변수 선언을 하면 자동으로 Property 가 된다
  • Java 같이 Setter, Getter 를 선언하지 않아도 된다
  • var 는 getter, setter 가 설정된다
  • val 은 getter 만 설정된다

지연초기화

  • 변수 선언시에 값이 필수 이지만 지연시키는 방식을 지연초기화라고 한다
  • var 는 lateinit, val 은 lazy 로 지연초기화 한다
  • 지연초기화 한 변수를 사용하기 전에 초기화해야 한다

Overriding

  • 부모클래스의 메소드를 재정의 하는 것
  • 메소드 앞에 open 을 적어야 자식클래스가 메소드를 재정의 할 수 있다

this

  • 객체 자신을 지칭한다
  • 클래스와 메소드 변수명이 동일할 때 this 로 클래스의 변수를 호출할 수 있다

super

  • 부모 클래스를 지칭한다

추상클래스

  • 추상클래스는 자식 클래스에서 메서드를 강제로 Overrriding 하게 하기 위해서 만든다
  • 추상클래스를 직접 사용할 수 없다

인터페이스

  • 추상클래스와 목적은 비슷하지만 하나의 클래스에 여러 인터페이스를 구현할 수 있다
  • 인터페이스는 클래스가 아니므로 객체를 생성할 때 사용할 수 없다
  • 클래스는 한개 이상의 인터페이스를 구현할 수 있다
  • 인터페이스틑 추상 메서드와 일반 메서드 모두를 구현해서 사용할 수 있다

companion

  • Java 에서는 Static 을 사용하고 Kotlin 은 Companion 객체를 사용한다
  • 프로그램에서 동일한 정보를 사용해야 할 경우 companion 객체를 사용한다
  • 객체를 생성해서 사용하지 않고 클래스를 바로 호출해서 사용한다

Data Class

  • Data 를 관리하기 위한 클래스
  • Data Class 는 몇가지 메서드가 자동으로 구현된다
    • equals
    • hashCode
    • copy
    • toString
    • componentN
  • 추상클래스로 선언 되지 않는다
  • 상속클래스로 사용할 수 없다

Generic

  • 클래스 설계시에 변수의 여러 종류 타입을 수용하고 싶을 때
  • 클래스 작성시 변수 타입을 선언하는 게 아니라 객체 생성시 변수 타입을 생성할 수 있다
  • Generic Type 을 그냥 설정하면 동일한 타입만 사용가능하다
  • out 으로 Generic Type 을 설정하면 부모 클래스는 사용가능하다
  • in 으로 Generic Type 을 설정하면 자식 클래스는 사용가능하다
1
2
3
4
5
6
7
8
9
10
11
12
13
fun main() {
val firstClass = GenericClass<Int>()
firstClass.addMethod( 100 )

val secondClass = GenericClass<String>()
secondClass.addMethod( "ABCD" )
}

class GenericClass<T> {
fun addMethod(arg1:T) {
println("arg1 : $arg1")
}
}

중첩 클래스

  • 클래스 안에 클래스를 만들어서 사용한다
  • Inner 클래스에서는 Outer 클래스의 메소드와 변수를 사용가능하다
  • Outer 클래스는 Inner 클래스를 바로 사용하지 못한다
1
2
3
4
5
6
7
8
9
10
11
fun main() {
val outClass = OutClass()
val inClass = outClass.InnerClass()
}

class OutClass {
inner class InnerClass {

}
}

null 처리

  • !! null 을 허용하지 않는다
  • ?: null 이면 기본값을 반환한다
  • ?. method 호출시 null 이면 null 을 반환한다