본문 바로가기
코틀린 문법

20. 컬렉션함수(2)

by 농농씨 2023. 6. 3.

참조: 유튜브 디모의 코틀린

코드테스트사이트:play.kotlinlang.org

단축키(맥북):

맥북 스크린샷 바로 클립보드에 붙여넣기

-control+command+shift+3 or 4(3은 전체화면, 4는 마우스로 지정한 영역, 4일때 스페이스바 누르면 창캡처가능)

화면에 분할해놓은 창끼리 이동

-command+'

한 창에서 탭끼리 이동

-command+shift+{/}

 

 

//나머지 컬렉션 함수
//좀 더 복잡한 기능들
//<associatdBy
//아이템에서 key를 추출하여 map으로 변환하는 함수
//예를 들어 이름과 태어난 년도가 들어간 person객체들이 있고
// ex. 시아/2003, 유나/2001, 하은/2003
// 이를 리스트에 넣어뒀을때
// 이름을 키로 하고 객체를 value로 하는 map으로 변경하려면
//ex. collecton.associateBy{it.name}
// //associateBy의 중괄호 안에 key로 사용할 속성(여기선 이름)을
// 넣어주면 자동으로 키와 값이 짝지어진 map으로 변환하여준다 
//<groupBy
//key가 같은 아이템끼리 배열로 묶어 map으로 만드는 함수
//특정한 값을 키로 지정하여 해당값을 가진 객체끼리 묶은 배열을 value로 하는
// map을 만들어줌
//ex. 2001 키에는 [유나,2001] 배열
//    2003 키에는 [시아,2001][하은,2001] 배열
//<partition
//아이템에 조건을 걸어 두개의 컬렉션으로 나누어줌
//조건에 따른 true/false 두개로 나뉨
//ex. collection.partition{it.birthYear>2002}
// list([시아,2003],[하은,2003]),list([유나,2001])
// 이 두 컬렉션은 두 객체(컬렉션을 개체로 간주)를 담을 수 있는 
// Pair라는 클래스객체로 반환되므로
// 각각의 컬렉션을 first,second로 참조하여 사용하면 됨
// 또는 pair를 직접 받아줄수 있도록 
//   val(over2002,under2002)=
//   collection.partition{it.birthYear>2002}
// 이런식으로 변수 이름을 괄호 안에 두개 선언해주면
// 각 컬렉션을 지정한 변수 이름으로 받을 수 있다
//   val over2002=([시아,2003],[하은,2003])
//   val under2002=([유나,2001])


더보기

<실행결과 텍스트>

{1992=Person(name=유나, birthYear=1992), 1996=Person(name=조이, birthYear=1996), 1999=Person(name=츄, birthYear=1999), 2003=Person(name=유나, birthYear=2003)}

{유나=[Person(name=유나, birthYear=1992), Person(name=유나, birthYear=2003)], 조이=[Person(name=조이, birthYear=1996)], 츄=[Person(name=츄, birthYear=1999)]}

[Person(name=유나, birthYear=1992), Person(name=조이, birthYear=1996)]

[Person(name=, birthYear=1999), Person(name=유나, birthYear=2003)]

fun main(){
    
    data class Person(val name:String,val birthYear:Int)
    //data class를 만들고 이름과 태어난 년도 받음
    
    val personList=listOf(Person("유나",1992),
                          Person("조이",1996),
                          Person("츄",1999),
                          Person("유나",2003))
    //리스트에 네명의 Person객체 넣음
    
    println(personList.associateBy{it.birthYear})
    //associateBy로 person객체의 년도를 기준으로 map만들어 출력
    println(personList.groupBy{it.name})
    //groupBy로 person객체의 이름을 기준으로 묶어 map만들어 출력
    
    val(over98,under98)
     =personList.partition{it.birthYear<1998}
    println(over98)
    println(under98)
    //partition에서 person 객체의 년도가 1998보다 큰지 비교하여 
    //리스트 나눔
    
}

//<flatMap
//아이템마다 만들어진 컬렉션을 합쳐서 반환하는 함수
//중괄호 안에서 아이템마다 새로운 컬렉션을 생성하면
//이를 합쳐서 하나의 컬렉션으로 반환해줌
//ex. 2와 3 있는 컬렉션 있다고 가정
// collection.flatMap{
//   listOf(it*3,it+3)
// }
// 6,9 컬렉션과 5,6 컬렉션 합쳐서
// 6,5,9,6 컬렉션으로 반환
//<getOfElse
//인덱스 위치에 아이템이 있으면 아이템을 반환하고
//아닌 경우 지정한 기본값을 반환하는 함수
//ex. collection.getOrElse(8){50}
// //index 8 에 값 있으면 아이템반환, 없으면 중괄호 안의 기본값인 50반환
//<zip
//컬렉션 두 개의 아이템을 1:1로 매칭하여 새 컬렉션을 만들어줌
//1대1로 pair 클래스의 객체로 만들어 list에 넣어 반환해줌
//ex. a,b,c,d 컬렉션
//    1,2,3,4 컬렉션
//    하나의 리스트에 A,1 pair class
//       B,2 pair class
//       C,3 pair class
//       D,4 pair class 객체들이 있음
//   이때, 결과 리스트의 아이템의 개수는 더 작은 컬렉션 따라감 


fun main(){
    
    val numbers=listOf(-3,7,2,-10,1)
    //정수값 여러개 가진 numbers리스트 만듦
    
    println(numbers.flatMap{listOf(it*10,it+10)})
    //리스트에 flatMap 적용하여 개별아이템에 곱하기10 더하기 10한 리스트를
    //새로 만들어 출력
    
    println(numbers.getOrElse(1){50})
    println(numbers.getOrElse(10){50})
    //getOrElse함수 사용하여 index 1번 아이템 없는 경우 50,
    //inde 10번 아이템 없는 경우에도 50반환하도록 각각 출력
    
    val names=listOf("A","B","C","D")
    //abcd 들어간 list만듦
    
    println(names zip numbers)
    //names와 numbers를 zip하여 출력
    //이때 numbers의 숫자 1은 짝이 맞지 않으므로 제외됨
    
}



//컬렉션 함수는 데이터의 조작을 더 수월하게 만들 수 있는 다양한 기능을 갖고있으므로

//컬렉션에 담긴 데이터를 다룰 때 이용하면 좋다

'코틀린 문법' 카테고리의 다른 글

22. 비트연산  (0) 2023.06.04
21. 변수의 다양한 사용방법  (0) 2023.06.03
19. 컬렉션함수(1)  (0) 2023.06.03
18. Set과 Map  (0) 2023.05.31
17. Data Class와 Enum Class  (1) 2023.05.14