-
Notifications
You must be signed in to change notification settings - Fork 36
3장 next steps in scala
daclouds edited this page Apr 25, 2013
·
43 revisions
- new를 사용해서 오브젝트나 클래스 인스턴스를 생성한다.
- 클래스 인스턴스를 생성할 경우에 type parameter와 함께 생성 할 수 잇다.
val lang = new Array[String](3) // String type에 Array를 생성, 자바에 generic과 비슷
여기서 타입은Array[String](3)
이 아닌Array[String]
이다. - 자바와 달리 배열에 대한 접근은 [] 가 아닌 () 이다.
-
0 to 2
이라고 호출하면 실제로는(0).to(2)
가 실행된다. 이 문법(괄호와 . 의 생략)은 명시적인 리시버 가 있을때만 가능하다.println 10 // (X)
Console println 10 // (O)
- 하나 이상의 값을 감싸는 괄호를 변수에 적용했을때 해당 변수의 apply 메서드를 호출한다.
ex)greetStrings(i)가 greetStrings.apply(i)가 된다.
이와 유사하게 값을 할당할 때, greetStrings(0) = "hello" 는 greetStrings.update(0, "hello") 가 된다.
- 함수형 프로그래밍의 주요 아이디어중 하나는 사이드이펙트를 갖지 않는 것이다.
- 메서드는 계산후 항상 값을 리턴해야 한다.
- 덜 복잡해지고 재사용할 수 있다.
- 컴파일 타임에 타입 오류를 체크할 수 있다.
- 객체는 불변하게 만든다.
- Scala의 List는 항상 불변(immutable)하다.
-
:::
는 리스트를 이어붙힌다.(concat) -
::
는 cons라고 읽으며 리스트의 앞에 새로운 엘리먼트를 추가한 새로운 리스트를 리턴한다.- cons로 리스트를 생성하면 마지막에 Nil을 추가한다.(이유는 아래를 참고)-> Nil에 엘리먼트가 추가되는거 아닌가요?
- 콜론으로 끝나는 메서드는 right operand(우측 결합)이다.
-
1::two
는two.::(1)
이다.
-
- tuple은 유용한 컨테이너 객체이다.
- 튜플은 불변하다.
- 다른 종류의 타입을 함께 담을 수 있다.
- 현재 스칼라는 Tuple22까지 지원한다.
- 튜플의 엘리먼트에 접근할 때는 tuple._1과 같이 접근한다.
- tuple(n)은 항상 같은 타입을 반환해야 하기 때문에 이런 접근법을 사용한다.
- 튜플의 인덱스는 1부터 시작한다. 이는 다른 전통적 함수형 언어들(Haskell, SML 등)과 같은 접근법이다.
- mutable set은 += 메서드가 있고 immutable set은 없다.
- mutable set은 재할당될 필요가 없으므로 변수가 val이 될 수 있고 immutable set은 재할당이 되어야 하므로(+=를 사용해서) 반드시 변수가 var가 되어야 한다.
- immutable : obj = obj + "string"
- mutable : obj.+=("string")
- Map은 기본적으로 immutable이다.(no import)
- 펑셔널 프로그래밍을 배우면 더 나은 프로그래머가 될 수 있다.
- var가 있으면 imperative style이고 val만 있으면 functional style이라고 할 수 있다.
- 평셔널 코드가 더 깔끔하고 간결하다.
- 리턴타입이 Unit이면 사이드이펙트가 있다는 의미이다.
- 사이드 이펙트를 최소화 하면 테스트가 쉬운 이점도 있다.
- 스칼라 프로그래머의 자세
- val, immutable 객체, 사이드이펙트 없는 메서드 선호
- 그 다음 필요할 때 var, mutable 객체, 사이드이펙트있는 메서드 사용
- 절차형, 함수형 어느 한쪽이 나쁜게 아니다. 모두를 사용할 수 있다면 두가지 툴을 가지게 된 것이다.
- p87의 Why not append to lists?는 리스트라서 뒤에 붙히는게 느리다는 건가요?
- += 단방향 리스트 이기 때문에 리스트 끝에 새로운 원소를 더하려면 리스트 길이에 따른 O(N)연산이 되기 때문에 느립니다, cons 등과 같이 리스트 앞쪽에 붙이는 연산은 항상 O(1)의 속도를 가집니다.
- Set등의 경우 mutable과 immutable이 이름이 동일한데 혼동될 여지는 없나요?
- 추론되는 타입에 대해서도 import를 해야하나요?
- Listing 3.10의 컨벤션은 좀 혼란스럽지 않은가요?
아래 링크 전부 깨진듯 합니다.