* 객체 생성 방법
* 클래스를 통한 인스턴스화
* object 예약어를 통한 객체 생성
* 스칼라 객체는 싱글톤으로 설계되어 있음
class A
val real1=new A
val real2=new A
object B
//println(real1)
//ScalaFiddle$A@1
//println(real2)
//ScalaFiddle$A@2
//println(A)
//ScalaFiddle.scala:6: error: not found: value A
//println(B)
//ScalaFiddle$B$@1
object HelloWorld {
def main(args: Array[String]): Unit = {
val car=new vehicle()
println(car.price)
println(car.hood)
val apple=new Fruit("apple")
println(apple.name)
val dummy2=new dummy2("a","b")
println(dummy2.a)
}
}
class vehicle() {
var price: Int=100000
var hood: String="expensive hood"
}
class Fruit(input: String) {
var name=input
}
class dummy(a:String,b:String)
case class dummy2(a:String,b:String)
// $scala HelloWorld
// 100000
// expensive hood
// apple
// a
* object 를 이용해 바로 객체를 생성해 버리고 main 동작
* class에는 생성자 없이 직접 맴버 변후에 값 명시
* 구현부 없애는 것도 가능 => 무슨 쓸모? => case 붙여서 사용 가능
* 객체 이름과 클래스 이름 같을 수 있음 (동반 객체)
상속
* JAVA의 상속과 거의 동일
트레이트와 추상 클래스
trait
객체에 추가될 수 있는 부가적인 특성
Java interface와 달리 자유롭게 변수 선언 , 로직 구현 가능
다중상속 가능
interface와 달리 method구현의 강제성은 없음 ( 강제성 있는 것 같음 )
abstract class
JAVA의 그것과 같음
다중상속 안됨
JAVA와 연동일 때는 좋은 선택일 수 있음
공통 특징
자체로 인스턴스 만들 수 없음
예제 4-5 4-6
상속받는 class에서 trait 구현 method 덮고 싶을 때는 override 이용 (없으면 에러 발생함)
mixing : 추상 클래스에 tait 섞어 구현
object HelloWorld {
def main(args: Array[String]) {
val pig=new Pig
pig.eat
pig.shout
pig.fly
}
class Pig extends Animal with Flying with Eating {
// trait method도 구현해야하는데....?
// HelloWorld.scala:9: error: class Pig needs to be abstract, since method eat in trait Eating of type => Unit is not define
def eat=println("쩝쩝")
// abstract class 미구현 method는 꼭 구현해야한다.
def shout=println("꿀꿀")
}
abstract class Animal {
def shout
}
trait Flying {
def fly = println("납니다.")
}
trait Eating {
def eat
}
}
스칼라 scala 스터디
클래스와 객체
상속
트레이트와 추상 클래스
트레이트 쌓기