스칼라

trait을 알아보기전에 클래스에 대해 좀더 알아보자ㅎㅎㅎ
계속 뒤로 넘기는중.. 좀더 알아 볼게 있어서..

클래스의 apply 메소드를 알아보자
스칼라는 신기한게 apply 메소드가 있으면 굳이 메소드명을 안써도 된다. 코드로 보자

class AddOne{
  def apply(m:Int) : Int = m + 1
  def name(name:String) : String = s"#$name"
}

이걸 사용 할려면 자바는 이렇게 한다.

AddOne addone = new Addone();
System.out.println(addone.apply(100))

결과를 출력 하면 101이 나올 것이다.
하지만 스칼라는 다르다.

val addOne = new AddOne
println(addOne(100))

메소드를 굳이 쓸필요 없이 바로 apply를 호출한다. 신기방기
자바도 이렇게 됐으면 좋았을텐데..ㅜㅜㅜㅜㅜㅜ ㅜㅜ

다음 코드도 한번 살펴보자

class AddOne{
  def name(name:String) : String = s"#$name"
}

object AddOne {
  def apply(m:Int) : Int = m + 1
}

class 와 object 명이 동일하다.
스칼라에선 이거를 컴패니언 오브젝트(Companion Object)라 부른다.
보통 팩토리 메소드를 만들 때 사용한다고 한다.

class Man(name:String){
  override def toString() = s"my id ${Man.getId} and name $name"
}

object Man {
  private var id = 0
  private def getId: Int = {
    id += 1
    id
  }
  def apply(name:String) = new Man(name)
}

이런식으로 사용을 하고 있다고 한다.

println(Man("wonwoo"))
println(Man("kevin"))

#my id 1 and name wonwoo
#my id 2 and name kevin

Man 오브젝트의 private 함수가 있는데 class에서 접근이 가능하다.
가만 있어보자 저런 형태를 어디선가 많이 본듯하다.
생성을 하지않고 그냥 바로 쓰는? 그런?

Array(1,2,3,4,5,6,7,8,9)

위와 같은 코드를 많이 봤다.
Array도 같은 방식으로 구현 되어있다.
아래는 Array 오브젝트의 일부분이다. 똑같이 Array를 생성하고 있다.

  def apply(x: Int, xs: Int*): Array[Int] = {
    val array = new Array[Int](xs.length + 1)
    array(0) = x
    var i = 1
    for (x <- xs.iterator) { array(i) = x; i += 1 }
    array
  }

이렇게 클래스에 대해 조금 더 알아봤다.
원래는 케이스 클래스 까지 할라고 했는데…
다음에 케이스 클래스 와 패턴매칭을 알아 보겠다.
트레잇은 좀 더 있다………