본문 바로가기

Development/Programming

[Scala] Pattern Matching 다른 언어에서 Switch와 Case문을 Scala에서는 간편하게 match라는 키워드로 구현하면 된다. 우선은 Int를 사용하는 예제를 보자 object MatchTest1 extends App { def matchTest(x: Int): String = x match { case 1 => "one" case 2 => "two" case _ => "many" } println(matchTest(3))} 두번째 예제는 Any라는 키워드를 통해 다양한 키워드 매칭이 가능하다. 그리고 또 놀라운 점은case y : 보자 case에 매칭되지 않는 Int 타입인 경우 y라는 변수로 활용이 가능하다. object MatchTest2 extends App { def matchTest(x: Any): Any = x .. 더보기
[Scala] Higher-order Functions 스칼라에서는 고차 함수를 지원한다. 간단하게 설명하면 다른 함수의 파라미터를 받아서 처리하는 것이 가능하다?! 아래의 예제를 보면 decorator의 layout과 7이라는 파라미터를 전달하면 apply에서 실행을 시켜준다. class Decorator(left: String, right: String) { def layout[A](x: A) = left + x.toString() + right}object FunTest extends App { def apply(f: Int => String, v: Int) = f(v) val decorator = new Decorator("[", "]") println(apply(decorator.layout, 7))} 실행결과는 아래와 같이 나온다. [7] 여기서 .. 더보기
[Scala] Automatic Type-Dependent Closure Construction 스칼라에서는 이름이 없는 함수를 파라미터로 전달이 가능하다. whileLoop라는 함수가 정의되어지고 Boolean과 Unit을 받는다. 그리고 내부에서는 true인 경우 계속해서 whileLoop를 호출하도록 구성이 되어져서 다른 언어에서 키워드처럼?! 사용이 가능하다. object TargetTest1 extends App { def whileLoop(cond: => Boolean)(body: => Unit): Unit = if (cond) { body whileLoop(cond)(body) } var i = 10 whileLoop (i > 0) { println(i) i -= 1 }} 다른 예를 보자 이것은 unless를 사용하는 방법이다. 위의 방법과는 다르게 body후에 파라미터를 입력 받는 방.. 더보기
[Scala] Nested Functions 스칼라에서는 내부 함수??를 만들어서 사용이 가능하다. 말보단 코드로... object FilterTest extends App { def filter(xs: List[Int], threshold: Int) = { def process(ys: List[Int]): List[Int] = if (ys.isEmpty) ys else if (ys.head 더보기
[Java Design Pattern] Design Patterns in Java Tutorial Java로 다양한 디자인 패턴을 정리한 사이트이다. http://www.tutorialspoint.com/design_pattern/index.htm 더보기
[Scala] Mixin Class Composition 각각의 다른 정의가 이루어진 클래스를 하나로 합치는 방법이다. AbsIterator 클래스를 상속 받아서 2개의 클래스가 정의가 된다. abstract class AbsIterator { type T def hasNext: Boolean def next: T} foreach를 구현한 클래스와 trait RichIterator extends AbsIterator { def foreach(f: T => Unit) { while (hasNext) f(next) }} String을 사용하는 클래스 class StringIterator(s: String) extends AbsIterator { type T = Char private var i = 0 def hasNext = i 더보기
[Scala] Implicit Parameters implicit 키워드를 사용하게 되면 prefix 없이 접근이 가능하고 그리고 넘겨 받을 수 있는 인수 또한 implicit라고 선언한 인수만 받을 수 있다. abstract class SemiGroup[A] { def add(x: A, y: A): A}abstract class Monoid[A] extends SemiGroup[A] { def unit: A}object ImplicitTest extends App { implicit object StringMonoid extends Monoid[String] { def add(x: String, y: String): String = x concat y def unit: String = "" } implicit object IntMonoid extend.. 더보기
[Java Design Patten] Thread Specific Storage 패턴 Thread를 사용하다보면 Local 변수는 상관없지만 다른 용도로 데이터의 저장이 필요할 때 Memeber변수를 사용하는 건 문제가 많을 수 있다. 그럴 때 사용하기 좋은 패턴이다. 여기서 핵심은 Log Class 이고 ThreadLocal을 사용한다는 점을 주목하자~! public class TSLog {private PrintWriter writer = null;public TSLog (final String filename) {try {writer = new PrintWriter (new FileWriter(filename));} catch (final IOException e) {e.printStackTrace();}}public void println(final String s) {writer.. 더보기
[Java Design Patten] Two-Phase Termination 패턴 쓰레드가 일반적인 처리를 실행하고 있는 상태를 [작업중]이라고 부르고 이 쓰레드를 중단하고 싶은 때는 [종료 요구]를 합니다. 그리고 종료에 필요한 뒷정리를 시작할 때 [종료 처리 중] 이고 여기서 끝나면 진짜로 쓰레드가 종료합니다. 종료하는 역할 public class CountupThread extends Thread {private long counter = 0;private volatile boolean shutdownRequested = false;public void shutdownRequest() {shutdownRequested = true;interrupt();}public boolean isShutdownRequested () {return shutdownRequested;}public.. 더보기
[Java Design Patten] Future 패턴 케이크를 사러 빵집에 갔습니다. 주문을 하자 주인이 저녁에 찾으러 와주세요 하면서 교환권을 줍니다. 저녁이 되어서 교환권을 들고 케이크를 가지러 갔습니다. 주인은 케이크를 건네 주었습니다. Futrue 패턴은 위의 줄거리와 유사하다. 우선은 Main을 보자 host를 통해 Data를 받는다. 그리고 다른 작업(여기서는 쉬는 2초간 대기)을 하다가 데이터를 사용한다. Data를 교환권이라고 보면 되다. public static void main (String[] agrs) {System.out.println("main BEGIN");final Host host = new Host();final Data data1 = host.request(10, 'A');final Data data2 = host.requ.. 더보기