스칼라

  1. 변수
  2. 함수

이번엔 클래스에 대해 알아보자.
일단 클래스의 기본형태를 보자

class MyClass {

}

요거다. 자바랑 비슷하다.
그럼 상세하게 더 보자.

class MyClass(id: Long, name: String) {

  def this(id:Long) = this(id,"No name")

  def getName = name

  def getId = id

  override def toString = s"id = $id name = $name"
}

보자 흠..
일단 MyClass옆에 있는저건 생성자다.
저렇게 클래스 생성할 수 있다.
그리고 그 밑은 id만 있는 생성자다. 보조 생성자?
그리고 그 밑은 흔히 말하는 getter 일반적은 function이다.
그리고 자바와 다른점은 override 어노테이션이 아니라 예약어 인듯하다.
그럼 한번 클래스를 생성해보자.

val myClass = new MyClass(1L,"wonwoo")
println(myClass)
println(myClass.getName)

id = 1 name = wonwoo
wonwoo

다음 소스도 보자

class MyClass(val id: Long, val name: String) {

  private val number = 1000

  def this(id:Long) = this(id,"No name")

  def getName = name

  def getId = id

  def getNumber = number

  def setNumber(number:Int) = this.number = number

  override def toString = s"id = $id name = $name"
}

자바와 마찬가지로 private 으로 접근제어도 가능하다.
그리고 number는 val이 때문에 setNumber 컴파일 에러가 날것이다.
앞서 설명 했듯이 val는 자바의 final이라 생각하면 빠르다.
자바 개발자를 위한 스칼라 공부인듯 하네..
아 저기 보인 toString 함수를 보자.
우리가 자바를 사용할때 불편점이 있었다. 위와 같은 코드를 만들때 "id = " + id + "name = " + name 이런식을 만들었다.
보기만 해도 불편하다. 불편한 것도 있지만 자바에서 저코드는 비효율적이다. 물론 저렇게 몇개 안되는 연산은 상관없지만
많은 연산을 할 경우 String을 계속 생성하기 때문에 메모리상 비효율적이다.
그건 그렇고 일단 보기에도 불편하다.
하지만 스칼라는 앞에 s만 붙이고 나면 효율적으로 이어 나갈 수 있다. 간편해서 좋다.
클래스이야기 하다 삼천포로 빠졌네.

다시 class 로 가자

class Animal(var name: String) {

  def getName = name

  override def toString = s"name is $name"
}

class Dog(name: String, sound: String) extends Animal(name: String) {

  def getSound = sound

  override def toString = s"my name is $name and sound $sound"
}

상속이다. 객체지향언어라면 상속이 있다. 스칼라도 있다.
개념은 자바와 같다. 자바 개발자라면 생성자를 만드는게 약간 어색하지만 그래도 이해는 된다.
마찬가지로 추상클래스도 있다.

abstract class Pizza{

  def order

  def orderPizza = {
    order
    prepare
    bake
  }
  def prepare = println("prepare")

  def bake = println("bake")
}

class ChicagoPizza extends Pizza{
  override def order: Unit = println("ChicagoPizza")
}

class LAPizza extends Pizza {
  override def order: Unit = println("LAPizza")
}

간단하게 만들어봤다.
개념은 자바와 동일한듯 하다.
abstract 메소드만 필수적으로 구현 해주면 된다.

클래스 자체는 어렵지 않은 듯 하다. 자바와 비슷하기 때문에 그렇게 어렵게 느껴지짆 않는다.
다음 시간에 스칼라의 인터페이스라 불리는 trait에 대해 알아보자
시간이 되면 class도 더 알아볼 예정이다.