일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- hadoop
- Spring XD
- Spring Boot
- Angular2
- elastic search
- nginx
- Domain Driven Design
- Linux
- SBT
- Storm
- 엘라스틱서치
- 제주
- DDD
- Spring
- elasticsearch
- 스프링 배치
- spark
- Gradle
- scala
- Hbase
- docker
- design pattern
- Java
- Clean Code
- hibernate
- 도메인주도설계
- Spring Batch
- apache storm
- hdfs
- intellij
- Today
- Total
목록Programming/Scala (11)
욱'S 노트
스칼라는 빌트인 패턴 매칭 메커니즘을 제공한다. 다음 예제는 정수 값에 대한 매치를 수행한 결과이다.def getNumberString(number : Int) : String = number match { case 1 => "one" case 2 => "two" case _ => "many" } println(getNumberString(1)) println(getNumberString(2)) println(getNumberString(3))case문들이 있는 블럭에서 정수값을 문자열로 매핑하는 함수를 정의하고 있다. match 키워드는 객체에 대한 함수를 제공하는 편리한 방법이다.다음은 다양한 타입의 패턴에 대응하는 방법이다.def parseNumber(number : Any) : Any = numb..
스칼라는 케이스 클래스 문법을 지원한다. 케이스클래스는 다음과 같은 일반적인 클래스이다.기본적으로 불변이다.패턴 매칭에 따라 분리될 수 있다.레퍼런스 대신 구조적 동일성에 의해 비교된다.간결하게 초기화 되고 사용될 수 있다.예제를 살펴보자. Notification 추상 클래스가 슈퍼클래스와 각 구현 클래스 Email, SMS, VoiceRecording이다.abstract class Notification case class Email(sourceEmail : String, title : String, body : String) extends Notification case class SMS(sourceNumber : String, message : String) extends Notification c..
메소드에는 여러개의 파라미터를 정의할 수 있다. 메소드를 호출할때 더 작은 수의 파라미터가 들어오면 메소드는 전달된 수를 기본값으로 하고 그것보다 적은 수의 파라미터를 가진 함수로 표현될 수 있다.object CurryingTest extends App { def modN(n : Int)(x : Int) = x % n def multiply(f : Int => Int, x : Int, y : Int) = f(x) + y println(multiply(modN(2), 10, 4)) }위의 예제를 보자 modN은 두개의 파라미터가 정의된 것 같지만 multiply에서 사용시 한개의 파라미터만 전달되었다. 이 경우 n인자를 디폴트로 전달받은 함수로 인지되어 modN(2)는 multyply의 Int => Int..
스칼라는 NESTED 함수 정의를 지원한다. 다음은 입력된 ArrayBuffer에서 특정값을 필터링하는 예제이다.import scala.collection.mutable.ArrayBuffer object NestedFunctionTest extends App { def filter(list : ArrayBuffer[Int], filterValue : Int) = { def filterInternal(list : ArrayBuffer[Int]) = { val results = ArrayBuffer[Int]() list.foreach(i => if (i != filterValue) results += i) results } filterInternal(list) } println(filter(ArrayBuff..
스칼라에서는 고차함수 정의를 지원한다. 함수는 다른 함수를 파라미터로 전달받고 그것을 활용할 수 있다. 고차함수를 사용하는 예제는 다음과 같다.(f1 : (Int, Int) => Int, x : Int, y : Int, z : Int) => f1(x, y) * z해당 함수는 함수를 인자로 받고 함수의 결과에 곱하기를 하는 함수이다. 다음은 실제 사용예이다.object HighOrderFunctionTest extends App { val plus = (x : Int, y : Int) => x + y val minus = (x : Int, y : Int) => x - y val multiply = (f1 : (Int, Int) => Int, x : Int, y : Int, z : Int) => f1(x, ..
스칼라에서 익명함수를 정의하는 방법은 매우 간단하다. 아래는 가장 간편하게 정의한 예이다. 왼쪽부분은 파라미터를 정의한 부분이고 오른쪽 부분의 수식을 정의한 부분이다.(x: Int) => x + 1위의 익명함수는 사실 아래와 같은 정의를 단순한 한 것이다.new Function1[Int,Int] { override def apply(x: Int): Int = x + 1 }다수의 파라미터의 경우는 아래와 같이 정의한다.(x: Int, y:Int) => x + y파라미터가 없는 경우는 다음과 같다.() => System.getProperty("user.dir")위의 각 함수들을 테스트하면 아래와 같이 수행할 수 있다.object FunctionTest extends App { val plusOne = (x:..
단일 상속만을 지원하는 언어들과는 다르게 스칼라는 클래스를 재사용을 위한 다른 개념을 가지고 있다. 새로운 클래스 정의내에 클래스의 정의를 새로운 멤버 정의로 재활용할 수 있다. 이것을 믹스인-클래스 컴포지션이라고 한다.abstract class AbsIterator { type T def hasNext : Boolean def next : T }다음으로는 AbsIterator를 상속한 믹스인 클래스를 고려해보자. 클래스를 믹스인으로 사용될 수 있게 정의하기 위해서 trait 키워드를 활용한다. trait RichIterator extends AbsIterator { def foreach(f : T => Unit) = { while (hasNext) f(next) } }다음은 String의 각 캐릭터를 ..
트래잇은 자바에서의 인터페이스와 유사하다. 트래잇은 지원해야하는 메소드 시그니처를 명시한다. 자바 8에서처럼 스칼라는 부분적인 구현을 지원한다. 몇몇의 메소드의 기본 구현을 제공할 수 있다는 것을 의미한다. 클래스와는 반대로 생성자 파라미터를 가질 수 없다.trait Similarity { def isSimilar(x : Any) : Boolean def isNotSimilar(x : Any) : Boolean = !isSimilar(x) }두개의 메소드를 가지고 있다. isSimilar는 구현을 제공하지 않고 있지만 isNotSimilar는 구현을 제공한다. 결과적으로 이 트래잇과 결합하는 클래스는 isSimilar에 대한 구현만 하면 된다. 트래잇은 일반적으로 mixin 클래스 컴포지션으로 클래스와 ..
클래스는 객체를 생성하기 위한 정적인 템플릿이다.class Point (var x : Int, var y : Int) { def move(dx : Int, dy : Int): Unit = { x = x + dx y = y + dy } override def toString : String = "(" + x + "," + y + ")" } 스칼라에서 클래스는 생성자 인자로 파라미터를 전달할 수 있다. 위 코드는 두개의 인자를 가진 생성자를 정의를 하고 있다. x 와 y는 클래스의 어디서든 접근을 할 수 있다.클래스는 또란 두개의 메소드를 포함하고 있는데 move 와 toString이다. move는 두개의 정수를 전달받아 x와 y값을 변경하고 리턴은 없다. 여기서 Unit이라는 키워드가 보이는데 자바와 같은..
스칼라에서는 모든 타입이 객체이다. 스칼라에서는 클래스 기반으로 타입정의를 하기 때문에 모든 값은 클래스의 객체이다.스칼라의 모든 클래스는 scala.Any의 서브클래스이다. 그리고 scala.Any를 직접적으로 상속받는 두 개의 클래스가 있는데, scala.AnyVal과 scala.AnyRef이다. 이름에서 연상되듯이 value 클래스와 reference 클래스이다. 모든 value 클래스들은 기정의되어 있으며 자바와 같은 언어의 프리미티브 타입과 유사하다. 나머지 모든 클래스는 reference 타입으로 정의된다. 만약 우리가 클래스를 정의한다면 기본적으로 레퍼런스 타입이며 scala.AnyRef의 서브 클래스가 된다. 모든 유저가 정의하는 클래스는 암묵적으로 scala.ScalaObject를 상속한..