SCALA TYPE ERASURE & TYPETAG

language/scala 2017.06.30 09:28 posted by dev.bistro

다른  JVM 언어처럼 Scala  역시  컴파일시점에 type 정보를 잃어버린다.

SCALA는 JVM의 type erasure issue 를  TypeTag(이전에는 Manifest)로 해결 할 수 있다

// TODO undeprecated until Scala reflection becomes non-experimental
// @deprecated("Use `scala.reflect.ClassTag` (to capture erasures) or scala.reflect.runtime.universe.TypeTag (to capture types) or both instead", "2.10.0")
type Manifest[T]      = scala.reflect.Manifest[T]
scala> def evenElems[T : ClassTag](xs: Vector[T]): Array[T] = {
| val arr = new Array[T]((xs.length + 1) / 2)
| for (i <- 0 until xs.length by 2)
| arr(i / 2) = xs(i)
| arr
| }
evenElems: [T](xs: Vector[T])(implicit evidence$1: scala.reflect.ClassTag[T])Array[T]

scala>

 

 

 

ClassTag는 최상위의 Class의 Type정보만을 생성해준다.
ex) ClassTag[List[String]] -> collection.immutable.List

실제로 Intellij에서 Debugging 화면에서 보면 implicit evidence 를 볼 수 있다

스크린샷 2016-06-19 오후 4.07.52

스크린샷 2016-06-19 오후 3.37.56



신고

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

SCALA TYPE ERASURE & TYPETAG  (0) 2017.06.30
SCALA UPPER/LOWER TYPE BOUND & VIEW BOUND  (0) 2017.06.28
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

SCALA UPPER/LOWER TYPE BOUND & VIEW BOUND

language/scala 2017.06.28 13:58 posted by dev.bistro

하나 이상의 타입인자가 있는 클래스는 ‘제네릭 클래스’이고  타입인자를 실제 타입으로 대체하면 일반 클래스이다.

1
2
3
4
class Pair[T,S](val first:T, val second:S) //제네릭 클래스
 
val p1 = new Pair(42, "String") //추론에 의해서 일반 클래스
val p2 = new Pair[Int, String](42, "String") //명시적 선언에 의해서 일반 클래스

 

함수,  메소드도 타입인자를 가질 수 있다.

1
2
3
4
5
def getMiddle[T](a: Array[T]) = a(a.length) / 2
 
ex)
getMiddle(Array("Mary", "had")) //추론의 의해서 getMiddle 호출
val f = getMiddle[String] _ //타입인자를 명시적으로 지정함

 

타입에 제한(bound)를 걸어야 할 필요가 있다. 다음의 예로 쉽게 이해 가능하다

1
2
3
4
5
6
7
8
9
10
11
class Pair[T](val first:T, val second:S) {
def smaller = if (first.compareTo(second) < 0 ) <<--여기
}
/* first가 compareTo를 가지고 있는지 확인 할 수 없기 때문에 오류가 발생한다.
이를 해결하기 위해서는 first가 'compareTo'를 항상 가지고 있으면 될 것이다. 아래처럼 */
 
class Pair[T <: Comparable[T]](val first: T, val second: T) {
def smaller = if (first.compareTo(second) < 0 )
}
/* 처럼 'T가 반드시 Comparable[T]의 sub-type'임을 지정하면 된다.
=> 그리고 'T의 상위 타입을 지정했거나, upper bound 지정,제약했다' 라고 표현 가능 */

 

그와 비슷하게 lower bound를 선언할 수도 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Queue[+T] (private val leading: List[T], val trail: List[T] ) {
def enqueue[U >: T] (x: U) = new Queue[U](leading, x :: trail)
}
// U >: T 를 이용해 T 를 U 의 하위 바운드로 지정했으니 U가 T의 슈퍼클래스여야 한다.
 
ex1)
/* Fruit 클래스에 2개의 서브 클래스 Apple, Orange가 있다.
Queue[Apple]에 Oragne를 추가할 수 있고 결과는 Queue[Fruit]가 된다. */
 
ex2)
class Animal
class Bird extends Animal
class Chicken extends Bird
 
val flock = List(new Bird, new Bird)
flock: List[Bird] = List(Bird@7e1ec70e, Bird@169ea8d2)
 
new Chicken :: flock
res53: List[Bird] = List(Chicken@56fbda05, Bird@7e1ec70e, Bird@169ea8d2)
 
// 처럼 공통적인 각기 다른 타입을 하나로 분류할 수 있는 이점이 생긴다.

 

upper , lower bound와 같은 상하위가 아니라 implicit의 암묵적 변환에도 그대로 사용하고 싶을 경우에는 <% 를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
class Pair[T <: Comparable[T] ](val first:T, val second:T)
val p = new Pair(4,2)
 
output> Error:(6, 9) inferred type arguments [Int] do not conform to class Pair's type parameter bounds [T <: Comparable[T]]
// 4, 2같은 Int는 Comparable를 구현하지 않기 때문이다 하지만 RichInt에는 있다.
 
class Pair[T <% Comparable[T] ](val first:T, val second:T)
/* 처럼 수정하면 된다. 이를 다시 풀어보면
a. T가 Comparable[T]로 암묵적 변환이 가능하다 라는 의미이다.
b. T를 Comparable[T]로 다룰수 있는 모든 T type을 사용 할 수 있다.
c. class Pair[T ](..)(implicit imp: T => Comparable[T]) 의 축약형이다.


신고

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

SCALA TYPE ERASURE & TYPETAG  (0) 2017.06.30
SCALA UPPER/LOWER TYPE BOUND & VIEW BOUND  (0) 2017.06.28
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

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

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

spray는 멋지군..

language/scala 2014.10.20 17:51 posted by dev.bistro

scala 기반에 프레임웍으로는 제일 유명한게 Play Framework.... 나름 몇일몇주를 번역해가며 스터디 한 놈이지만... 선택받지는 못했다. 
 그 외에도 scalatra나, finatra도 있지만 지금 API Platform을 구성하는데는 spray 1.3.1 을 사용중... 얘도 actor 기반이고, 간결하다.


테스트와 성능이슈를 위해서 Route를 다시 한번  Route로 묶음으로서 원하는 요구사항은 몇줄만에 해결

  val mockRoute =

    pathPrefix("mock") {

      parameter('delay.as[Int] ){

        delay => {

          Thread.sleep(delay)

          logger.warn("delay {} millisecond" , delay.toString)

          apiRoute

        }

      }

    }



신고

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

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
Functional Programming Principles in Scala 끝!  (1) 2013.06.04
TAG play, scala, SPRAY

Enum Type을 Slick 에서 사용하기

language/scala 2014.10.07 16:08 posted by dev.bistro


1. Enum 타입의 사용

scala.Enumeration을 상속한다.

object REQUEST_METHOD_TYPE extends Enumeration {
  type REQUEST_METHOD_TYPE = Value
  val GET, POST = Value
}


2. Slick의 선언

implicit val MethodMapper  = MappedColumnType.base[REQUEST_METHOD_TYPE,String] ( s=>s.toString, s=>REQUEST_METHOD_TYPE.withName(s))

def method = column[REQUEST_METHOD_TYPE]("method", O.NotNull, O.Default(REQUEST_METHOD_TYPE.GET), O.DBType("VARCHAR(20)"))


신고

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

scala의 lazy 비용  (0) 2014.10.21
spray는 멋지군..  (0) 2014.10.20
Enum Type을 Slick 에서 사용하기  (0) 2014.10.07
Slick  (0) 2014.10.05
Functional Programming Principles in Scala 끝!  (1) 2013.06.04
Scala Tuple  (0) 2013.03.12
TAG enum, scala, Slick

Slick MultiDatasource, TableName, CRUD trait...

분류없음 2014.08.01 19:08 posted by dev.bistro


원하는거 : 부끄럽지 않은 코드를 만들고 싶다. 중복을 줄이고싶다-_-;;


요구사항

1. Oracle, Mysql 2개Datasource에 접근해야함 => local import
2. 테이블명이 각각 다름 -> class 생성자
3. CRUD의 중복을 줄이고 싶음 trait사용...


삽질한것.

1. dirver.simple._를 분리해야 한다. 아니면 oracle, mysql의 ddl 코드가 제네레이션 될때 문제가 발생한다. (오라클용 insert가 mysql에서 사용될려는 등)

2. extends CRUD 부분. 좀 더 깔끔하게 할 방법이 없을까? tableName과 driver, TableQuery 3개를 DI해야하는데 좋은 방법이 떠오르지 않아서 implicit로 처리했다. 좀 더 좋은게 있을듯 한데?


ps. 리팩토링 관련 조언 좀 부탁드려요.



trait CRUD[T] {


  implicit val driver: JdbcProfile

  import driver.simple._


  implicit val tableName:String

  implicit val prop:TableQuery[_<: Table[T]]


  def drop(implicit  session:Session) =  if ( MTable.getTables(tableName).list().nonEmpty)   prop.ddl.drop

  def create(implicit  session:Session) =  if ( MTable.getTables(tableName).list().isEmpty) prop.ddl.create


  def count(implicit  session:Session) =  prop.length.run

  def findAll(implicit  session:Session) = prop.list

  def insert(obj:T)(implicit  session:Session) = prop += obj

  def insert(obj:List[T])(implicit  session:Session) = prop.insertAll(obj: _*)

}




case class City ( synId:Int, cityId:String, citySynonym:String, moddttm:String, regdttm:String, status:String, datahubstatus:String )

class CityDao (val driver: JdbcProfile, val tableName:String) extends CRUD[City] {

  import driver.simple._

  class HubSynCity(tag: Tag, tableName: String) extends Table[City](tag, tableName) {

    def synId = column[Int]("CITY_SYN_ID")

    def cityId = column[String]("CITY_ID")

    def citySynonym = column[String]("CITY_SYNONYM")

    def moddttm = column[String]("MOD_DTTM")

    def regdttm = column[String]("REG_DTTM")

    def status = column[String]("STATUS")

    def datahubstatus = column[String]("DATAHUBSTATUS")

    def * = (synId, cityId, citySynonym, moddttm, regdttm, status, datahubstatus) <>(City.tupled, City.unapply)

  }

  val prop = TableQuery[HubSynCity]((tag:Tag) => new HubSynCity(tag, tableName))

}



신고
TAG scala, Slick, Trait

이것저것 2014-04-22

분류없음 2014.04.22 09:59 posted by dev.bistro


Cacoo : 업무진행시 시스템구조도나 다이어그램을 그릴 때 유용할 듯하다. 기존에 쓰던 애들보다 유료템플릿모델이나 협업시스템이 잘 되어 있다. 이제 이걸 메인으로 쓸듯
추가 : 소개글


Snap.svgadobe에서 공개한 svg library이다. IE9이상의  modern browsers만을 대상으로 하고 있어서 실무에서는 raphael를 대신할 수 없을 것 같지만. 러닝커브가 없다시피해서 제약상황이나 프로토타이핑에서는 고려해볼만하다.


Scala 2.11 :  1년여만에 마이너버전이 업데이트가 되었다. 나중에 보도록 하자 ㅋ


* 읽을거리 

jQuery Stops IE 6 and IE 7 Support in v1.13 : 1.1.12를 쓰던가, 5프로대의 점유율인 IE7를 무시하고 쓰면 될것 같다. (뭐 개인적으로는 IE8도 지원안해주는 운영툴을 만들고 있으니 별상관은...)


Dropbox 갤러리앱 성능 개선Dropbox의 Carousel의 성능개선 글에 대한 yisangwook 님의 번역글이다.   -  원본   ,  번역 


SSL이란 무엇인가? : 미닉스님의 SSL에 관한 웹툰.  1편   , 2편


* 세미나 & 컨퍼런스 정보
- GoogleIO2014 : 이미 끝났지만.. 지난주에 GoogleIO의 등록을 위한 뽑기-_-추첨이 있었다. 이 예선전을 통과해야 실제로 IO 등록을 할 수 있는 자격이 생긴다.

- SpringOne : 올해 SpringOne의 등록을 시작했다 텍사스다. 근데 지난번에도 있었나.. All inclusive travel (US only-_-)

- SpringCamp : 공식적인 노티는 아니지만 페북 그룹에서 5월 31일 예정으로 알려주셨다. 지난해에 이허서 매우  기대된다.

- PyCon2014 동영상 : 1주일만인가 공유가 되기 시작했다. LTE급으로 빠른 공유다! 


신고
TAG cacoo, scala, snap, SSL

Functional Programming Principles in Scala 끝!

language/scala 2013.06.04 09:02 posted by dev.bistro


사사오입-_-도 아니고.. 79.5점인데도 불구하고 80점 이상만 준다는 'with distinction ' 가 붙었다... 이거 웬지 얻어 걸린듯해서.. 기쁘다...??


2013년 상반기 중에서 가장 집중했고 가장 어려웠던 코스인것 같다. 

강좌를 듣는것도, 플레이 타임의 몇배였고, 숙제는 일주일에 2-3일씩(심지어는 주말에도!!) 투자를 하였다. 

(이거에 비하면 java, python은 정말 쉬운거 같다.. 내 머리가 이미 굳어서 일수도...)


현재 프로젝트의 부분 개선방안으로 Scala를 주목하고 학습을 시작하였지만,

적용도... 시작도 쉽지 않다 ( 기존 코드가 워낙... 복잡하고 온갖 요구사항이 적용되어 있어서이기도 하다). 

매력적인 언어지만....  내가 능력이 안따라주는게 안타깝다 -ㅇ-


신고

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

Enum Type을 Slick 에서 사용하기  (0) 2014.10.07
Slick  (0) 2014.10.05
Functional Programming Principles in Scala 끝!  (1) 2013.06.04
Scala Tuple  (0) 2013.03.12
2.10을 위한 scala-ide plugin 재설치  (0) 2013.03.12
case class 2번째 이야기.  (0) 2013.02.06

Scala Tuple

language/scala 2013.03.12 17:45 posted by dev.bistro

Tuple case class

https://github.com/scala/scala/blob/v2.10.0/src/library/scala/Tuple2.scala

https://github.com/scala/scala/blob/v2.10.0/src/library/scala/Tuple22.scala


* Tuple는 Tuple2 ~ Tuple22 까지 준비 되어 있다.

* case class

* Tuple2 만 swap이 존재한다.

* trait Product.scala

* trait Product2.scala ( ~ Product22.scala) 도 참고해야한다.


ps. 22의 의미는 대체 뭘까-_-;


신고

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

Slick  (0) 2014.10.05
Functional Programming Principles in Scala 끝!  (1) 2013.06.04
Scala Tuple  (0) 2013.03.12
2.10을 위한 scala-ide plugin 재설치  (0) 2013.03.12
case class 2번째 이야기.  (0) 2013.02.06
Play framework IDE, Scala Build Sublime  (0) 2013.02.06


티스토리 툴바