본문 바로가기

프로그래밍/scala

스칼라 두 번째 걸음

스칼라 배열 초기화

val strings = new Array[String](3)

strings(0) = "zero" // 배열의 크기가 immutable 이지, 값은 mutable 이다

strings(1) = "one"

strings(2) = "two"

strings.foreach(println)


좀 더 간단한 스칼라 배열의 초기화 - 동반객체(companion object)의 factory 함수를 통해 배열을 생성하는 방법

val strings = Array("zero", "one", "two")

strings.foreach(println)

 * 여기서 동반객체(companion object)란 class 의 이름과 object의 이름이 동일한 경우를 말하며, 이때 싱글톤 객체의 클래스를 동반 클래스 (companion class)라고 한다. 


스칼라의 배열 접근은 자바와 같이 각괄호[]가 아니라 괄호()이며, 내부적으로는 apply 라는 함수를 호출한다

print(strings(0))

print(strings.apply(0))


스칼라의 모든 연산자 또한 함수호출이다

1 + 2

(1).+(2)


스칼라의 배열은 변경 가능하지만, 리스트는 변경불가항상 새로운 리스트를 생성하게 된다.

val oneTwoThree = List(1, 2, 3)

val fourFive = List(4, 5)

val oneToFive = oneTwoThree ::: fourFive // ::: 두 리스트를 이어붙이는 연산자

val zeroToFive = 0 :: oneToFive // :: 새 원소를 기존 리스트의 맨 앞에 추가한 새 리스트를 반환. 단, : 으로 끝나는 연산자는 오른쪽 피연산자의 함수를 호출한다.

val oneTwoThreeFour = 1 :: 2 :: 3 :: 4 :: Nil // Nil 은 빈 리스트를 의미함

왜 리스트 뒤에 추가하지 않을까? 리스트 뒤에 추가하면 리스트의 길이에 비례한 시간이 걸리지만, 앞에 넣는 것은 상수시간이 걸리기 때문.


스칼라의 튜플은 다른 타입의 데이터를 담을 수 있는 유용한 컨테이너 객체이지만, 현재 22 까지 담을 수 있는 Tuple1 ~ Tuple22 까지 22개의 클래스만 존재한다.

val tuple1 = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 ) // 22개가 최대이며, 23개부터는 오류가 발생한다.

 * 배열처럼 (num)으로 접근이 안 되는 것은 apply 메소드는 항상 동일한 타입의 객체를 반환하기 때문이고, Tuple 객체는 _1 과 같이 임의의 타입을 반환할 수 있다.

 * 또한 인덱스가 0이 아니라 1부터 시작한다.


trait 는 자바 인터페이스와 비슷한 개념인데, 자바에서는 인터페이스를 구현하지만, 스칼라에서는 트레이트를 확장extend 하거나, 혼합mix-in 한다.

같은 이름이 더라도 어떤 네임스페이스에서 import 하는 지에 따라서 mutable or immutable 컨테이너를 선택할 수 있다. (기본은 immutable 컨테이너다)

var jetSet = Set("Boeing", "Airbus") // import scala.collection.mutable.Set 을 하지 않으면 Immutable Set 객체가 생성된다.

jetSet += "Lear" // 원소를 추가한 새로운 집합을 반환한다

println(jetSet.contains("Cessna")


맵의 초기화, 사용하기

import scala.collection.mutable.Map

var treasureMap = Map[Int, String]()

treasureMap += (1 -> "One")

treasureMap += (2 -> "Two")

treasureMap += (3 -> "Three")

println(tresureMap(2)) // 이 경우에 튜플과 같이 2번째 맵항목을 반환한다



'프로그래밍 > scala' 카테고리의 다른 글

스칼라의 기본 타입과 연산  (0) 2016.01.16
스칼라의 클래스와 객체  (0) 2016.01.16
스칼라 첫걸음  (0) 2016.01.07