코틀린 1강

이경영·2023년 1월 30일
0

코틀린

목록 보기
1/2

기본 함수와 변수

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";
}
  1. 변수명을 타입보다 먼저 써준다.
  • return 형식이 없을 때 Unit을 써주지만 안써줘도 무방함
  • a : Int, b: Int 와 같은 형식으로 써줌
  1. val과 var
  • val : 변하지 않는 상수 -> 바꾸는것 불가함.
  • var : 변수의 경우
  • 선언시에는 타입명을 적어줘야함.
  1. String template
  • ${} 사용

조건식

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")
    }
}
  1. 조건식 중 if문 한줄표현가능
  2. 자바의 switch와 코틀린의 when 표현 같음
  • 변수에 return 값을 넣어주고 싶으면 when에서 else값을 꼭 넣어줘야함

main 돌렸을때 Output

this is 1
b : 1
okay

자바와 코틀린의 차이점

Expression vs Statement
1. Expression이란? : 값을 리턴하면 Expression
(코틀린의 모든 함수는 Expression, 아무리 리턴값이 없더라도 Unit으로 받음.)
2. Statement : 자바의 경우 void라는 함수값이 없는 형태가 존재.

Array와 List


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. Array는 기본적으로 메모리가 할당이 됨
  2. List는 2가지로 나뉘게 됨
    1. List(읽기전용) 2.MutableList(읽기, 쓰기 전용 List)
    listOf의 경우에는 list를 가져오는 get만 사용가능, set X
    arrayListOf는 읽기, 쓰기 전용으로 add나 값 변경 가능함.

for와 While문

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++
    }
}
  1. for ( 변수명 in ArrayList)
  2. index와 같이 print하고 싶을때는 for((index, name) in students.withIndex()) 사용해준다
  3. for( i in 1..10 10 downTo 1 1 until 100) 등이 쓰일 수 있다

Nonnull과 Nullable

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

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
profile
꾸준히

0개의 댓글