[Kotlin] 코틀린 총 정리1 - 기본개념

김민주·2022년 10월 10일
0

Kotlin

목록 보기
1/3



코틀린 총 정리 1편 - 기본개념



Code with Joyce 님의 영상,
부스트코스 코틀린강좌,
오준석의 안드로이드 생존코딩 책(2판)을 기반으로 작성하였습니다


왜 코틀린인가?


  • Statically Typed
    정적타입언어가 컴파일러시 변수의 type이 결정되어 안전하다
  • Interoperable
    JAVA와 100% 호환된다
    코틀린 컴파일러는 자바 ByteCode를 생성한다, 자바 라이브러리 사용가능, 자바코드와 섞어서도 사용가능
  • Null Safety
    NPE(Null Pointer Exception)를 방지할 수 있는 안정성
    Nullable 변수와 Non-Null 변수의 구분
  • Immutable
    ex) val변수
  • Concise
    코드의 간결성, 보일러플레이트 코드의 최소화
    ex) dataclass
  • Extension Functions
    클래스 상속이나 디자인패턴을 상속하지 않아도 기능 확장 가능
  • Functional Programming
    함수의 유기적 연결을 연결을 통한 프로그래밍 방식
    ex) 람다식을 통한 익명함수를 식에 전달 가능, 함수가 일급객체로 사용가능
  • Multiplatform



그럼 기본개념 정리 Start💫






0. 기본 자료형

  • kotlin의 기본 자료형은 모두 객체
  • java가 primitive 자료형과 객체 자료형으로 분류되는것과 다름!
  • primitive 자료형이 아닌 Reference type 참조자료형을 사용함!

  • 숫자형
자료형설명
Double64bit 부동소수점
Float32bit 부동소수점
Long64bit 정수
Int32bit 정수
Short16bit 정수
Byte8bit 정수
  • 문자형
자료형설명리터럴
String문자열"", """ """
Char한 문자''
  • 문자열/오브젝트 비교
비교자바코틀린
문자열equals()==
Object=====
  • unsigned 자료형은 val uInt : UInt = 153u
  • 실수자료형은 Double형이 기본이라 Float 사용시 F 넣기
  • 참조형으로 선언한 변수의 값이 -128~127 사이에 있으면 캐시에 값을 저장하고 그외는 Heap에 독립 공간에 저장함
  • 기본형은 Stack에 저장함



➡️ 형변환

  • 숫자형 자료형
    • toInt()
    • toDouble()
    • toString()
  • 문자형 자료형
    • Integer.parseInt()
  • 일반 클래스 간 형변환
    • as
      dog as Animal



✔️ 형체크

is키워드로 type 체크.

if(str is String){}



1. 함수

JAVA

접근제한자 + 반환형 + ... + 함수이름

Kotlin

fun + 함수이름(): Unit{}

  • Unit = void : return형 없을 때 (생략가능)

코틀린의 entry 함수는 fun main(){}

매개변수와 반환형이 있는 함수

fun add(a: Int, b:Int): Int{
    return a + b
}

java랑 다르게 변수명을 먼저! 반환형이 뒤에!

fun add(a: Int, b:Int) = a + b

함수 몸체가 Expression인 경우 return 생략가능하며 return type이 자동 추론됨



2. val vs var

value 은 immutable type = 변수

variable 은 mutable type = 상수

val a: Int = 10
a = 4

val은 재대입이 불가 (final과 유사)

kotlin은 타입 추론 기능이 있어서 생략가능

val b = 3 해줘도 알아서 Int로 저장됨

But, 초기화시 값을 할당하지 않는다면 type명시해줘야함

val c : String
c = "minju"



늦은 초기화

                lateinit              by lazy       
사용가능변수varval
null 초기화XO
초기화 전 변수 사용가능여부XO
유의Int,Long,Double,Float에서 사용불가val 선언 후 by lazy{}블럭에 초기화에 필요한 코드 작성



getter setter 자동생성

  • val 은 get
  • var 은 get,set 자동생성됨



3. String Template

$ / ${...}

변수이름 or 함수이름 앞에 $ 붙여서 출력가능

fun main(){
    val name = "minju"
    val lastName = "Kim"
    println("my name is $name")
    println("my name is ${name+lastName}I'm 24")
}

대괄호{}를 이용하여
1. 변수이름이 어디까지인지 지정해 줄 수도 있음
2. + 로 변수 여러개를 합칠 수도 있음
3. 수식계산도 가능
4. $를 쓰고 싶다면 $ 로 escape처리



4. 조건식

kotlin에는 삼항연산자가 없기 때문에
java 처럼 써도 되지만 훨씬 간결하게 쓸 수 있음

fun maxBy(a: Int, b: Int) = if(a>b) a else b

if ~ else 로 바로 return를 넘겨줄 수도 있다

when

switch 역할.
식과 범위 모두 들어올 수 있고, !is String 같은 비교할 곳에 타입이 무엇인지까지 들어올 수 있음

fun check(score : Int){
    when(score) {
        100 -> println("만점")
        in 1..99 -> println("${score}점")
        0 -> println("빵점")
    }
    
    var b = when(score){
        100 -> println("만점")
        0 -> println("빵점")
        else -> println("${score}점")
    }
}

1개면 ->
여러개면 0,1 ->
범위면 in a..b
범위아닐시 !in a..b도 가능
when(x) { parseInt(s) -> 도 가능

변수의 리턴값으로 when을 쓸 때는 else절을 꼭 써줘야한다!



🧐Expression vs Statement (표현식 vs 문)

Expression : 하나 이상의 값을 만듦. = 수식
Statement : 실행만 하고 값을 따로 만들진 않음. =최소 독립코드

자바의 void 리턴 함수는 Statement 지만,
코틀린은 Unit 리턴하기 때문에

  • 코틀린에서는 모든 함수가 Expression 이다!

자바에서는 if문이 Statement 로 밖에 사용할 수 없지만,
코틀린은 Expression으로도 사용 가능하다.



5. Array / List / Map / Set


Array

  1. Mutable
  2. arrayOf() 메서드로 초기화
  3. 컴파일러가 자료형 유추가능할 때 자료형 생략가능

List

  1. List
    • listOf()
  2. MutableList (arrayList)
    • mutableListOf()
    • 대괄호[]안 요소 번호로 접근 가능
  3. 자료형 생략가능
val array2 : Array<Any> = arrayOf(1,"m",3.4f) //Mutable
val list2 :List<Any> = listOf(1,"j",11L) //Immutable
val arrayList = arrayListOf<Int>(1,2,5) //Mutable
val foods = mutableListOf("양꼬치","마라샹궈","김치볶음밥")
  1. list의 참조값은 바뀌지 않아서 val써도 됨!
  2. 새로운 arrayList객체를 할당하면 참조값이 바뀌니까 val불가!

Map

: key-value의 키가 중복될 수 없는 자료구조

  1. mapOf() - immutableMap 생성
  2. mutableMapOf() - mutableMap 생성
val citiesMap = mutableMapOf("한국" to "서울", "일본" to "도쿄", "프랑스" to "파리")
citiesMap["미국"] = "워싱턴" //추가
citiesMap["일본"] = "동경" //변경

Set

: 중복되지 않은 요소들로 구성된 자료구조

  1. setOf() - immutable 집합 생성
  2. mutableSetOf() - mutable 집합 생성
val citySet = mutableSetOf("서울","부산")
citySet.add("대구")
citySet.remove("부산")



6. 반복문

  • for

    for(변수 in 범위)

    for(i in 1..10 step 2){ // 1 3 5 7 9
        sum += i
    }
    for(i in 10 downTo 1){ // 10~1
        sum += i
    }
    for(i in 1 until 10){ // 1~9 마지막 미포함
        sum += i
    }
1. step: 단계
2. downTo: 내림차순 (step 적용가능)
3. a until b: a부터 b-1까지 
    val blackpink : ArrayList<String> = arrayListOf("jenny", "rose","jisoo","lisa")
    for(a in blackpink){
        println("${a}")
    }

for(변수 in 리스트) : arrayList 원소들 출력

    for(i in blackpink.indices){
        println("${i+1}번째 멤버: ${blackpink[i]}")
    }

for(변수 in 리스트.indices) : 인덱스 반환

    for((idx, name) in blackpink.withIndex()){
        println("${idx+1}번째 멤버이름: ${name}")
    }

for((인덱스,변수) in 리스트.withIndex()) : arrayList 인덱스 및 원소 출력

  • while
while(index < 10){
        index++
    }



7. Nullable / NonNull

Type을 생략하게 되면 기본적으로 NonNull
Type뒤에 ? 붙이면 Nullable

  • ?.

    안전한 호출

    Nullable 변수를 쓸 때는 ?.로 nullcheck를 해주자!
    (안하면 컴파일에러..)

    var name: String = "minju"
    var nullName: String? = null //Nullable

    var nameInUpperCase = name.toUpperCase() // nonNull이라 사용가능
    var nullNameInUpperCase = nullName?.toUpperCase() 
    //null이면 null반환, 아니면 함수실행
  • ?:

    Elvis operator

    Nullable 변수에 null일때 디폴트 값 지정
    (변수?: default 값)

    val fullName = name + (lastName?: " No lastName")
    
    upperCase = str?.toUpperCase ?: "초기화하세요"
  • !!

    강제 not null 처리
    절대 null 이 아닐 때 null아니라는 것을 보장

    확실하지 않는이상 NPE마주치니 지양하자

    fun ignoreNulls(str: String?){
       val mNotNull: String = str!! //절대 NULL아님~
       val upper = mNotNull.toUpperCase()
    }
  • let

    let 함수는 자신의 리시버객체를 내부로 옮겨 실행하는 함수

    1. NULL아닐 때 블럭안에 것을 진행한다(NULL이면 진행X)
    2. 객체를 it 키워드로 호출가능
    val email : String?= "minju@haha.com"
    email?.let{
        println("my email is ${email}")
    }



8. Class

java와는 다르게 파일 이름과 클래스 이름이 일치하지 않아도 된다

여러 클래스가 한 클래스 안에 들어갈 수도 있음

class Human constructor(val name: String = "miyeon") {
  1. constructor로 기본생성자를 지정
  2. 매개변수안에 변수 지정가능
  3. 변수 디폴트값 지정가능
open class Human(val name: String = "Anonymous") {
    //기본생성자
    constructor(name:String, age:Int) : this(name){
        //부 생성자는 주 생성자의 위임을 받아야해서 this로 받아옴
        println("my name is ${name}, ${age}years old")
    }
    init{ //젤먼저 실행 그다음 constructor
        println("이건 주 생성자")
    }

    open fun eatingCandy() {
        println("yummy mintCandy~~")
    }
}

fun main() {
    val human = Human("minju")
    val idle = Human()
    val ive = Human("Liz",20)
    human.eatingCandy()
    println("She's name is ${human.name}")
    println("She's name is ${idle.name}")
}



8-1. 추상클래스

  • abstract class
    • 직접 인스턴스화 X
    • 다른 클래스가 상속하여 미구현 메소드 구현
    • 단일 상속



8-2. 인터페이스

  • interface
    • 미구현 메소드를 포함하며 클래스에서 이를 구현
    • 여러 인터페이스 다중 구현 가능
    • 추상 메소드, 추상클래스와 다르게 abstract 키워드 생략가능
    • 구현된 메소드 포함 가능 (자바8 default 메소드)



9. 상속

클래스 상속은 자바랑 똑같이 하나만 상속할 수 있다.

자바는 extends
코틀린은 : 부모클래스


코틀린클래스는 기본적으로 상속금지

접근허락을 위해 부모클래스 및 함수,프로퍼티를 open 해줘야 함

class Korean : Human(){
    //오버라이딩
    override fun eatingCandy(){
        super.eatingCandy() //민트캔디 출력
        println("yummy kimchiCandy~~")
        println("my name is ${name}") // 마넴이즈 Anonymous 출력
    }
}

fun main(){
    val korean = Korean()
    korean.eatingCandy() // 김치캔디 출력
}

접근제한자

  • public
  • private
  • protected
  • interval : 같은 모듈 내에서만 사용가능
    • smartphone/watch/TV 용 안드로이드 app 개발시 모듈3개 필요, 이러한 모듈간의 접근 제한



profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

0개의 댓글