본문 바로가기
수업내용

20230728 Kotlin

by titlejjk 2023. 7. 28.

어제 배운내용중에 init 복습.

init 블럭은 대표 생성자의 일부이다.

class Ship constructor(){
    //init 블럭은 대표 생성자의 일부이다.
    init {
        //객체를 생성하는 시점에 초기화 하고 싶은 작업이 있으면 여기서 한다.
        println("Ship클래스의 init")
    }
}

Ship( )이 호출되면 init블럭이 먼저 호출이 된다.

 

constructor예약어의 생략 가능

class Ship2 (){
    init {
        //객체를 생성하는 시점에 초기화 하고 싶은 작업이 있으면 여기서 한다.
        println("Ship2클래스의 init")
    }
}

생성자의 인자로 전달 받을게 없으면 ( )도 소괄호도 생략 가능

//생성자의 인자로 전달 받을게 없으면 ()소괄호도 생략이 가능하다.
class Ship3 {
    init {
        //객체를 생성하는 시점에 초기화 하고 싶은 작업이 있으면 여기서 한다.
        println("Ship2클래스의 init")
    }
}

필드의 선언과 초기화블럭 사용법과 이를 줄이는 방법

//class Person constructor(name:String){
//    //필드선언
//    var name:String
//    //초기화 블럭
//    init {
//        //생성자의 인자로 전달받은 값을 매개 변수에 저장
//        this.name=name;
//    }
//}

class Person(var name:String)

클래스 선언시 var 또는 val을 생성자의 인자에 선언하면 전달받은 값이 자동으로 같은 이름의 필드가 

만들어 지면서 값이 필드에 대입이 된다.

*var, val을 반드시 사용해야지 선언이 가능하다.

인자로 전달받을 값 String이 없어서 오류가 나는 것을 확인 할 수 있다.

여러 객체를 생성해서 호출하는 방법은 아래와 같다.

class 앞에 data 예약어를 붙이면 어떤 객체에 어떤 값이 들어가있는지 바로 확인할 수 있다.

Kotlin에서의 그냥 List는 수정이 불가하다. 먼저 Kotlin에서  List를 사용하고 싶으면 아래와 같이 사용하면된다.

자바로 바꾼다면?

val members:MutableList<Member> =

즉 val은 상수이기 때문에 자바 코드로 바꾼다면 아래와 같다.

 final List<Member> = members

 

그래서 기본적인 List객체작성법은 아래와 같다.

 //수정가능한 list객체를 얻어내서 참조값을 members라는 상수에 담기
    val members:MutableList<Member> = mutableListOf<Member>()

또 type추론이 가능하기 때문에 members2의 type은 생략이 가능하다 그래서 이를 줄인다면

 //type추론이 가능하기 때문에 members2의 type 생략 가능
    val members2 = mutableListOf<Member>()

이 된다.

 

그럼 List의 add메서드를 통해 Member객체의 참조값을 저장해보겠다,

 //List의 add메서드를 이용해서 Member객체의 참조값 저장하기
    members.add(m1)
    members.add(Member(2,"혜리","서울"))

 

forEach를 사용하면 아래와 같다.

    //List의 add메서드를 이용해서 Member객체의 참조값 저장하기
    members.add(m1)
    members.add(Member(2,"혜리","서울"))

    /*
     * list의 forEach()함수를 호출하면서 함수를 전달하면 전달한 함수의 매개 변수에
     * list에 저장된 아이템이 순서대로 저달된다.
     */
    members.forEach(fun(item){
        println(item)
    })

forEach를 통해 호출된 메서드는 전달 즉시 호출이 되면 위에 List를 살펴보면 m1과 Member객체(2, "혜리", "서울")가 있는데 이를 forEach를 통해 호출하게 되면 총 2번이 호출된다.

위에 forEach도 생략이 가능하다.

 //매개변수가 한개인 경우에는 fun(item)도 생랴깅 가능하다.
    members.forEach({

    })

생략한 상태에서 보면 it: Member라고 알려주고 있다.

당연 Java에서는 문법오류가 날만하다. 헷갈려🌠

 

class Cat constructor(){
    //init블럭은 primary생성자의 일부
    init{
        println("내가만든 쿠키")
    }
    //뒤늦은 초기화가 가능한 필드 lateinit 예약어를 붙여서 선언하기
    lateinit var name:String
    constructor(name:String) : this() {
        println("너를 위해 구웠지:${name}")
        this.name=name
    }
}

fun main(){
   val c1 = Cat("But you know that it ain't for free, yeah")
    println(c1.name)
}

Kotlin은 null을 넣을 수 있는 데이터 타입과 null을 넣을 수 없는 데이터 타입이 있다.

Java에서는 먼저 null값을 넣어주고 나중에 값을 넣게 해줄 수 있지만 Kotlin은 null을 먼저 선언할 수 없다.

그럼 아예 null을 지정할 수 없을까? String type뒤에 " ? "를 넣어주면 null을 사용할 수 있다.

    //null값이 가능한 data type은 type뒤에 ?를 붙여 주어야 한다.
    //String type과 String? type은 다른 type으로 간주된다.
    var myName:String? = null

이렇게 사용하면 null값도 넣을 수 있다.

 

null이 가능한 type공간에 null이 불가능한 type공간에 담긴 값을 대입하는 것은 가능하다.

이 말은 String?은 null까지 담을 수 있고, String은 null을 포함할 수 없다. 그럼 포용가능한 범위는 당연 String?이 넓다.

즉 String?은 일반 String까지 값을 대입가능하다. 하지만 String에는 String?을 담을 수 없다.

 

d2에 값이 없어도 null로 출력되는 것을 확인할 수 있다.

'수업내용' 카테고리의 다른 글

20230731 Kotlin  (0) 2023.08.01
20230731 Kotlin  (0) 2023.07.31
20230727 Android  (0) 2023.07.28
20230727 Kotlin Function  (0) 2023.07.27
20230726 Android Fragment  (0) 2023.07.26

댓글