가~~끔 메모를 했는데
앞으로는 꾸준히 하기 위해서 기록을 남기기로 결정했다.
지금까지 메모 한 것을 뭉탱이로 던지고,
앞으로는 조금 정리해서 쓰도록 할 예정!
------------------------------------------------
스카라는 이뮤터블(final). 병행성 문제가 나타나지 않는다!
스카라는 statically typed 의 랭기쥐 이다.
unit function = retrun 타입이 void
스칼라에 set, map은 immutable 과 mutable 이 있는데 immutable 이 기본이고 mutable을 사용하려면
scala.collection.mutable.HashMap
scala.collection.mutable.Map
등을 사용하자
import scala.collection.mutable.Map
val treasureMap = Map[Int, String]()
의 경우 factory method에 인자가 없으므로 타입을 [ ] 안에 명시해 줘야 하지만
val romanNumeral = Map(
1 >
"I", 2 >
"II", 3 >
"III", 4 >
"IV", 5 >
"V"
)
의 경우 factory method에 인자가 있으므로 스칼라 compiler 가 타입 추론을 하고 따라서 타입을 명시해줄 필요가 없다.
val형의 타입만 있는 경우가 바로 펑셔널 스타일이다!(즉 var가 없어야 한다 -> 모든게 final이다?!)
If you’re coming from an imperative background, such as Java, C++, or
C#, you may think of var as a regular variable and val as a special kind of
variable. On the other hand, if you’re coming from a functional background,
such as Haskell, OCaml, or Erlang, you might think of val as a regular variable
and var as akin to blasphemy.
하지만 스칼라는 val이나 var이나 모두 중요한 거라고 생각하니깐 이런 생각의 전환을 잘 하도록 한다.
스칼라의 side effect 는 해당 변수나 인자를 가지고 뚝딱하지 않으면 side effect 라고 부르는듯?
side effect :
def printArgs(args: Array[String]): Unit = {
args.foreach(println)
}
no side effect :
def formatArgs(args: Array[String]) = args.mkString("\n")
PIS 8.9 tail recursive
언뜻 이해가 되지 않아 이너넷 검색 후 결과를 남김
tail recursive는 외관상으로 차이가 이렇다
맨 마지막(결과?리턴?)값이 function() 이면 tail recursive
function() 외에 다른 연산?이 들어가면 그냥 재귀 ex) function()*2 등...
둘 중에 더 안정적이고 사용스러운?것은 tail recursive이다
이유는 그냥 재귀함수의 경우는 함수 호출시 스택에 push를 계속 하고 결과가 나와야 pop이 되어 스택에 새로운 함수가 계속 누적된다(스택오버 플로우가 날 수 있음)
하지만 tail recursive의 경우 부모 함수는 사라지고 자식함수를 호출하기 때문에 스택오버 플로우가 나지 않는다.
즉, 최초 부모 함수가 실행 된 후 재귀 구문을 만나면 함수는 사라지고 재귀함수가 부모가 된다
부모1 - 자식1
부모(자식1) - 자식2
부모(자식2) - 자식3 ...
최종 결과 값에 예외를 던지도록 해 보면 tail recursive인지 아닌지 알 수 있다.
댓글 없음:
댓글 쓰기