[Kotlin] 기본 문법

Jeanine·2022년 5월 2일
0

android

목록 보기
1/10
post-thumbnail

Part 1.

  • main 함수로 시작
  • print() 사용
  • 함수 형태는 아래와 같음
fun sum(a: Int, b: Int): Int {
	return a + b
}

// 표현식
fun sum(a: Int, b: Int) = a + b
fun max(a: Int, b: Int) = if (a > b) a else b

Part 2.

  • 변수 종류는 val, var이 있음
val a: Int = 1
var e: String?
  • 변수 선언을 할 때는 변수의 타입을 명시하지 않아도 됨
  • null 참조가 가능하게 하려면 String? 이렇게 선언해야 함
  • 변수를 선언할 때 초기화를 해버리면 null 참조 불가능 (null safe)
  • 정수형은 Int로 할당되고, 실수형은 Double로 할당됨 (Long이나 Float로 할당하고 싶으면 뒤에 L 또는 f를 붙여줘야 함)

Part 3.

  • 반복문에는 range 개념 사용
for (i in 1..5) {
	println(i)
}
// 1 2 3 4 5

for (i in 6 downTo 0 step 2) {
	println(i)
}
// 6 4 2 0

for (i in 1..5 step 3) {
	println(i)
}
// 1 4

for (i in 0 until 6) {
	println(i)
}
// 0 1 2 3 4 5
  • when문은 아래와 같음
when (x) {
	1 -> print("x == 1")
    2 -> print("x == 2")
    else -> {
    	print("x is neither 1 nor 2")
    }
}

when (x) {
	1, 2 -> print("x == 1 or x == 2")
    else -> {
    	print("x is neither 1 nor 2")
    }
}

Part 4.

  • [Score Function1] Apply 함수: 객체를 초기화할 때 사용
    • 람다식 내부에서 수신 객체 명시 불필요

inline fun T.apply(block: T.() -> Unit): T

val person = Person().apply {
	firstName = "Fast"
    lastName = "Campus"
}
  • [Score Function2] Also 함수: 객체가 parameter로 전달되어 it으로 접근 가능
Random.nextInt(100).also {
	print("getRandomInt() generated value $it")
}

// 이렇게 parameter명을 지정해주면 it 대신 그 parameter명으로 접근
Random.nextInt(100).also { value ->
	print("getRandomInt() generated value $value")
}
  • [Score Function3] Let 함수: 코드 블럭 안에서 실행되었던 결과가 코드 블럭 밖으로 반환 (null safety를 위해 많이 사용)
val number: Int?

// number가 null이 아닐 때만 let 함수 실행
val sumNumberStr = number?.let {
	"${sum(10, it)}"
}
  • [Score Function4] With 함수: 객체를 가지고 어떤 동작을 하도록
val person = Person()

with(person) {
	work()
    sleep()
    println(age)
}
  • [Score Function5] Run 함수: With 함수와 비슷하지만 확장함수로 사용 가능
val result = service.run {
	port = 8080
    query()
}

Part 5.

  • data class: 데이터를 저장할 때 사용하는 클래스 (getter, setter와 같은 함수가 생략됨)
data class JavaObject(val s: String)
  • getter, setter 함수를 통한 방법이 아닌 직접 접근 방법이 사용됨

Part 6.

  • 람다식 (함수형 언어에 가까운 특징)
// onClickListener() 불필요
button.setOnClickListener { v ->
}

Part 7.

  • lateinit: 초기값을 나중에 할당해줘서 null safe하게 사용하는 방식
    - var에 사용 (재할당 가능)
    • null로 초기화 불가능
    • 초기화 전에는 사용 불가능
      • 보통 Fragment 내에서 onViewCreated() 전에 View를 초기화할 때 사용

코드 예시 1)

var nullableNumber: Int? = null

lateinit var lateinitNumber: Int

lateinitNumber = 10

nullableNumber?.add()
lateinitNumber.add() // 만약 초기화를 안 해주었다면 여기서 에러 발생!

코드 예시 2)

class LoginFragment : Fragment() {
    private lateinit var statusTextView: TextView

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)

            statusTextView = view.findViewById(R.id.status_text_view)
            statusTextView.setText(R.string.auth_failed)
    }
}
  • lazy init: 사용할 때 초기화하는 방식
    - val에 사용 (재할당 불가)
    - 만약 따로 사용하는 위치가 없으면 onCreate() 안에서 선언은 해줘야 함 (변수명만 작성)
val lazyNumber: Int by lazy {
	100
}

lazyNumber.add() // 사용할 때 100이 할당

📍 lateinit과 lazy init을 사용하는 이유: 클래스 생성할 때 시간 및 메모리 절약 [참고]


Part 8.

1) Set: 동일한 데이터가 존재할 수 없는 컬렉션 (집합의 개념과 비슷)
- Immutable Set: setOf()
- Mutable Set: mutableSetOf()
- Hash Set: hashSetOf()

📍 setOf()와 hashSetOf()의 차이: 여기 참고

2) List: 데이터를 추가하거나 삭제를 할 때 순서를 지키는 컬렉션
- Immutable List
- Mutable List

3) Map: Key-Value 형식으로 되어있는 컬렉션


[참고]

[Kotlin] apply, run, with, let, also 차이 한 번에 정리하기

profile
Grow up everyday

0개의 댓글