Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

스칼라의 Class

클래스 생성

class Outsider(val name: String, var age: Int)

스칼라에서 클래스는 위와같이 선언하고 이를 컴파일( scalac Outsider.scala )한뒤 다시 역컴파일( javap -private Outsider )하면 아래와 같은 자바코드가 나옵니다.

public class Outsider extends java.lang.Object implements scala.ScalaObject{
    private int age;
    private final java.lang.String name;
    public Outsider(java.lang.String, int);
    public void age_$eq(int);
    public int age();
    public java.lang.String name();
    public int $tag()       throws java.rmi.RemoteException;
}

위 코드처럼 val로 선언한 name의 getter가 자동으로 생기고 var로 선언한 age에 대한 getter/setter가 만들어집니다. age()는 getter이고 age_=()는 setter입니다. 또한 기본생성자가 자동으로 생성됩니다. JavaBean스타일의 getter/setter를 만드려면 필드에 scala.reflect.BeanProperty 어노테이션을 적어주면 됩니다.( @scala.reflect.BeanProperty var age: Int = _ ) 생성자를 따로 선언하지 않기 때문에 생성자에서 실행해주어야 할 명령어들은 그냥 클래스 내부에 작성하면 자동으로 실행이 됩니다.

클래스 내에서  def this()를 선언하여 기본생성자와 다른 파라미터를 받는 생성자를 추가할 수 있습니다. var test: String = _  와같이 사용하면 언더스코어(_)는 타입의 디폴트  value 를 의미하고 있습니다. Int 일 경우에는 0, Double 일 경우에는 0.0, 레퍼런스타입에서는  null이 되며 언더스코어(_)는  val 에서는 사용할 수 없습니다.

메서드 오버라이딩은 반드시 override def toString()와 같이 override키워드를 사용하여야 하며 오직 주생성자(primary constructor)만이 기반생성자(base constructor)에 파라미터를 전달할 수 있다는 제약이 있습니다. 상속받는 클래스에서 부모클래스에 정의된 파라미터에서는 class ChildOutsider(override val name: String, override var age: Int)처럼  override 키워드로 표시해줍니다.



싱글톤 오브젝트(Singleton Object)

object Outsider() {}

class대신에 object 키워드를 사용하면 싱글톤 객체를 만들 수 있으며 초기화할수 없기 때문에 주생성자에 파라미터를 전달할 수 없습니다. new 키워드 없이  Outsider.methodName() 으로 호출가능합니다.(테스트해본 결과 싱글턴 오브젝트는 미리 생성되지는 않으며 처음 호출되는 타이밍에 호출됩니다.)



컴패니언 오브젝트(Companion Object)
클래스의 이름과 같은 이름을 사용하는 싱글톤 오브젝트를 클래스와 연결하여 companion object라고 부르고 연결된 클래스는 Companion class라고 부릅니다. 컴패니언 오브젝트와 클래스는 서로  제한이 전혀 없기 때문에 private필드나 메서드에 접근할 수 있습니다.
Outsider 클래스의 생성자를  private 로 선언하고 컴패니언 오브젝트를 통해서 외부에 공개할 수 있습니다.(스칼라에 없는  static을 컴패니언 오브젝트를 통해서 해결할 수 있습니다.)
class Outsider private (val name: String){
    println("Created " + this)
    override def toString(): String = "markercolor" + color
}

object Outsider{
    private doCoding() = {}
    def getName() = {}
    def apply() = {}
}

컴패니언 오브젝트에  apply() 메서드를 선언하면  Outsider.apply()를 Outsider()로 호출할 수 있게 만들어 줍니다.
2010/05/26 03:30 2010/05/26 03:30