제육's 휘발성 코딩
Published 2021. 10. 27. 14:05
[Kotlin] 코틀린 문법 Other
반응형

제어문

  • 실행 흐름 : 순차적
  • 조건문 - 분기 (branch)를 통해 조건에 따라 지정
    • if, when(자바의 switch)
    • Statement 표현
    if (a < 8) {
        b = ++a;
        c = b+2;
    }
    else {
        ...
    }
  • Expression 표현 ( ++a, b+2 와 같은 결과를 만들어주는 수식)
  • a = if (b > 3) ++b else --b
  when(a){ // 서로 다른 타입도 조건문에 넣을 수 있다.
      1..3 -> {} // a가 1~3이라면 (range)
      4 -> {}
      "문자" -> 
      is Long -> //Long 타입일 때
      !is Int -> // Int 타입일 때
      else -> {}  // Expression 표현을 사용할 때는 else가 꼭 있어야 한다. Statement는 생략 가능 
  }
  • 반복문 - 조건 만큼 반복 실행
    • for , while, do ~ while
for (i in 1..10) // 1~10
for (i in 1 until 10) // 1~9
for (i in 1..10 step 2) // 1~10 까지 2씩 증가
for (i in 10 downTo 1) // 내림 차순 

클래스

  • Class Name : 클래스 이름
  • property : 허용 접근 방식 (private, public 등 )
  • method : contructor(자바의 생성자 기능), 자바처럼 빈생성자 기본 생성 (주 생성자, 보조 생성자)
  • 코틀린은 Getter Setter가 기본 제공 된다. private 지정 시 외부에서 아예 사용하지 못한다.
  • 코틀린은 클래스, 메서드가 기본적으로 상속 불가 상태(final)가 기본 상태이다.
class Album {
    // 프로퍼티 선언
    var id:Int = 0 // val은 값을 바꿀 수 없는 변수, var는 바꿀 수 있는 변수
    var title:String ="" 
    var play:Int = 0

    //메서드 - 보조 생성자
    constructor(id:Int, title:String){
        this.id = id
        this.title = title
    }
}

// 외부
fun main() {
    val album:Album = Album(1,"s")
    alum.id = 2 // 자바에선 album.setId(2); 코틀린은 Getter Setter가 기본 제공 된다.
}
  • private 을 사용하지 않으면 자동으로 (private이 들어가 있으며) getter / setter가 제공된다.
  • private을 직접 명시하면 아예 외부로 부터 차단되고 g/s도 생성되지 않는다.
class Album(id:Int, title:String) {
    var id:Int = id
    var title: String = title
}
//함수가 아닌 class 에선 매개 변수에 var 표현이 가능
class Album(var id:Int, var title:String) {}
class Album(var id:Int, var title:String) {
    var price:Int = 0
    init { //객체 생성할 때 해야할 일들 정리 - 주생성자에서 추가 작업할 내용
        price = 12000
    }
}
  • 주 생성자 방식 (Class 에 생성자를 넣는 방식)
  • 주 생성자에서 추가로 작업할 내용은 init {} 을 통해 작업

익명 클래스

  • 클래스 이름이 없는 클래스
var rect = object { //rect 는 object라는 익명클래스로 부터 만들어진 객체 
    var w:Int = 0
    var h:Int = 0
}
rect.w = 5
rect.h = 2

상속

open class Album(var id: Int, var title: String) {

    var price: Int = 0

    init { //객체 생성할 때 해야할 일들 정리 - 주생성자에서 추가 작업할 내용
        price = 12000
    }

    open fun changePrice(discount: Int) {
        price -= discount
    }
}

class SubAlbum : Album {
    var artist: String = ""

    constructor(id: Int, title: String, artist: String) : super(id, title){
        this.artist = artist
    }

    override fun changePrice(discount: Int) {
        price += discount
    }
}

fun main() {
    val album: Album = SubAlbum(1, "song", "Boa")
    println(album.title)
    album.title = "My Song1"
    print(album.title)
}
  • 클래스 앞에 open을 통해 클래스를 상속 가능 상태로 만들어줘야 한다.
  • 상속 받은 클래스 안에서 constructor() :super() 생성자를 만들어줘야 한다.
  • 코틀린은 default가 final class 이기 때문에 상속이 불가능 하다.
  • 메서드 자체도 final로 되어있기 때문에 상속 받을 때 부모는 open 메서드, 자식은 override 표현

Data

  • 클래스 명 앞에 data를 선언하면 data class가 된다.
  • equals (주소 비교), toString() 등의 메서드 사용 가능

Companion

  • Java 에서 static과 동일
class Tri {
    companion object {
        var b: Int
        var h: Int
    }
}

리스트

  • 값을 변경할 수 있는 리스트
  • 값을 변경할 수 없는 리스트
var numlist: List<Int> = listOf(1, 2, 3, 4, 5) //변경 불가능
    val books = mutableListOf<String>() // 변경 가능

    println("numList :  ${numlist.size}")
    println("numList :  ${numlist[0]}")
    for(number in numlist) println("$number ")

    books.add("Python")
    println("books : $books")

변수

Null Safety

  • null 허용 방식, 불허 방식 2가지 존재
var name: String? = null //name 은 null 허용 (?없으면 오류)
var length = if(name == null) 0 else name.length
var length2 = name?.length ?: 0 // name이 null이 아니면 length null 이면 0
var length3 = name!!.length // name 이 null 이면 exception 발생

람다 표현식

  • Functional Programming
fun sum(a:Int, b:Int){ // 일반 함수
    return a+b
}  

val f = {a:Int, b:Int -> a+b} //람다 표현식
f(3,2) //해당 예시와 같이 호출 가능 

val f:(Int, Int) -> Int = {} //(Int, Int) -> Int : Function Type,  {} : Function Body
data class Circle(var r: Int)
class Song {
    companion object { // 여기 안에 있는 것들은 모두 static
        var title: String = ""
        fun show() = println(title)
    }
}

// Function
fun sq_sum(x: Int, y: Int): Int {
    return x * x + y * y
}
// 고차 함수 process
fun process(processor: (Int, Int) -> Int, a: Int, b: Int): Int {
    return processor(a,b)
}

fun main() {
    var c1: Circle = Circle(5)
    var c2: Circle = Circle(5)
    println(c1.equals(c2))

    var rect = object {
        var w: Int = 0
        var h: Int = 0
        fun size() = w * h
    }
    rect.w = 5; rect.h = 5; println(rect.size())
    Song.title = "Happy Happy"; println(Song.show())

    //Null Safety
    var name: String? = null //name 은 null 허용
    var length = if (name == null) 0 else name.length
    var length2 = name?.length ?: 0 // name이 null이 아니면 length null 이면 0
//    var length3 = name!!.length // name 이 null 이면 exception 발생

    // Lambda Function
    var sq_sum: (Int, Int) -> Int = { x: Int, y: Int -> println(x*x + y*y); x*x + y*y }
    sq_sum(5,5)
    val x = 5
    val sq: () -> Unit = {println(x*x)} //Unit : Return이 없을 때
    sq()
    val sq2: (Int) -> Int = {it * it} // it은 매개변수가 하나일 때 그 값을 의미
    println(sq2(4)) //16

    val x2 = process({x,y -> x*x + y*y}, 3, 3)
    println(x2)
}
반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^