개발일지

1. Basic Syntax 본문

Kotlin

1. Basic Syntax

강강강 2021. 7. 6. 08:48
  1.  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