2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

코틀린의 scope 함수(let, run, with, apply, also)의 차이는 무엇인가요?

_____
코틀린 스코프 함수(Scope Functions) 차이 FAQ

1. 코틀린 스코프 함수란 무엇인가요?
스코프 함수는 객체를 일시적으로 새로운 범위(스코프)에서 다룰 수 있게 해주며, 코드 가독성과 간결성을 높여주는 함수입니다. 대표적으로 let, run, with, apply, also가 있습니다.

---

2. 각 스코프 함수의 기본 역할은 무엇인가요?

| 함수 | 리시버 객체 전달 방식 | 반환값 | 주요 용도 및 특징 |
|-------|------------------------|-------------------------------|----------------------------------------|
| `let` | 람다 인자로 전달 (`it`) | 람다 결과값 | 널 체크, 객체 변환 후 결과 반환 |
| `run` | 람다 수신객체로 전달 (`this`) | 람다 결과값 | 객체 초기화 및 계산 후 결과 반환 |
| `with`| 수신객체를 인자로 전달 (일반 함수) | 람다 결과값 | 객체 여러 속성 접근 시 사용 (수신객체 고정) |
| `apply`| 람다 수신객체로 전달 (`this`) | 수신객체 자체 | 객체 설정(프로퍼티 할당) 후 객체 반환 |
| `also`| 람다 인자로 전달 (`it`) | 수신객체 자체 | 부수 효과(로깅, 디버깅) 처리 후 객체 반환 |

---

3. `let`과 `also`의 차이점은 무엇인가요?
- `let`은 `it`를 받아 람다 결과를 반환하며, 주로 객체를 변환 하거나 `null` 처리 후 결과를 반환할 때 사용됩니다.
- `also`는 `it`를 받아 객체 자체를 반환 하며, 주로 부수 효과(로깅, 디버깅)를 처리할 때 객체 흐름을 유지하기 위해 사용됩니다.

```kotlin
val result = str?.let { it.length } // String? → Int?
val obj = list.also { println(it) } // 리스트 출력 후 원래 리스트 반환
```

---

4. `run`과 `with`의 차이점은 무엇인가요?
- `run`은 확장 함수로 객체 위에서 호출하며, `this`를 받아 람다 결과를 반환합니다.
- `with`는 일반 함수로 객체를 인자로 넘기며, `this`도 동일하게 람다 내에 있지만 객체가 명시적으로 인자로 전달됩니다.

```kotlin
// run (객체에서 호출)
val length = "hello".run { length }

// with (객체를 인자로 받음)
val length = with("hello") { length }
```

`with`는 객체 여러 속성에 접근할 때 가독성이 좋으며, `run`은 객체 스코프 내에서 연산 또는 초기화를 수행할 때 사용됩니다.

---

5. `apply`와 `also`의 차이점은 무엇인가요?
- `apply`는 `this`를 받으며, 객체 설정(프로퍼티 변경) 후 객체 자신을 반환 합니다. 보통 객체 초기화에 사용됩니다.
- `also`는 `it`를 받으며, 부수 효과(로깅, 이벤트 처리 등) 후 객체 자신을 반환 합니다.

```kotlin
val obj = MyClass().apply {
property = value // 객체 설정용
}

val obj2 = obj.also {
println(it) // 부수 효과용
}
```

---

6. 요약: 언제 어떤 스코프 함수를 사용해야 할까요?

| 상황 | 추천 함수 | 이유 |
|---------------------------------|-----------------|---------------------------|
| 객체를 안전하게 다루고 변환할 때 | `let` | null 체크 등 변환에 적합 |
| 객체 스코프 내에서 연산할 때 | `run` | 람다 결과 반환, 코드 간결 |
| 명시적 객체 스코프 필요할 때 | `with` | 여러 속성 참조 시 가독성 |
| 객체 초기화 및 설정할 때 | `apply` | 객체 자신 반환, 프로퍼티 할당 용이 |
| 부수 효과를 처리하고 객체 유지할 때 | `also` | 로그, 디버깅 등에 사용 |

---

7. 스코프 함수 사용 시 주의할 점은 무엇인가요?
- `let`과 `also`는 `it`를 받으므로 람다 내에서 객체 이름 대신 `it`를 사용합니다.
- `run`, `apply`, `with`는 `this`를 받으므로, 객체 멤버에 직접 접근 가능하지만 람다 밖 변수를 명시적으로 참조하려면 `this@scope` 형식을 사용해야 할 수 있습니다.
- 너무 남용하면 오히려 코드가 복잡해질 수 있으니, 목적에 맞는 함수 선택이 중요합니다.

---

이상으로 코틀린 스코프 함수(let, run, with, apply, also)의 차이점과 사용법에 대한 상세 FAQ였습니다.
코틀린(Kotlin)에서는 객체의 범위를 제한하여 코드의 가독성을 높이고, 객체를 더 쉽게 다룰 수 있도록 도와주는 여러 가지 스코프 함수(scope function)를 제공합니다.

이들 함수는 `let`, `run`, `with`, `apply`, `also`로 구분되며, 각각의 사용 목적과 동작 방식이 다릅니다.

아래에서 각 스코프 함수의 특징과 차이점을 자세히 설명하겠습니다.

1. `let` - 용도 : 주로 null 체크와 함께 사용되며, 객체를 안전하게 사용할 수 있도록 도와줍니다.

- 리턴 값 : 블록의 마지막 표현식의 결과를 반환합니다.

- 사용법 : `let`은 객체를 `it`이라는 이름으로 참조할 수 있게 해줍니다.

```kotlin val name: String? = "Kotlin" name?.let { println("Name is $it") } ``` 위의 예제에서 `name`이 null이 아닐 경우에만 `let` 블록이 실행됩니다.



2. `run` - 용도 : 객체의 메서드를 호출하거나 프로퍼티에 접근할 때 유용합니다.

주로 초기화 블록에서 사용됩니다.

- 리턴 값 : 블록의 마지막 표현식의 결과를 반환합니다.

- 사용법 : `run`은 객체를 `this`로 참조할 수 있게 해줍니다.

```kotlin val result = StringBuilder().run { append("Hello, ") append("World!") toString()() // 마지막 표현식 } println(result) // "Hello, World!" ```

3. `with` - 용도 : 객체의 메서드나 프로퍼티에 여러 번 접근할 때 유용합니다.

주로 객체를 초기화하거나 설정할 때 사용됩니다.

- 리턴 값 : 블록의 마지막 표현식의 결과를 반환합니다.

- 사용법 : `with`는 객체를 `this`로 참조할 수 있게 해줍니다.

`with`는 확장 함수가 아니므로, 객체를 명시적으로 전달해야 합니다.

```kotlin val stringBuilder = StringBuilder() with(stringBuilder) { append("Hello, ") append("World!") } println(stringBuilder.toString()) // "Hello, World!" ```

4. `apply` - 용도 : 객체를 설정할 때 주로 사용됩니다.

객체의 프로퍼티를 초기화하거나 설정하는 데 유용합니다.

- 리턴 값 : 원래의 객체를 반환합니다.

- 사용법 : `apply`는 객체를 `this`로 참조할 수 있게 해줍니다.

```kotlin val stringBuilder = StringBuilder().apply { append("Hello, ") append("World!") } println(stringBuilder.toString()) // "Hello, World!" ```

5. `also` - 용도 : 객체를 사용하면서 추가적인 작업을 수행할 때 유용합니다.

주로 로깅이나 디버깅에 사용됩니다.

- 리턴 값 : 원래의 객체를 반환합니다.

- 사용법 : `also`는 객체를 `it`으로 참조할 수 있게 해줍니다.

```kotlin val stringBuilder = StringBuilder().also { it.append("Hello, ") it.append("World!") println("Current state: ${it.toString()}") // "Current state: Hello, World!" } println(stringBuilder.toString()) // "Hello, World!" ``` 요약 - let : null 체크와 함께 사용, `it`으로 참조, 블록의 결과 반환. - run : 객체의 메서드 호출, `this`로 참조, 블록의 결과 반환. - with : 객체의 메서드 호출, `this`로 참조, 블록의 결과 반환, 객체를 명시적으로 전달. - apply : 객체 설정, `this`로 참조, 원래 객체 반환. - also : 추가 작업 수행, `it`으로 참조, 원래 객체 반환. 이러한 스코프 함수들은 코드의 가독성을 높이고, 객체를 더 쉽게 다룰 수 있도록 도와줍니다.

각 함수의 특성을 이해하고 적절한 상황에서 사용하는 것이 중요합니다.

작성자: 정유빈 [비회원] | 작성일자: 1년 전 2024-09-09 09:47:14
조회수: 238 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.