코틀린) 코틀린 기본 2

밍나·2022년 2월 26일
0

Android

목록 보기
28/36

✏️ Nullable / NonNull

1. Nullable (? 연산자)

  • Kotlin에서는 기본적으로 null을 허용하지 않는다. 하지만 null 값을 허용하기 위한 별도의 연산자인 ? 를 제공한다
  • null 값이 허용된 자료형을 사용할 때는 별도의 연산자를 통해 안전하게 호출해야 한다
  • null 허용 연산자를 사용하기 위해서는 변수의 타입을 생략하면 안된다
var nullName: String? = null

2. Null Check

(1) ?. 연산자

  • Kotlin에서는 함수 사용시 null 값인지를 체크하기 위해 ?. 연산자를 제공한다
  • ?. 연산자를 사용하면 null값이 아닌 경우에만 함수가 호출되고, null값인 경우 null이 반환된다
var nullName: String? = null
val upperCaseName: String? = nullName?.toUpperCase()
print(upperCaseName)
null

(2) ?: 연산자

  • null 체크에서 null일 때 null이 아닌 다른 기본값을 반환하고 싶을 때는 ?: 연산자를 사용한다
var name = "Minha"
var lastName: String? = null
val fullName = name + " " + (lastName?: "No lastName")
print(fullName)
Minha No lastName

3. NonNull (!! 연산자)

  • 개발자가 생각했을 때 null이 아닌 것이 있다면 null이 아님을 컴파일러에게 알려주는 역할이다
fun nonNull(str: String?) {
    var notNullName: String = str!!
    val upperCaseName = notNullName.toUpperCase()
    print(upperCaseName)
}
// str이 minha일 때
MINHA

4. let 함수와 ?.

(1) let 함수

  • 자기 자신을 함수의 인수로 전달

(2) let 함수와 ?.

  • let 함수와 ?. 연산자를 함께 사용하면 null이 아닐 때만 함수가 실행되므로 NPE로부터 매우 안전하다
val name: String? = "Minha Lee"
name?.let{
    println("My name is ${name}")
}
My name is Minha Lee

✏️ Class

1. Class

class Human {
    val name = "minha"
    
    fun running() {
        println("Running is so tired")
    }
}

fun main() {
    val human = Human()
    human.running()
    
    println("This human's name is ${human.name}")
}
Running is so tired
This human's name is minha
  • Kotlin에서는 Java와 다르게 한 파일에 여러 클래스를 만들 수 있고, 파일명과 클래스명이 달라도 된다 (그래도 되도록이면 같게 하자!)
  • Kotlin에서는 인스턴스를 생성할 때 new 키워드 없이 클래스명만으로 생성할 수 있다

2. 생성자

// 방법1. 기본 생성자
class Human constructor(name: String) {
    val name = name
    
    fun running() {
        println("Running is so tired")
    }
}

// 방법2. 클래스의 프로퍼티명과 생성자의 프로퍼티명이 같다면
// 생성자의 프로퍼티에 val을 붙이면 그 자체로 클래스의 프로퍼티가 됨
// constructor 키워드도 생략 가능
class Human (val name: String) {    
    fun running() {
        println("Running is so tired")
    }
}

fun main() {
    val human = Human("seungjae")
    human.running()
    
    println("This human's name is ${human.name}")
}
Running is so tired
This human's name is seungjae
  • 인스턴스를 생성할 때 프로퍼티를 초기화하고 싶다면 생성자를 사용하면 된다
  • 생성자 만드는 방법 (1)
    1. 클래스명 뒤에 'constructor(val 초기화 할 프로퍼티: 타입)'을 붙이고
    2. 인스턴스 생성시 매개변수로 값을 넣어준다
  • 생성자 만드는 방법 (2)
    • 클래스의 프로퍼티명과 생성자의 프로퍼티명이 같다면
    1. 클래스명 뒤에 '(val 프로퍼티: 타입)'을 붙이고
    2. 인스턴스 생성시 매개변수로 값을 넣어준다
class Human (val name: String = "Anonymous") {    
    init {
        println("I am new human")
    }
    
    fun running() {
        println("Running is so tired")
    }
}

fun main() {
    val human = Human()
    human.running()
    
    println("This human's name is ${human.name}")
}
I am new human
Running is so tired
This human's name is Anonymous
  • 생성자에 디폴트값을 주면 빈 생성자를 사용할 수도 있다
  • 새로운 인스턴스가 생성될 때 기본적으로 무언가를 하고 싶다면 init 함수 내에 작성해주면 된다

(1) 부생성자

class Human (val name: String = "Anonymous") {    
    constructor(name: String, age: Int) : this(name) {
        println("my name is ${name}, ${age} years old")
    }
    
    init {
        println("I am new human")
    }
    
    fun running() {
        println("Running is so tired")
    }
}

fun main() {
    val human = Human("seungjae", 25)
    human.running()
}
I am new human
my name is seungjae, 25 years old
Running is so tired
  • 부생성자는 클래스 내에 constructor라는 키워드로 생성하고 this 내부에 주생성자를 위임받아 사용하면 된다

3. 상속

open class Human (val name: String = "Anonymous") {
    init {
        println("I am new human")
    }
    
    open fun running() {
        println("Running is so tired")
    }
}

class Korean: Human("seungjae") {
    override fun running() {
        super.running()
        println("아 힘들다")
    }
}

fun main() {
    val korean = Korean()
    korean.running()
    println("my name is ${human.name}")
}
I am new human
Running is so tired
아 힘들다
my name is seungjae
  • Java와 마찬가지로 Kotlin도 상속은 하나만 가능하다
  • Kotlin의 클래스는 기본적으로 final이기 때문에 같은 파일 내에서도 접근이 불가하다
  • 상속을 허용하기 위해서는 class 앞에 open 키워드를 써야한다
  • 상속을 받는 클래스는 'class 클래스명: 상속받는 클래스명()' 형식으로 작성하면 된다
  • 오버라이드를 허용하기 위해서도 마찬가지로 open 키워드를 써야한다
profile
🤗🤗🤗

0개의 댓글