관리 메뉴

HAMA 블로그

스칼라 강좌 (6) - Map 본문

Scala

스칼라 강좌 (6) - Map

[하마] 이승현 (wowlsh93@gmail.com) 2016. 6. 20. 21:04

Map

 
특성
 

* Map 은 변경 가능한 것 (mutable.Map) 과 변경 불가능한 것 (immutable.Map) 모두를 제공합니다.

import scala.collection.mutable.Map

  예를들어 put 이라든지 remove 메소드는 immutable.Map 에서는 사용 불가.

* Map 을 위한 기반 트레이트가 있고 이를 상속한 변경 가능 집합, 변경 불가능 집합을 위한 2가지 트레이트가 있다. ( Set 과 비슷) 


 
 
생성 
 
 

val m = Map[Int,String]()   // 다른것들과 마찬가지로 팩토리 메소드를 이용해 만들 수 있다.

 
val m2 = Map (1 -> "one" , 2-> "two") 이렇게 초기화 할 수 있고
val m3 = Map ( (1,"one") , (2,"two") ) 이렇게도 할 수 있다. 
 
아래 처럼  List 를 이용해서도 다양하게 가능해요~
// 튜플로 이루어진 List 를 이용 
val myList = List("England" -> "London", "Germany" -> "Berlin") 
// List 에 요소들이 Tuple 로  
val myMap = myList.groupBy(e => e._1).map(e => (e._1, e._2(0)._2)) 
val betterConversion = Map(myList:_*) 
val scala28Map = myList.toMap  // scala 2.8 version 에선 이렇게도 가능   
// map 메소드를 이용  
val myList = List("England" , "London", "Germany" ,  "Berlin") 
val map: Map[String,Int] = myList.map{ s => (s,s.length) }.toMap

 

추가

val m = mutable.Map[Int,String]()

m(0) = "zero"  //기존에 0 의  key 가 있을 경우 대체됩니다.  ( mutable.Map  일 경우만 ) 

아래 처럼도 가능 ( mutable.Map  일 경우만 ) 
m += ( 1 -> "one")
m += ( 2 -> "two")
+= 메소드를 이용하여 맵에 값을 담습니다.
* 위의 m 을 var 로 선언하면 immutable.Map 에서도 가능합니다.
 자신을 변경하는게 아니라 
변경된 맵을 새로운 m 에 재 할당하는 방식이 되니까요.

immutable 맵일 경우는
val m2 = m + (3 -> "three") 이런식으로 새로 생성하며 넣습니다.
 
1->"one" 
이것은  1 은 key 이며 "one" 은 value 입니다.
1.->("one")  이것의 축약형 입니다. 
 
스칼라에서는 -> 메소드를 호출하면 해당객체를 key 로하고 인자를 value 로 하는 
"튜플" 을 만듭니다. 
 

put mutable.Map  일 경우만 ) 

val m2 = m.put(2, "three") 
m에는 새로운 value 가 담기게 되고, m2 에는 기존에 key 가 2 였던 value 가 담기게 됩니다.  
 
m.getOrElseUpdate(2, "three") 

키 2 가 이미 있다면 그에 해당하는 값을 가져오고 , 없으면 "three" 를 추가.

 
 
가져오기
 
val m = Map[Int,String]()
m += ( 1 -> "one")
m += ( 2 -> "two")
 
println(m(1)) //  "one" 출력,  key 가 없을 경우 예외 발생 ~!!
 
 
get
 
val m = Map (1 -> "one" , 2-> "two")
m.get(1) 
 
key 가 1 인 value 를 옵션에 넣어 반환합니다. 없으면 None 을 반환  
 
m.get(3) // None
m(3) // 예외 !!  
 
 
 
제거 
 
m -= 1    // m 에서 key 가 1 인것을 제거 
 
remove  ( mutable.Map  일 경우만 ) 
val m2 = m.remove(1)  // m 에서 1을 key 로 가진 요소를 제거하고 그 값을 리턴
 
clear      mutable.Map  일 경우만 ) 
m.clear()  // m 의 모든 요소를 제거
 
retain     mutable.Map  일 경우만 ) 

m.retain((k,v) => k < 2)  // key 가 2 보다 작은 요소들만 남겨두고 나머지 제거

 

 

 
변환

 

스스로는 변화되지 않는데 , 변환된것을 리턴해준다.

filterKeys        ( immutable.Map  도 가능)

val m2 = m.filterKeys(_ > 1)    // key  가 1 보다 큰 요소들을 가지고  m2 를 만듬. 

 

mapValues     ( immutable.Map  도 가능)

val m2  = m.mapValues(_ * 5)  // 모든 value 에 * 5 를 한 요소를 가지고 m2 를 만듬 

 

 

변경 

 

transform   ( mutable.Map  일 경우만 ) 

m.transform( (k,v) => v * 5 )  // 모든 value 에 * 5 를 한 요소를 가지고 m2 를 만듬 

위의 mapValues 와 다른점은 transform 은 스스로도 변경된다는 점이다. 

Map -> mutable.Map 으로 변경 

 

val myImmutableMap = collection.immutable.Map(1->"one",2->"two") val myMutableMap = collection.mutable.Map() ++ myImmutableMap

 

Comments