카테고리 없음

scala 기본(클래스)

머룽 2023. 4. 18. 12:31

스칼라

  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도 더 알아볼 예정이다.