어제 배운내용중에 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 |
댓글