Kotlin 문법 정리

yeji·2021년 1월 6일
1

변수, 상수 선언

변수 (선언 후 값 변경 가능)

타입 추론 : var myName = "Hong"
타입 지정 : var myName:String

상수 (선언 후 값 변경 불가)

val MYNAME = "Hong

기본 타입

실수형

var doubleValue:Double = 35.6
var floatValue:Float = 124.6f // f 붙이기 (필수)

정수형

var intValue:Int = 123456
var longValue:Long = 2_147_483_647l // l 붙이기 (선택)
var shortValue:Short = 123
var byteValue:Byte = 127

문자형

var charValue:Char = 'a'
var stringValue:String = "크기를 특정할 수 없다."

불린형

var booleanValue:Boolean = true

배열, 컬렉션

배열

var intArr:IntArray = IntArray(10) // size 10인 Int 배열
intArr[0] = 100 // 0번째 인덱스에 100 대입
// intArr[20] = 200 /* error */

컬렉션

list : listOf<GENERIC_TYPE>()
mutableList : mutableListOf<GENERIC_TYPE>()
mutableMap : mutableMapOf<KEY_TYPE, VALUE_TYPE>()

// Generic 타입 명시 필요
var list = listOf<Int>() // 입력된 값을 바꿀 수 없다.
var mutableList = mutableListOf<int>() // 동적이라 값을 바꿀 수 있다.
var mutableMap = mutableMapOf<String, String>() // key, value 쌍으로 추가, 조회

// 값 넣기
var mutableList.add(5) // add() : 자동적으로 index 생성됨
var mutableMap.put("변수1", "값1")

// 값 조회
Log.d(TAG, mutableList.get(0)) // 0번째 인덱스의 값 로그 찍기
Log.d(TAG, mutableList[0]) // 같은 표현
Log.d(TAG, mutableMap.get("변수1")) // key에 해당하는 value 값 로그 찍기

조건문

비교 연산자

<, >, >=, <=, ==, !=

var result1 = 1 > 2 // -> false
var result2 = "홍길동" == "홍길동" // -> true

논리 연산자

&&, ||, !

var logic1 = 300<500 && 1 > 100
var logic2 = 300<500 || 1 > 100
var logic3 = !false

if, else if, else

if (조건식) {
  // code
} else if (조건식) {
  // code
} else {
  // code
}

when

if문의 확장판

var month = 7
when (month) {
  // 특정 값 찾기
  1 -> {
    Log.d(TAG, "1월 입니다.")
  }
  // 특정 값 찾기 한 줄로 작성
  2 -> Log.d(TAG, "2월 입니다.")
  
  // 범위 찾기
  3, 4, 5 -> {
    Log.d(TAG, "봄 입니다.")
  }
  in 6..8 -> {
    Log.d(TAG, "여름 입니다.")
  }
  
  // 그 외 범위
  else -> {
    Log.d(TAG, "집에 있습니다.")
  }
}

반복문

for

for (idx in 1..10) { } // 1~10까지
for (idx in 1 until 10) { } // 1~9까지
for (idx in 1 until 10 step 2) { } // 1, 3, 5, 7, 9
for (idx in 10 downTo 1) { } // 10, 9, ... , 1
for (idx in 10 downTo 10 step 2) { } // 10, 8, 6, 4, 2

var intArray = intArrayOf(0, 1, 2, 3, 4, 5, 6, 7, 8)
for (value in intArray) { } // Array의 값을 꺼냄, Collection도 가능

while, do while

// 반복가능한 if문
var out = 0
while (out < 3) {
  out = out + 1
}

out = 3
do {
  out = out + 1
} while (out < 3)

// control loop
for (idx in 0..10) {
  if (idx == 3) continue
  if (idx > 5) break
}

함수

함수를 사용하는 이유? 코드를 분류하기 위해서!

// 선언 방법
fun functionName() { ... }
fun functionParam(param1:String, param2:Int) { ... }
fun getPi() : Double { return 3.141592 } // 함수명 옆에 ": return type"

// 호출 방법
functionName()
functionParam("value", 142)
var pi = getPi()

클래스

변수(property)와 함수(method)의 모음

// 클래스 선언
class className {
  init {
    // 클래스를 초기화 하면 호출
  }
  
  var variable:String = "" // 변수 - property
  fun function() {
    var variable_local = "" // 함수 - method
  }
}

// 클래스 초기화 후 사용
var cls = className() // instance : 메모리에 로드되어 있는 클래스
 
// 클래스 초기화 후 클래스 내부의 property와 method 사용
cls.variable
cls.function()
  • 클래스를 초기화 없이 사용하려면?
    클래스 내부에 companion object block 사용!
// companion object 포함한 클래스 선언
class Log {
  companion object {
    fun d(paramTag:String, paramMsg:String) {
      print("[$paramTag] : $paramMsg")
    }
  }
}

//  클래스 초기화 없이 사용 가능
Log.d("Tag", "Message")
  • 상속 사용하는 이유?
    1. 기존의 작성된 코드를 재활용
    2. 코드 재활용을 체계적인 구조로 사용하기 위해
  • 상속 허용 키워드
    • open
  • 상속 받는 키워드
    • class ChildClass : ParentClass() { ... }
    • override로 재정의
//open 키워드로 상속 허가
open class Parent {
  var money = 5000000
  // open 키워드로 자식 클래스에서 재정의 허가
  open var house = "강남 200평 아파트"
  
  open fun showHouse() {
    Log.d("class", "my house=${house}")
  }
}
// 상속받을 때에도 초기화 필요 Parent()
class Child : Parent() {
  // override 키워드로 부모 멤버와 동일한 이름을 재정의
  override var house = "강남 10평 오피스텔"
  fun showMoney() {
    Log.d("class", "money=${money}")
  }
  override fun showHouse() {
    Log.d("class", "my house=${house}")
  }
}

// 사용
var parent = Parent()
var child = Child()

child.showMoney() // 상속 받으면 부모 멤버를 내 것 처럼 사용할 수 있다

// 부모와 자식 각각 서로 다른 메서드 결과가 나옴
parent.showHouse()
child.showHouse() // 부모 멤버를 재정의하여 사용했음

overload : 같은 이름인 함수이지만 파라미터가 달라 다른 함수로 구분

class Son {
  fun getNumber() : Int {
    return 1
  }
  fun getNumber(param:String) : Int {
    return 2
  }
}

var son = Son()

var result1 = son.getNumber("홍")
var result2 = son.getNumber()

Handling Null

null : null object를 가리키는 것

  • null이 허용되는 멤버임을 알려주는 키워드
    nullable을 알려주는 키워드 : TYPE?
  • 왜 null을 사용할까? Null Pointer Exception을 다루기 위해!
    Safe call을 사용하면 ? 이후에 오는 코드가 실행되지 않는다.
    • 값을 저장해야 하는데 Safe call이 포함된 변수를 사용하여 값이 null이 되는 경우??
      ?: 키워드로 기본 값 지정 가능 (Elvis expression)
var myName:String = "메시"
var number:Int? = null // nullable
var newVariable:Activity? = null

number.plus(50) // Null Pointer Exception
number?.plus(50) // Safe call!! (? 이후의 코드 실행되지 않음)

// Elvis expression
var result = number?.plus(50) ?: 51 // ?: 키워드로 기본 값 지정 가능
result.plus(50)

references:
이것이 안드로이드다 with 코틀린 강좌

profile
🐥

0개의 댓글