package com.example.kykotlin
fun main(){
//3. String Template
val name = "KY"
val lastName = "Lee"
println("my name is ${name + lastName} I'm 23") //대괄호 쓰는것 습관화
println("is this true? ${1==0}")
println("this is 2\$a")
}
//1. 함수
// 변수명을 타입보다 먼저 써준다
fun helloWorld() : Unit { //1. return 형식이 없을때 Unit이라고 써준다
println("Hello World!")
}
fun add(a : Int, b : Int) : Int { // 어떤가를 return 하는 경우에는 생략불가
return a+b
}
//2. val vs var
// val = value 바뀌지 않는 값
// var = variable 변할 수 있는 수
fun hi(){
val a : Int = 10
var b : Int = 9
var e : String //선언시에는 적어줘야함.
// a = 100 불가
b = 100
val c = 10 // : Int를 써주지 않아도 상관없다.
var d = 100
var name = "hello";
}
package com.example.kykotlin
fun main(){
checkNum(1)
}
//4. 조건식
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")
}
var b = when(score){ //변수로 넣을 수 있음.
1->1
2->2
else ->3
}
println("b : ${b}")
when(score){
in 90..100 -> println("You are genius")
in 10..80 -> println("not bad")
else -> println("okay")
}
}
main 돌렸을때 Output
this is 1
b : 1
okay
Expression vs Statement
1. Expression이란? : 값을 리턴하면 Expression
(코틀린의 모든 함수는 Expression, 아무리 리턴값이 없더라도 Unit으로 받음.)
2. Statement : 자바의 경우 void라는 함수값이 없는 형태가 존재.
fun array(){
val array = arrayOf(1,2,3)
val list = listOf(1,2,3)
val array2 = arrayOf(1, "d", 3.4f)
val list2 = listOf(1, "d", 11L)
//기본적으로 array는 값변경가능, 사이즈는 변경불가
array[0] = 3
// list[0] = 2 //리스트 원소 바꾸는건 불가능.
var reslut = list.get(0)
val arrayList = arrayListOf<Int>() //초기화, 주소값이 바뀌지 않으니까 val써도됨.
arrayList.add(10)
arrayList.add(20)
arrayList[0] = 20
// arrayList = arrayListOf() //주소값이 바뀌는 경우라서 에러뜸.
1. List(읽기전용) 2.MutableList(읽기, 쓰기 전용 List)
fun forAndWhile(){
val students = arrayListOf<String>("ky","james","jenny","jennifer")
for(name in students){
println("${name}")
}
for((index, name) in students.withIndex()){
println("${index+1}번째 학생 : ${name}")
}
var sum : Int = 0
for(i in 1..10 step 2){
sum += i //1,3,5,7,9 더해라
}
println(sum)
var sum1 : Int = 0
for(j in 10 downTo 1){ // 10..1까지
sum1 += j
}
println(sum1)
for(i in 1 until 100){ //100을 포함하지 않음.(99)
}
var index = 0
while (index < 10){
println("current index : ${index}")
index++
}
}
index
, name) in students.withIndex()
) 사용해준다1..10
10 downTo 1
1 until 100
) 등이 쓰일 수 있다fun nullcheck(){
//NPE : NULL pointer Exception
//컴파일 시점에서 잡을수가 없고 런타임에서만 잡힘.(돌려봐야지 알수있음)
//코틀린은 컴파일 시점에서 잡을 수 있음
var name : String = "joyce"
var nullName : String? = null; //?넣어주면 nullable타입이 됨.
//nullable만들고 싶으면 타입 생략 불가능
var nameInUpperCase = name.toUpperCase()
var nullNameInUpperCase = nullName?.toUpperCase()
//null인지 아닌지 몰라서 체크를 해줘야함.
//?을 붙이게되면 : 만약에 nullName이 null이 아니면(문자가있으면) toUpperCase반환
// null이면 전체를 null로 반환함.
// ?: 디폴트값을 주고싶은경우
val lastName : String? = null
val fullName = name +" "+ (lastName?: "NO lastName")
//lastName이 있는경우 : lastName출력
//lastName이 null인경우 : No lastName출력
println(fullName)
}
output :
KY NO lastName
fun ignoreNulls(str : String?){
val mNotnull:String = str!! //절대 null이 들어올리가 없으니까 null이 아니라고 생각을 해라!
//정말 확실하지 않는 이상, 쓰지말기를 지양.
val upper = mNotnull.toUpperCase();
println("This is ${upper}")
val email : String? = null
email?.let{
//email이 null이 아니면 let을해라
//email 리시버 객체를 람다식 내부로 옮겨줌
println("my email is ${email}")
}
}
fun main(){
ignoreNulls("hello")
}
OUTPUT
This is HELLO
class Human (val name : String = "Anonymous") {
//생성자
//val name = name
//부생성자는 항상 주생성자의 위임을 받아야 한다.
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("This is so YUMMMYYYY!")
}
}
fun main(){
val human = Human("minsu")
val stranger = Human() //default 값으로 "Anonymous"가 들어감.
val mon = Human("ky's Mom", 60)
human.eatingCake()
println("this human's name is ${stranger.name}")
}
OUTPUT
New human has been born!
New human has been born!
New human has been born!
my name is ky's Mom, 60 years old
This is so YUMMMYYYY!
this human's name is Anonymous
//open이라는 예약어를 통해 상속받을 수 있음.
class Korean : Human(){ //부모생성자를 불러서
//오버라이딩 :
override fun singASong(){
super.singASong()
println("랄랄라")
println("my name is ${name}")
//default값을 정해주면서 생성자의 파라미터인 Anonymous가 받아와짐
}
}
fun main(){
val korean=Korean()
korean.singASong()
}
OUTPUT:
New human has been born!
lalala
랄랄라
my name is Anonymous