반응형
제어문
- 실행 흐름 : 순차적
- 조건문 - 분기 (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)
}
반응형