fun main(){
} // fun 함수이름 : 반환형 형태로 선언
fun helloWorld() : Unit{
println("Hello world!");
} // Unit 생략 가능
fun add(a:Int, b:Int) : Int{
return a+b;
} // Int형을 반환하는 add함수, 변수 자료형은 뒤에 선언한다.(대문자)
변수 (val, var)
fun hi(){
val a : Int = 10 // 한번 정해주면 변경불가
var b : Int = 9 // 변경가능
b = 100
val c = 100
var d = 100 // 자료형 생략 가능
var name = "Han"
}
String Template
fun main(){
val name = "Yeop"
val lastName = "Han"
println("my name is ${name + lastName}. ")
// ${}으로 변수 사용 가능
println("20\$a")
// $를 사용하고 싶다면 \$
}
조건식
fun maxBy(a: Int, b:Int) : Int{
if(a>b){
return a
} else{
return b
}
} // 더 큰 수를 출력하는 함수
fun maxBy2(a: Int, b:Int ) = if(a>b) a else b
// 코틀린에서는 저런 함수형태를 간단히 표현할 수 있음
fun checkNum(score : Int){
when(score){
0->println("this is 0")
1->println("this is 1")
2,3->println("this is 2 or 3")
else->println("I don't know")
} // when : 다른 언어에서 switch 문과 같은 역할, else 생략가능
var b = when(score){
1->1
2->2
else->3 // else 생략 불가
} // 변수 값을 지정하는데도 사용 가능
when(score){
in 90..100 -> println("very good")
in 10..80 -> println("not bad")
else-> println("good")
} // 범위 형태로도 표현 가능
}
Array and List
// Array : 크기가 할당되있음 , 수정 가능
// List 1. List : 수정 불가 / 2. MutableList : 수정 가능
fun array(){
val array = arrayOf(1,2,3) // array 초기화 (arrayOf)
val list = listOf(1,2,3) // list 초기화 (listOf)
var array_ = Array(
2,{0}
) // 크기만 지정해서 배열을 생성하고 싶을 때
array[0] = 3 // array 수정 가능
//list[0] =2 --> 불가능
val arrayList = arrayListOf<Int>() // Mutable , 크기 자동
arrayList.add(10);
arrayList.add(20);
arrayList[0] = 20;
}
반복문 ( for, while )
fun forAndWhile(){
val students = arrayListOf("kim","han","moon","park")
for(name in students){
println("${name}")
}
// ~ in ~ 의 형태로 for문 사용
var sum = 0
for(i in 1..10) // 1~10 더하기
// for(i in 1..10 step 2) = 2씩 띄어서
// for(i in 10 downTo 1) = 10부터 1감소
// for(i in 1 until 10) = 1~9 더하기
{
sum+=i
}
println(sum)
for((index,name) in students.withIndex()){
println("${index+1} 번째 학생 : ${name}")
} // 인덱스와 원소 함께 표현 (withIndex)
var index = 0
while(index < 10){
println("current index : ${index}")
index++
} // 다른 언어의 while 과 동일
}
Nullable / NonNull
fun nullcheck(){
var name : String = "Yeop"
// NULL을 허용하지 않는다 ( name = NULL -> 오류)
var nullName : String? = null
// ?를 넣으면 NULL 허용
var nameInUpperCase = name.toUpperCase()
var nullNameUpperCase = nullName?.toUpperCase()
// NULL이 아니면 toUpperCase를 하고 NULL이면 NULL 반환
val lastName : String? = null
val fullName : String = name + " "+ (lastName?: "No lastName")
// ?: NULL이면 그 뒤에 명시한 것 반환 (lastName이 null이라면 No lastName)
println(fullName)
}
fun ignoreNulls(str : String?){
val mNotNull : String = str!! // !! -> 확실하게 NULL이 아니다.
val upper = mNotNull.toUpperCase() // NULL이 아니므로 사용가능
val email : String?= "abc@naver.com"
email?.let{
println("my email is ${email}")
} // NULL이 아니라면 함수 안으로 옮겨준다.
}
클래스 (class) 와 상속
open class Human constructor(val name : String = "Anonymous"){
// 생성자 (constructor), constructor 생략가능
constructor(name : String, age:Int) : this(name){
println("my name is ${name}, ${age}years old.")
} // 보조 생성자 (오버로딩)
init {
println("New human has been born.")
} // 객체가 만들어질 때 호출 (가장 먼저 생김)
fun eatingCake(){
println("Yummy")
}
open fun singASong(){
println("lalala")
}
}
class Korean : Human(){
// 상속시 extends 말고 : , 부모에서 open 해야 상속가능 ( 기본 final )
override fun singASong(){
super.singASong() // 부모것 사용
println("라라라")
} // 오버라이딩 , 부모에서 open 해야 가능
}
fun main(){
val human = Human("Yeop") // new 필요 X
val stranger = Human() // 디폴트값 지정시
human.eatingCake()
println("name is ${human.name}")
println("name is ${stranger.name}")
val man = Human("P",25)
val korean = Korean()
korean.singASong()
}