본문 바로가기

Programming/Scala26

[13강] scala 계층 구조 스칼라의 계층 구조는 아래의 트리 구조를 따른다. 최상위 슈퍼 클래스는 scala.Any이다. 모든 클래스가 Any를 상속하기 때문에 객체 간의 ==, !=, equals 등의 비교가 가능하다. 또한 Any 클래스에서는 == , !=는 final로 설정이 되어 있기 때문에 override가 불가능 하다. Any는 서브 클래스를 두 개 가지고 있는데 바로 AnyVal과 AnyRef이다. AnyVal의 경우는 Scala에 존재하는 값 클래스의 부모 클래스이며, Byte, Short, Char, Int, Float, Double, Boolean, Unit 이렇게 9 가지 클래스가 값 클래스에 해당한다.값 클래스는 내부적으로 final 클래스로 선언이 되었기 때문에 new 연산자로 인스턴스화가 불가능 하다.즉 .. 2018. 4. 3.
[SPARK] RDD error 체크하기 아래 형태의 코드를 스칼라를 이용해서 구현했다. for ( i println("Exception " + e) }} 위의 경우에 해당하는 폴더가 없거나 파일이 없는 경우, textFile.count()를 하게 되면 exception 에러가 발생하고 종료하게 된다.'아,,,, exception이 나더라도 그 다음 번 for문을 돌리고 싶은데 어떻게 해야 하지??' scala에 대해 온갖 욕을 해대며 구글링 시작... Try라는 것을 발견했다. 사용법은 아래와 같다. import scala.util.Try val result = Try(textFile.count()) 이렇게 Try로 감싸주게 되면 exception이 발생하지 않고 해당 성공, 실패 여부를 값으로 받아오게 된다.받아온 값은 아래 함수를 통해 성.. 2018. 3. 29.
Java.util.map을 scala Map으로 변환하기 Scala를 쓸 때 항상 뻘짓을 하게 되는 부분이 형변환인 것 같다.python을 쓸때는 그냥 다 통용되는 느낌이었는데, scala에서는 데이터 형이 생각보다 엄청 중요하다는 걸 쓰면서 깨닫게 된다.특히나 java에서 통용되는 Object 객체를 scala Map 등으로 바꿔주는게 생각보다 정말 까다롭고 힘들었다. 나 역시 java library를 통해 java.util.Map[String, Object] 이 형태로 값을 리턴 받았는데, value에 해당하는 Object를 처리하기 너무 까다로워서 java 코드 자체를 java.util.Map[String, Map[String, String]]으로 다시 변경해서 리턴을 받았다. 지금부터는 자바 Map을 scala Map으로 형변환 하는 방법을 서술할 것이.. 2018. 3. 27.
[5강] 클래스와 객체 CLASS, FIELD, METHOD scala에서의 class, field, method는 JAVA와 상당히 유사하다. 일단 scala에서는 아래와 같이 class를 정의 할 수가 있다. class Test { var variable = 0 } 해당 클래스를 객체로 만들고 싶다면 아래와 같이 new로 선언해 주면 된다. val test1 = new Test() 또한 Test class 내의 변수 무결성을 보장해 주기 위해 private로 선언해 줄 수도 있다. class Test { private var variable = 0 } scala에서는 기본적으로 변수 선언을 하게 되면 public이며, 따로 public 키워드를 사용하고 있지는 않다. 이제 변수를 파라미터로 받아서 variable에 더해주는.. 2018. 3. 3.
IntelliJ에서 scala 사용해보기 우선 mac 기준으로 IntelliJ와 JDK는 깔려 있다는 가정하에 IntelliJ에서 IntelliJ IDEA > Plugins에서 scala를 검색해보자. 위의 그림과 같이 SBT와 Scala가 검색이 되는데 이 두 개의 플러그인을 모두 설치하자. 설치한 후에는 IntelliJ 리스타트~ 하기 전에 scala sdk부터 설치를 하자. 아래의 링크로 들어가서 scala sdk를 설치하자. https://www.scala-lang.org/download/ 나 같은 경우에는 Mac OS 버전인 scala-2.12.4tgz을 다운 받았다. 적절한 폴더에 압축을 풀어주자. (나 같은 경우에는 JAVA JDK와 비슷한 위치에 압축을 풀음.) 기왕이면 SCALA_HOME과 PATH도 ~./bash_profile.. 2018. 2. 23.
Tail Recursion - Coursera 강의 ppt 번역 Review: Evaluating a Function Application f(e1, ..., en) 이라는 함수가 있다고 가정할 때, expression e1,...,en 의 결과 값은 v1,...,vn이 되며, 함수 f 안에 있는 e1,...,en을 v1,...,vn으로 교체해도 함수 f의 동작이 무방할 때 이를 substitution model이라고 한다.아래 코드는 위의 글을 프로그램적으로 다시 쓴 것이다. def f(x1,...,xn) = B; ...f(v1,...,vn)def f(x1,...,xn) = B; ... [v1/x1,..., vn/xn]B 여기서 [v1/x1,...,vn/xn]B이 의미하는 것은 expression B에 있는 모든 vi는 xi에 의해 교체될 수 있음을 의미하고, [v.. 2016. 1. 7.
Blocks and Lexical Scope - Coursera 강의 ppt 번역 Nested functions 많은 작은 함수 조각으로 분리해서 프로그래밍 하는 것은 좋은 functional programming style이다.그러나 sqrtIter, improve, isGoodEnough 와 같은 함수들은 sqrt의 구현 부분이지 도움말 같은 요소는 아니다. 게다가 사용자 역시 이러한 함수에 직접적으로 접근하지는 않는다.우리는 sqrt 내에 이러한 함수들을 집어넣음으로써 "name-space-pollution"을 피할 것이다. The sqrt Function, Take 2 def sqrt(x: Double) = { def sqrtIter(guess: Double, x: Double): Double = if (isGoodEnough(guess, x)) guess else sqrtIt.. 2015. 12. 29.
Square roots with Newton's method - Coursera ppt 번역 Task 이번 세션에서는 아래의 함수를 정의할 것이다. def sqrt(x: Double): Double = ... Newton's method를 이용하여 연속적인 호출로 값을 추산할 것이다. Method sqrt(x)를 계산하기 위해서는 - 초기 값 y와 함께 시작이 되어야 한다.( 초기 y 값을 1이라고 정의하자.)- y의 평균 값과 x/y 값을 반복적으로 계산함으로써 값의 추정을 향상시킨다. Example: x가 2일때, 추정값 몫 평균1 2/1 = 2 1.5 ( (1 + 2) / 2)1.5 2/1.5 = 1.333 1.4167 ((1.5 + 1.333) / 2)1.4167 2/1.4167 = 1.4118 1.4142 ((1.4167 + 1.4118)/2)1.4142 ... ... Implement.. 2015. 12. 28.
Conditionals and Value Definitions - Coursera 강의 ppt 번역 Conditional Expressions 두 가지의 대안 중 하나를 선택하기 위해서 scala에서는 if-else라는 conditional expression을 사용한다.자바의 if-else와 유사하게 보이지만, statements가 아닌 expression의 용도로 사용한다. statements와 expression의 차이- statements는 컴퓨터에게 어떤 동작이나 지시를 내리기 위한 명령문 형태인 반면에 expression은 어떤 값을 산출해내기 위한 함수나 연산자의 조합을 말한다. statements에서는 side effect가 발생하는 반면 expression은 side effect를 발생시키지 않는다고 한다. 자세히 어떤 차이인지 잘 모르겠다. ex)def abs(x: Int) = if .. 2015. 12. 25.