ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스칼라 문법편] CH07 컬렉션
    레거시/레거시-누구나 쉽게 스칼라+플레이 2019. 1. 29. 22:24
    반응형

    * 이 포스팅은 책 "누구나 쉽게 스칼라+플레이 - 고락윤 한빛 미디어"를 읽고 정리한 것입니다.

    CH07 컬렉션

    이번 장은 중요하기도 하고 아니기도 합니다. 책에서는 컬렉션(저는 배열조차 컬렉션으로 넣었습니다.)을 다음과 같이 소개하고 있습니다.

    "컬렉션은 스칼라에서 빈번하게 사용됩니다. 사실상 프로그램의 성능을 좌우하는 것도 이 컬렉션이 많은 부분을 차지하고 있지요. 프로그램의 전체적인 깔끔함과 설계의 아름다움을 유지하는 것도 컬렉션을 잘 다루어야 가능하기 때문입니다."


    컬렉션은 여러 데이터들을 모아 놓은 저장소입니다. 각 데이터마다, 적절한 자료구조가 있는데, 이것이 바로 컬렉션이며, 이들을 잘 알아야 데이터를 효율적으로 관리할 수 있습니다. 이제부터 컬렉션에 대해서 하나 하나 알아가보도록 하죠!

    01. Array


    Array 는 말 그대로 배열을 뜻합니다. 배열은 고정된 길이에 데이터를 저장하는 자료구조입니다. 다만, 스칼라에서는 파이썬과 같이 유연하게 데이터를 저장할 수 있습니다. 배열의 기본적인 사용법은 다음과 같습니다.

    val arr1 = new Array[Int](10) //10개의 Int형 배열 생성
    val arr2 = Array(1, 2, 3, 4, 5) //apply 적용, 5개 정수형 배열 생성


    두번째 배열과 같이 자료형을 묵시적으로 감출 수도 있습니다. 그리고 스칼라의 배열은 순회할 수 있습니다. 다음처럼 말이죠.

    for (e <- arr1)
        println(e)


    여기서 출력값은 모두 0입니다.(10개의 0이죠) 이를 통해서 배열이 생성되면 자바와 같이 기본적으로 0으로 초기화됨을 알 수 있습니다. 스칼라 배열의 또 다른 점은 각자 다른 타입조차 배열로 저장할 수 있다는 거죠.

    val arr = Array(1, "Hey", 2.5)
    for (e <- arr){
        println(e, e.getClass())
    }


    위 코드는 컴파일 오류 없이 잘 동작합니다. 출력값은 다음과 같습니다.


    (1, class java.lang.Integer)
    (Hey, class java.lang.String)
    (2.5, class java.lang.Double)
    


    02. List


    스칼라, 아니 많은 프로그래밍 언어에서 가장 자주 쓰이는 자료구조를 뽑으라면 아무래도 리스트일 확률이 가장 높습니다. 리스트는 기본적으로 슬라이싱, 동적 크기 변환등이 가능합니다. 배열보다 조금 더, 유연하지요. 리스트는 다음과 같이 만들 수 있습니다.

    val l = List(1, 2, 3, 4)
    val l2 = List("A", "B", "C")
    val l3: List[Int] = Nil // = List()와 같다
    val l4 = 1 :: 2 :: 3 :: Nil


    배열보다 더 다양한 방식으로 리스트를 만들 수 있습니다. 또한, ++ 혹은 ::: 연산자를 이용해 리스트를 붙이는 것도 가능합니다. 다음은 리스트의 주요 메서드들입니다.

    메소드반환형기능
    ++, :::List[T]2개의 리스트를 하나로 붙여줍니다.
    apply(Int)T리스트 i번째 요소를 반환합니다.
    reverseList[T]현재 리스트를 거꾸로 뒤집습니다.
    maxT리스트 요소 중 가장 큰 요소를 반환합니다.
    minT리스트 요소 중 가장 작은 요소를 반환합니다.
    sumT리스트 모든 요소의 합을 반환합니다.
    mkString(String)String구분자 문자열을 받아 리스트 내 모든 요소를 구분자로 구분한 문자열을 반환합니다.
    exists(p: T => Boolean)Boolean조건을 충족하는 요소가 있는지 여부를 반환합니다.
    contains(T)Boolaen해당 요소가 존재하는지 여부를 반환합니다.
    isEmptyBoolean리스트가 비었는지 여부를 반환합니다.
    distinctList[T]리스트 내 중복 요소를 제거한 리스트를 반환합니다.


    03. Map


    맵은 자바의 맵이랑 동일합니다. key, value 쌍으로 데이터를 저장하는 자료구조입니다. 보통 다음의 방식으로 초기화 할 수 있습니다.

    val m = Map()
    val m2[Char, Int] = Map()
    val m3 = Map(
        1 -> "A",
        2 -> "B",..
    )


    Map의 주요 메소드는 다음과 같습니다.

    메소드반환형기능
    + (K -> V)Map해당 요소가 추가된 맵을 반환합니다.
    ++ MapMap앞의 맵과 뒤의 맵을 합칩니다.
    - (K)Map해당 키를 제거한 맵을 반환합니다.
    max(K, V)key가 가장 큰 순서 쌍을 반환합니다.
    min(K, V)key가 가장 작은 순서 쌍을 반환합니다.
    get(K)Option해당 키를 가진 요소를 Option 객체에 넣고 반환합니다. 없다면 None
    emptyUnit맵을 초기화합니다.
    exists( p: (K, V) => Boolean )Boolean해당 조건의 순서 쌍이 있는지 여부
    count( p: (K, V) => Boolean )Int해당 조건의 순서 쌍이 몇 개 있는지 반환
    contains(K)Boolean해당 키 존재 여부 반환
    last(K, V)제일 마지막 순서쌍을 반환합니다.
    sizeInt맵의 크기를 반환합닏.
    toListList[(K,V)]맵을 리스트로 변환합니다.
    keySetSetKey의 Set을 반환합니다.
    valuesIterable맵에 저장되어 있는 Values 이터레이블 객체를 반환합니다.
    equals(Map)Boolean두 맵이 동일 요소를 가지고 있는지 여부를 반환합니다.
    isEmptyBoolean맵이 비었는지 여부를 반환합니다.


    04. Set


    Set은 중복되지 않은 요소들을 저장할 때 쓰입니다. 초기화 하는 방식도 여타 컬렉션과 비슷합니다.

    val s: Set[String] = Set()
    val s2 = Set("사과", "포도", "사과") // 사과, 포도


    Set의 주요 메소드는 다음과 같습니다.


    메소드반환형기능
    + (es T*)Set[T]해당 요소들을 추가한 Set 반환합니다.
    - (es T*)Set[T]해당 요소들을 제거한 Set 반환합니다.
    apply(T)Boolean해당 값이 있는지 여부를 반환합니다.
    diff(t: GenSet[T])Set[T]대상 집합에서 차집합인 Set 반환됩니다. A-B
    (t: GenSet[T])Set[T]


    05. Tuple


    튜플은 단순한 데이터 묶음입니다. 여러 데이터를 하나의 묶음으로 처리하고 싶을 때 사용합니다.

    val age = 5
    val name = "G"
    
    val tuple = (name, age)


    주요 메소드는 다음과 같습니다.

    메소드반환형기능
    _1E1튜플의 첫 번째 값을 반환합니다.
    _2E2튜플의 두 번째 값을 반환합니다.
    swap(E2, E1)튜플의 순서쌍을 교환한 튜플을 반환합니다.


    06. Option


    Option 객체는 널여부를 판단하는데 주로 쓰이는 컬렉션입니다. 값을 가지고 있는 Some 아무 값이 없는 None 둘 중 하나를 갖게 됩니다. 옵션 컬렉션이 유용하게 쓰이는 경우는 앞 장에서 보았듯 패턴 매칭에서 유용하게 쓰일 수 있습니다. 또한 NPE 널 포인터 예외를 방지해주는 장점도 가지고 있습니다. Option 의 주요 메소드는 다음과 같습니다.

    메소드반환형기능
    getTSome 으로 래핑된 값을 벗겨서 반환합니다.
    getOrElseT or B값을 가져오는데 없다면 기본적으로 설정한 값을 가져옵니다.


    07. Sequence


    시퀀스는 리스트와 유사하지만, 리스트와 달리 순서 정보를 지니고 있습니다. 1 to 10, 1 until 10 등의 대표적인 Sequence 의 예입니다. Sequence 의 주요 메소드는 다음과 같습니다.

    메소드반환형기능
    apply(Int)T해당 위치의 요소를 반환합니다.
    indexWhereSet[T]요소들을 삭제하여, 새로운 집합을 만들고 반환합니다.
    apply(e: T)(p: (T) => Boolean, Int)Intfrom이라는 인덱스부터 해당 조건을 만족하는 인덱스를 자겨옵니다. from은 생략 가능합니다.
    startWithBt: GenSeq[B]Boolean해당 시퀀스와 인수로 넘긴 시퀀스의 앞 부분이 일치 여부를 반환합니다.
    endtWithBt: GenSeq[B]Boolean해당 시퀀스와 인수로 넘긴 시퀀스의 뒷 부분이 일치 여부를 반환합니다.
    indexOf(T)Int해당 요소와 일치하는 요소의 인덱스를 반환합니다.
    lastIndexOf(T)Int해당 요소와 일치하는 요소가 여러개일 경우 마지막 인덱스를 반환합니다.


    08. Iterator


    이터레이터는 컬렉션에서 데이터를 꺼내와서 차례대로 무엇인가 작업을 할 때 사용하는 클래스입니다. next, hasNext 등의 대표적인 예이지요. 보통 이렇게 쓰면 됩니다.

    val l = List(1, 2, 3)
    val it = l.iterator
    
    while (i.hasNest)
        println(i.next)


    이터레이터는 리스트 뿐 아니라, 맵, 셋등에 사용될 수 있습니다. 이터레이터의 주요 메소드는 다음과 같습니다.

    메소드반환형기능
    hasNextBoolean이터레이터의 다음 값이 존재 여부를 반환합니다.
    nextT다음 값을 반환합니다.
    exists(p: T => Boolean )Boolean해당 조건을 충족하는 요소가 존재하는지 여부를 반환합니다.
    count(p: T => Boolean)Int해당 조건을 충족하는 요소가 몇 개 있는지 반환합니다.
    lengthInt이터레이터 요소의 개수를 반환합니다.


    이렇게 해서 7장 컬렉션도 끝났습니다. 컬렉션은 워낙 개발자의 사용 빈도수에 따라서 이해의 깊이가 다르기 때문에 이 정도로 하고 넘어가겠습니다. 어떠신가요 ㅎㅎ 저와 함께 계속 스칼라를 공부하고 싶다면, 다음 장 함수 컴비네이터에서 만나도록 합시다!

Designed by Tistory.