scala package object

language/scala 2014.11.05 17:00 posted by dev.bistro

스칼라의 package object는 어떤 모습을 하고 있을까?


package com {

  package sub {

    class klazz  {

      val name = pubValue

    }

  }

  package object sub {

    val pubValue = "A"

    private val priValue = "B"

    def pubMethod() = "C"


  }

}


1. com/sub 폴더 내에는 다음과 같은 파일들이 생성된다.

- klazz.class

- package$.class

- package.class


2. package, package$

$ javap -p package

public final class com.sub.package {

  public static java.lang.String pubMethod();

  public static java.lang.String pubValue();

}

public final class com.sub.package$ {

  public static final com.sub.package$ MODULE$;

  private final java.lang.String pubValue;

  private final java.lang.String priValue;

  public static {};

  public java.lang.String pubValue();

  private java.lang.String priValue();

  public java.lang.String pubMethod();

  private com.sub.package$();

}



- companion object 를 가지는 class 와 유사한 모습으로 생성된다.
- package object의 method와 var 맴버는 public static 으로 생성된다.

신고

'language > scala' 카테고리의 다른 글

Superseded by Akka HTTP  (0) 2017.05.01
FP 비엄격성  (1) 2015.05.18
scala package object  (0) 2014.11.05
scala의 lazy 비용  (0) 2014.10.21
spray는 멋지군..  (0) 2014.10.20
Enum Type을 Slick 에서 사용하기  (0) 2014.10.07

Effective Unit Testing / 한빛미디어

life/book 2014.10.27 00:21 posted by dev.bistro



제목만으로도 이 책은 선택할만한 가치를 가지고 있다. Effective로 시작하는 책들이 가진 무게감이며, 그간의 경험을 통해서 알고 있기 때문이다.

크게 3부분으로 나누고 있다.
Part1에서는 이 책이 말하고자 하는 '좋은 테스트 코드'를 이해하기 위한 기본을 설명해주고 
Part2에서는 샘플코드-개선방법-결과 3단계로서 반복적으로 실 사례를 보여주며,
Part3에서는 좀 더 고급화된 소주제들과 팁들을 공유해주고 있다.

시작부터 중요한 얘기를 들려준다
100퍼센트의 코드 커버리지는 좋겠지만 실제로 중요한 것은 아니라는 점. 어느 점이 지나가면 테스트를 작성하는 비용대비 이점이 거의 없어진다는 얘기를 들려준다. 가장 중요한 제품 코드의 테스트 코드를 먼저 작성하며, 뒤로 갈수록 중요도가 하락하거나, 코드 커버리지를 위한 의미없는 테스트 코드가 작성되기 떄문이다.

이러한 테스트코드의 가치를 유지하는 방법은 제품의 품질을 위한 테스트코드 작성이 아니라, 설계를 위한 테스트코드 작성을 하라 조언해주고 있다. 하지만 이 부분이 말은 쉽다. '실패하는 코드를 작성하고 그걸 왜 완성시켜야 하지? 처음부터 잘 짜여진 코드를 작성하면 되지' 라고 생각하는 많은 개발자 들이 품질관리용에서 설계목표로 넘어가지 못한다. 
(나 역시 너무나도 당연한 '실패 테스트'에서 시작하라는거에 반감이...-ㅇ-)

여튼, 이러한 테스트코드는 제품코드 만큼 중요하다.  품질검증과 설계목적인 테스트코드 역시 제품을 만들어가는데 중요한 요소이며, 이를 관리하는 리소스역시 일정에 포함된다. 좋은 테스트코드가 필요한 이유이다. "어쩌면" 당연한 내용을 2부에 걸쳐서 예제로 보여준다. "당연하지만" 당연하게 하지 않는 것들이다. 그냥 쭉 읽으니 감동이 느껴지지 않아서 만들고 있던 specs2 code들을 대입해보며 읽으니 좀 더 느낌이 왔다.

이후 생각치도 못한 아이디어도 3부에서 얻게되었다.
java로 프로젝트를 진행할 때는 java-junit을... scala 프로젝트에는 specs2로 테스트코드를 작성하였는데, 생각의 전환을 일꺠워 줬다. 왜 groovy를 여기에 쓸 생각을 못했지?


정리하며...
흔히 말하는 TDD를 위한 책은 아니다. 그 부분은 1부에서 잠깐 소개되며, 친절하게도 다른 래퍼런스들을 소개해준다. 이 책은 TDD를 위한 '좋은 테스트 코드를 작성하는 방법'을 위한 책이다.  초급자를 위한 책은 아니며, 어느 정도 테스트 코드의 중요성을 알고있는 사용자에게 적합한 책이라 생각된다. 

책은 300페이지 정도로 결코 두껍지는 않다. 2부가 지겹다면 과감히 스킵하고 1부만을 봐도 좋을듯 하다.
1부를 보고 엉망인 테스트 코드를 직접 적용해나가도 보면 2부의 케이스를 찾아보며 적용하게 될것이다.


링크 : http://www.hanbit.co.kr/book/look.html?isbn=978-89-6848-062-1



신고

scala의 lazy 비용

language/scala 2014.10.21 17:25 posted by dev.bistro

lazy val x = 솰라솰라...


단순히 늦은/지연 연산일 줄만 알았다...


test

class lazyval {
    lazy val x = 5
}

를 scalac로 컴파일하고 다시 디컴파일 해서 내용을 보면

public class lazyval

{


    private int x$lzycompute()

    {

        synchronized(this)

        {

            if(!bitmap$0)

            {

                x = 5;

                bitmap$0 = true;

            }

            BoxedUnit _tmp = BoxedUnit.UNIT;

        }

        return x;

    }


    public int x()

    {

        return bitmap$0 ? x : x$lzycompute();

    }


    public lazyval()

    {

    }


    private int x;

    private volatile boolean bitmap$0;

}


- voliatile boolean의 flag가 하나 생성된다
- 초기화 되지 않았다면 synchronized 으로 묶어 초기화를 한다 (오쉿1)
- 이후 voliatile bitmap$0을 계속 참고한다.(오쉿2)

읽기 비용이 있다는걸 잊지 말자. 

자세한 내용은 SIP-20 http://docs.scala-lang.org/sips/pending/improved-lazy-val-initialization.html#version_v4__the_cas_improvement

신고

'language > scala' 카테고리의 다른 글

FP 비엄격성  (1) 2015.05.18
scala package object  (0) 2014.11.05
scala의 lazy 비용  (0) 2014.10.21
spray는 멋지군..  (0) 2014.10.20
Enum Type을 Slick 에서 사용하기  (0) 2014.10.07
Slick  (0) 2014.10.05
TAG Lazy, scala


티스토리 툴바