BE/Kotlin

[Kotlin] 코틀린 문법 3 (filter, forEach, ?:, map, is, as)

baek-dev 2025. 2. 17. 23:16

📌 1. 컬렉션 필터링 (Filtering Collections)

Kotlin과 Java에서는 컬렉션(리스트, 맵 등)에서 특정 조건을 만족하는 요소만 추출할 수 있음.

 

✅ Java에서 컬렉션 필터링

import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        // 짝수만 필터링
        List<Integer> evenNumbers = numbers.stream()
                                           .filter(n -> n % 2 == 0)
                                           .collect(Collectors.toList());

        System.out.println(evenNumbers); // [2, 4, 6, 8, 10]
    }
}

Java의 특징

stream().filter(조건).collect(Collectors.toList())를 사용하여 필터링해야 함.

Stream API를 사용해야 하므로 코드가 길어짐.

 

✅ Kotlin에서 컬렉션 필터링

fun main() {
    val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    // 짝수만 필터링
    val evenNumbers = numbers.filter { it % 2 == 0 }

    println(evenNumbers) // [2, 4, 6, 8, 10]
}

Kotlin의 특징

filter { 조건 }을 사용하여 간결하게 필터링 가능함.

it 키워드를 사용하여 현재 요소를 나타낼 수 있음.

별도의 Stream API 없이 컬렉션에 필터링 함수가 기본 제공됨.

 

📌 2. forEach & map (리스트 변환)

Kotlin과 Java에서 forEach를 활용하여 리스트를 순회하고, map을 사용하여 변환할 수 있음.

 

✅ Java에서 forEach & map 사용

import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

        // forEach 사용
        names.forEach(name -> System.out.println(name));

        // 대문자로 변환 (map 사용)
        List<String> upperNames = names.stream()
                                       .map(name -> name.toUpperCase())
                                       .collect(Collectors.toList());

        System.out.println(upperNames); // [ALICE, BOB, CHARLIE]
    }
}

Java의 특징

forEach.forEach(람다) 형태로 사용됨.

map()을 사용하여 리스트 변환 가능하지만, collect(Collectors.toList())가 필요하여 코드가 길어짐.

 

✅ Kotlin에서 forEach & map 사용

fun main() {
    val names = listOf("Alice", "Bob", "Charlie")

    // forEach 사용
    names.forEach { println(it) }

    // 대문자로 변환 (map 사용)
    val upperNames = names.map { it.uppercase() }

    println(upperNames) // [ALICE, BOB, CHARLIE]
}

Kotlin의 특징

forEach { println(it) }처럼 간단하게 사용할 수 있음.

map을 사용하여 리스트 변환 가능하며, .collect() 필요 없이 map()만으로 변환이 완료됨.

Java보다 코드가 간결하고 직관적임.

 

📌 3. 엘비스 연산자 (?:)

Kotlin에서는 널 체크를 간단하게 하기 위해 엘비스 연산자(?:)를 제공함.

Java에서는 null 체크를 직접 해야 하지만, Kotlin에서는 더 간단하게 가능함.

 

✅ Java에서 null 체크

public class Main {
    public static void main(String[] args) {
        String name = null;
        
        // 삼항 연산자를 이용한 null 체크
        String result = (name != null) ? name : "Unknown";
        
        System.out.println(result); // Unknown
    }
}

Java의 특징

null 체크를 하기 위해 삼항 연산자를 사용해야 함.

 

✅ Kotlin에서 엘비스 연산자 사용

fun main() {
    val name: String? = null

    val result = name ?: "Unknown"

    println(result) // Unknown
}

Kotlin의 특징

?: (엘비스 연산자)를 사용하여 null 값일 때 기본값을 설정할 수 있음.

코드가 간결하고 가독성이 뛰어남.

 

📌 4. 타입 체크 & 캐스팅 (is vs instanceof)

Java에서는 instanceof를 사용하여 타입을 체크하고 캐스팅하지만, Kotlin에서는 is 키워드를 사용하며 스마트 캐스팅이 적용됨.

 

✅ Java에서 instanceof 사용

public class Main {
    public static void main(String[] args) {
        Object obj = "Hello";

        if (obj instanceof String) {
            String str = (String) obj;
            System.out.println(str.length()); // 5
        }
    }
}

Java의 특징

instanceof를 사용하여 타입을 체크함.

형변환(casting)을 직접 해야 함 ((String) obj).

 

✅ Kotlin에서 타입 체크 (is)

fun main() {
    val obj: Any = "Hello"

    if (obj is String) {
        println(obj.length) // 5
    }
}

Kotlin의 특징

is 키워드를 사용하여 타입을 체크할 수 있음.

스마트 캐스팅이 적용되어 별도의 형변환이 필요 없음.

if (obj is String)이 참이면, obj는 자동으로 String 타입으로 변환됨.

 

📌 5. 강제 캐스팅 (as)

✅ Java에서 강제 캐스팅

public class Main {
    public static void main(String[] args) {
        Object obj = "Hello";
        
        // 강제 캐스팅 (실패할 가능성이 있음)
        String str = (String) obj;
        
        System.out.println(str.length());
    }
}

Java의 특징

(String) obj처럼 강제 캐스팅이 필요함.

타입이 맞지 않으면 ClassCastException 발생 가능.

 

✅ Kotlin에서 강제 캐스팅 (as)

fun main() {
    val obj: Any = "Hello"

    val str = obj as String
    println(str.length) // 5
}

Kotlin의 특징

as 키워드를 사용하여 강제 캐스팅 가능.

만약 잘못된 타입을 캐스팅하면 예외 발생 (ClassCastException).

 

📌 6. 안전한 캐스팅 (as?)

✅ Kotlin에서 안전한 캐스팅 (as?)

fun main() {
    val obj: Any = 123

    val str: String? = obj as? String  // 타입이 맞지 않으면 null 반환

    println(str) // null
}

Kotlin의 특징

as?를 사용하면 캐스팅이 실패할 경우 null을 반환하여 예외를 방지할 수 있음.

안전한 타입 변환을 보장함.

 

🚀 결론

Kotlin은 컬렉션 필터링, 리스트 변환, 타입 체크, 캐스팅, 널 체크 등이 Java보다 더 간결하고 안전하게 작성 가능함.

특히 람다식, 스마트 캐스팅, 엘비스 연산자가 Kotlin의 강점임.

 

 

 

 

출처 : ChatGPT