개발일지
1. Basic Syntax 본문
- Kotlin android extension
- findViewById 하는 법
- val message = findViewById (R.id.message) as TextView
val message = findViewById <TextView>(R.id.message)
→ message.text = "setMessage"
# 형변환
val a: Long?=0
val b: Int ?= a → val b: Int?= a?.toInt()
# 변수 선언 방법
val/var 변수 이름 : 변수 타입 = 초기화
val/var name : String = ""
valuable/immutable (val) : Read-only ==> java final
variable/mutable (var) : Read/write
-mutable/variable
String name = "Name" → var name: Stirng = "Name" === var name = "name" //name="ABC" 대치 가능
-immutable/valuable
final String name = "Name" → val name : String = "Name" // name = "ABC" 대치 불가능 !! final 이기 때문에 값을 변경 못하는 것
# NULL
- 모든 객체는 생성과 동시에 값을 대입해서 초기화해야 함 (null도 null 값으로 초기화를 시켜줘야 해)
- 단 null은 특별한 연산자를 사용해서 초기화 해주기
val a:String = null // 에러! val b:String? = null // OK
# private 변수 만들기
class Test {
var name : String = "userName"
private set() // 내부에서는 name을 언제든지 변경할 수 있지만 외부에서는 가져가기만 해야 하는 경우
}
# 늦은 초기화 : lazy
val name: String by lazy {
"lazy initialized"
}
-호출시점에 초기화
-val(immutable)과 함께 사용
# 늦은 초기화 : lateinit
lateinit var name: String // 초기화 값은 존재하지 않아야 함
name = "lateinit initialized" // 꼭 초기화한 다음에 호출해야 함
-var(mutable) 만 사용 가능
-null 또는 초기값을 적용할 필요 없음
-늦은 초기화이므로 초기화 전에 사용하면 오류 발생 (lateinit property subject has not been initialized)
-변수에 대한 setter / getter 사용할 수 없음
=============================Class=============================
// 클래스 이름 정의와 함께 생성자를 가질 수 있음
class 클래스이름 constructor(변수){ } ==> class 클래스이름 (변수){ } // constructor 생략 가능
# 코틀린 다중 생성자
class Sample constructor(val name: String, val age : Int ) { // primary constructor : constructor 생략 가능
constructor (name: String) : this(name, 0 ) // secondary constructor : constructor 생략 불가능 // 항상 primary constructor 를 호출해줘야 함
}
# Default 생성자
class Sample(val name: String, val age: Int = 0 )
# init
class Sample(val name : String , val age: Int = 0 ) {
init {
println("name: $name , age : $age")
}}
# class 생성자에서 초기화
class Customer(name: String) {
val customerName = name.toUpperCase()
}
# class 상속
abstract class Base(age: Int)
// 추상클래스 사용
class UseBase(age: Int ) : Base(age)
---------
interface Base{
fun getName(): String}
// 추상클래스 사용
class UseBase : Base {
override fun getName() = "name" }
# class open ** (자바와 반대)
kotlin은 abstract/ interface 을 제외한 모든 클래스는 final 임 : 확장이 불가능함
→ 그래서 class 앞에 open 을 해줘야 확장이 가능함
ex) open class User(age:Int) : Customer(age) {}
===================function=========================
# defining functions
fun 함수명(변수) : Unit {값처리} //Unit 생략 가능 , return 값 없을 때
fun 함수명(변수) : 리턴타입 {return 값} // return 값 있을 때
java : int getSum(int a, int b) {return a+b}
kotlin : fun getSum(a: Int, b: Int) : Int {return a+b} → fun getSum(a: Int , b : Int ) : Int = a+b //return 생략 → fun getsum( a: Int , b : Int ) = a + b // 유추하기를 통한 생략
# extension functions
-원래있던 함수처럼 접근하여 사용가능
-extension 보다 class 내에 있던 원래 함수가 우선이다
fun 타입.함수명(변수): 리턴타입 {
return 값
}
ex) fun Int.max( x : Int ) : Int
= if (this > x ) this else x
사용할 때에는 → 숫자.max(숫자) → 1.max(15)
변수 1개만 있을 경우 infix notation 을 사용해 더 축약해보자
→
ex) infix fun Int.max( x : Int ) : Int
= if (this > x ) this else x
사용할 때에는 1 max 15
# Extension Properties
val <T> List<T>.lastIndex: Int
get() = size - 1
fun test(){
println(mutableListOf(1,0,3,30,50).lastIndex
}
# Named Arguments
fun setParams()
=====================if / when / loops ==============================
# if문
fun test(){
val a = 10
val b = 20
val max = a
if ( a<b) max = b
}
fun test() {
val a = 10
val b = 20
val max = if(a>b) a else b
}
# when (코틀린에는 switch 문이 없음)
val validNumbers = 9..10
val a: Any = 30
when (a) {
in 1..10 → println("1~10")
in validNumbers →println("validNumbers")
!in 10..20 → println("a is outside the range")
else ->println("else")
}
함수 안에 있을 때
fun printString( a: Any ) {
when (a) {
1,10 → println("1~10")
is String → println(a)
else →println("else")
} }
-when return
fun isString(a : Any ) = when (a) {
is String → true
else → false
}
# Loop
val name = "name"
for (i in name) {
println("i $i")
}
-step
for(value in 1...10 step 2){
println("value $value") }
-map (Key와 Value라는 것을 한 쌍으로 갖는 자료형)
val map = mutableMapOf( 1 to "ABC" , 2 to "BBB" , 3 to "CCC")
for ((key , value ) in map ) {
pritntln("key $key value $value ")
}
==================Lambdas (익명함수)====================
button.setOnClickListtener { it.alpha= 0.5f } // it : implicit name of a single parameter
# Lambdas Closures - 내부에 있는 context 에서 밖에 있는 context 에 접근하는 것 (자바에서는 전역으로 만들던가 배열로 설정해야 하지만 코틀린은 그럴필요 없음 접근가능하니까)
var count = 0
button.setOnClickListener { count++ }
# stream
===========return and jumps and This-expressions============
# labels 정의
-label 을 정의할 때 name@
-label 을 사용할 때 @name
# return at labels
@foreach
##This expression
'Kotlin' 카테고리의 다른 글
Kotlin 코틀린 써야하는 이유!! (0) | 2022.11.05 |
---|---|
4. 화면구성하기 (0) | 2021.07.06 |
3. Architecture (0) | 2021.07.06 |
2. 심화 (0) | 2021.07.06 |