국비교육(22-23)

73일차(1)/Android App(22) : Kotlin forEach, filter, map / set, get 함수

서리/Seori 2023. 1. 19. 13:19

 

- 새 코틀린 파일 생성

 

Step10_CollectionFunction

package com.example.kotlin_test

val nums= listOf<Int>(1,2,3,4,5,6,7,8,9,10)

fun main(){
    //목록에 저장된 모든 아이템을 순회하면서 어떤 작업하기
    nums.forEach (fun(item){
        println(item)
    })
    println("------------------")
    nums.forEach ({
        println(it)
    })
    println("------------------")
    nums.forEach { println(it) }

    //목록에 저장된 모든 아이템을 순회하면서 조건에 맞는 아이템만 남긴 새로운 목록 얻어내기
    val result=nums.filter{
        it > 5 //이 조건이 true인 아이템만 남긴 새로운 목록이 만들어진다.
    }
    println(result)

    //목록에 저장된 모든 아이템을 순회하면서 어떤 조작을 가한 새로운 목록 얻어내기
    val result2=nums.map {
        it * 2
    }
    println(result2)

}

 

- 배열의 데이터를 쭉 하나하나 참조해서 어떤 작업을 할 때 제공되는 함수들.

 

- forEach() : 배열 단순참조하기

 

- 함수를 호출하면서 인자로 함수를 전달하기

 

- 위 3개는 모두 같은 것이다. 아래가 요약해서 쓸 수 있는 최종적인 형태이다!

it을 활용해서 아이템을 모두 참조하기. 순서대로 출력된다.

 

val result=nums.filter{
    it > 5 //이 조건이 true인 아이템만 남긴 새로운 목록이 만들어진다.
}

 

- filter() : 조건에 맞는 아이템만 남겨서 새로운 배열 얻어내기

- javascript의 filter와 비슷하다.

 

- 5보다 큰 수만 남긴 새로운 배열이 나타난다.

 

val result2=nums.map {
    it * 2
}

- map() :모든 아이템에 () 안의 함수를 적용한 새로운 목록 얻어내기

- 각 아이템에 2를 곱한 값이 들어있는 새로운 배열이 나타난다.

 

- foreach, filter, map 잘 알아두기!

 


 

Step10_CollectionFunction2

package com.example.kotlin_test

val nums2= listOf<Int>(1,2,3,4,5,6,7,8,9,10)

//친구의 나이와 이름을 저장하는 데이터 클래스
data class Friend(val age:Int, val name:String)

fun main(){
    //연속으로 함수를 호출할 수 있다.
    val result=nums2.filter { it>5 }.map { it*2 }
    println(result)

    //nums2 목록에서 짝수만 골라서 제곱을 한 결과 목록을 얻어내 보세요.
    val result2=nums2.filter { it%2 == 0 }.map { it*it }
    println(result2)

    val f1=Friend(30,"바나나")
    val f2=Friend(42,"딸기")
    val f3=Friend(38,"복숭아")
    val f4=Friend(25,"사과")
    val f5=Friend(29, "오렌지")

    val friends= listOf(f1,f2,f3,f4,f5)

    //나이가 30 이상인 친구의 이름에 "님"을 붙인 새로운 목록
    val result3=friends.filter { it.age>=30 }.map { it.name+"님" }
    println(result3)
}

 

val result=nums2.filter { it>5 }.map { it*2 }

- 5보다 큰 수만 남기고 map 함수 적용하기

- 이렇게 점을 찍어서 연속으로 함수 호출이 가능하다!

 

- 생성자를 이렇게 만들면 자동으로 필드가 생겨나면서 전달된 숫자와 문자가 자동으로 필드에 저장된다.

 

val result3=friends.filter { it.age>=30 }.map { it.name+"님" }

- 나이가 30 이상인 친구의 이름 뒤에 "님" 을 붙인 새로운 목록 얻어내기

 

- it 이라는 것은 나이가 아니고 friend 객체이다. friend 객체에 들어있는 age를 참조해야 하므로 it.age 라고 작성!

 


 

Step11_SetterGetter

package com.example.kotlin_test

class StarBucks{

    var location:String?=null
        set(value) {
            println("location 의 setter 메소드 호출됨")
            field=value+" 지점"
        }
        get() {
            if (field==null){
                return "지점명 없음"
            }else{
                return field
            }
        }
}

fun main(){
    val s1=StarBucks()
    s1.location="강남" //값을 넣어줄때는 setter 호출

    val s2=StarBucks()
    s2.location="역삼"

    val s3=StarBucks()

    println(s1.location) //값을 참조할때는 getter 호출
    println(s2.location)
    println(s3.location)
}

 

- 가상의 스타벅스 함수 생성. 스타벅스의 위치는 문자열이고, null을 허용하겠다는 뜻.

 

- 생성할때는 null이었는데, 생성해서 s1, s2변수에 넣으면서 값을 넣어준것이다.

- 그런데 추가적으로 뭔가 조작해서 집어넣고 싶을 수 있다.

- 예를 들어 location 값 뒤에 "+지점" 이 붙었으면 좋겠다면?

 

- set 이라는 함수가 있다.

- 아래에서 생성하면서 담은 value 값이 여기의 set(value)에 전달된다.

 

- 저 field는 location을 말한다.

 

- 대입한 값이 value로 들어가고, 이 value 에 가공을 해서 field에 집어넣는 형태이다.

 

 

get() {
    if (field==null){
        return "지점명 없음"
    }else{
        return field
    }
}

- get() : 값을 가지고 간다.

- 필드가 아닌 다른 값을 리턴할 수도 있다.

 

- 참조할때는 getter 메소드를 호출한다.

 

 

- 필드를 선언하고 필요에 따라 setter, getter 역할의 메소드를 만들어서 호출해줄 수 있다.

- set 안의 동작, get 안의 동작을 마음대로 정할 수 있다.

 

- 콘솔창에 아래와 같이 출력된다. 값을 넣어주지 않았을 경우 field가 아닌 다른 값이 출력됨!

 

 

- 어떤 값을 가져갈때 다른 동작을 해주고 싶다면(수행할 코드가 있다면)

  setter getter 메소드 안에서 작업하면 된다.

 

- 이런 set, get을 지워도 에러가 나는 건 아니다. location에 값을 그냥 넣고싶으면 필요없다.

- 필드에 어떤 작업을 하고싶을 때 사용한다.

 

- 이 안에서는 field 라는 예약어를 사용한다.

- 위 코드에서 field = this.location 이라고 보면 된다.