class Person {
val firstName = "Martin"
val lastName = "Odersky"
def name = firstName + " " + lastName
}
defined class Person
Person
cmd1.sc:1: not found: value Person val res1 = Person ^
Compilation Failed
// Object는 바로 생성되나, Class의 경우 바로 생성되진 않음
// new라는 키워드를 사용
val martin = new Person
martin: Person = $sess.cmd0Wrapper$Helper$Person@37dc5ef7
val martin2 = new Person
martin2: Person = $sess.cmd0Wrapper$Helper$Person@7ebec361
martin.firstName
res2: String = "Martin"
martin.lastName
res3: String = "Odersky"
object greeter {
def greet(p: Person) =
"Greeting, " + p.firstName + " " + p.lastName
}
defined object greeter
greeter.greet(martin)
res3: String = "Greeting, Martin Odersky"
greeter.greet(martin2)
res7: String = "Greeting, Martin Odersky"
greeter.greet("Martin")
cmd8.sc:1: type mismatch; found : String("Martin") required: cmd8Wrapper.this.cmd4.cmd0.wrapper.Person val res8 = greeter.greet("Martin") ^
Compilation Failed
greeter greet martin
res8: String = "Greeting, Martin Odersky"
class Person(first: String, last: String) {
val firstName = first
val lastName = last
def name = firstName + " " + lastName
}
defined class Person
val heungin = new Person("Heunjin", "Kim")
heungin: Person = $sess.cmd9Wrapper$Helper$Person@3d5be80f
heungin.name
res11: String = "Heunjin Kim"
같은 이름의 클래스를 생성할 경우, Repl에선 replace하나 컴파일할 경우엔 error 발생
class 선언시 val이라고 명시하면 바로 필드가 됩니다
class Person(val firstName: String, val lastName : String){
def name = firstName + " " + lastName
}
defined class Person
val heungin = new Person("Heunjin", "Kim")
heungin: Person = $sess.cmd12Wrapper$Helper$Person@77853e65
new Person("Heungjin", "Kim").name
// 생성되고 바로 method 호출
res14: String = "Heungjin Kim"
new Person("Heungjin", "Kim").name
// 위와 다른 인스턴스
res15: String = "Heungjin Kim"
res14 == res15
// repl이면 false로!
res16: Boolean = true
res16 == res14
res17: Boolean = false
class Person(val firstName: String, val lastName: String = "!"){
def name = firstName + " " + lastName
}
defined class Person
default parameter는 모두 뒤에 붙어야 함! 그래야 하나 넣을 때 앞부터 쇽쇽!
new Person(lastName = "Last", firstName="First")
res19: Person = $sess.cmd18Wrapper$Helper$Person@63aef9fa
new Person("seongyun")
res20: Person = $sess.cmd18Wrapper$Helper$Person@3af689b2
class Adder(amount: Int) {
def apply(in: Int): Int = in + amount
}
defined class Adder
val add3 = new Adder(3)
add3: Adder = $sess.cmd4Wrapper$Helper$Adder@5bc432b1
new Adder(3)(2)
res7: Int = 5
add3(2)
res23: Int = 5
class Avengers(val realName: String, val position: String)
defined class Avengers
val CaptainAmerica = new Avengers("Steve Rogers", "Leader")
CaptainAmerica: Avengers = $sess.cmd25Wrapper$Helper$Avengers@21c33d1e
val CaptainAmerica = new Avengers("Steve Rogers", "Leader")
CaptainAmerica: Avengers = $sess.cmd35Wrapper$Helper$Avengers@54ce7dbe
val IronMan = new Avengers("Tony Stark", "Range Deler")
IronMan: Avengers = $sess.cmd35Wrapper$Helper$Avengers@7d059173
val Hulk = new Avengers("Bruce Banner", "Tanker")
Hulk: Avengers = $sess.cmd35Wrapper$Helper$Avengers@2ffb7453
val Thor = new Avengers("Thor Odinson", "God")
Thor: Avengers = $sess.cmd35Wrapper$Helper$Avengers@7386aca7
object GodFollower {
def inspect(avengers: Avengers): String = ""
}
defined object GodFollower
object GodFollower {
def inspect(avengers: Avengers): String = if (avengers.position.toLowerCase == "god") "Oh My God!" else "Mere mortal"
}
defined object GodFollower
println(GodFollower.inspect(Thor) == "Oh My God!")
println(GodFollower.inspect(CaptainAmerica) == "Mere mortal")
true true
GodFollower.inspect(CaptainAmerica)
res66: String = "Mere mortal"
def badness = throw new Exception("Error")
// badness : Nothing
// 모든 것의 하위 타입
defined function badness
null
// Null=null
var bar = if(true) 123 else badness
bar: Int = 123
val baz = if(false) "it worked" else null
// Baz: String = null
baz: String = null
class Timestamp(val seconds: Long)
defined class Timestamp
// 자바는 static method가 있어서 클래스의 인스턴스를 생성하지 않아도 되는 것을 제공해주는데 그런 것들을 companion objects로 지정
object Timestamp {
def apply(hours: Int, minutes: Int, seconds: Int): Timestamp =
new Timestamp(hours*60*60 + minutes*60 + seconds)
}
// 메소드로 생성되게 해줬던 것임!!
defined object Timestamp
Timestamp(1, 1, 1).seconds
res79: Long = 3661L
val t = Timestamp(1, 1, 1)
t: Timestamp = $sess.cmd77Wrapper$Helper$Timestamp@69e81af8
t.seconds
res82: Long = 3661L
val t2 = new Timestamp(3662)
t2: Timestamp = $sess.cmd77Wrapper$Helper$Timestamp@69111a3a
t2.seconds
res84: Long = 3662L
--
case class Person(firstName: String, lastName: String) {
def name = firstName + " " + lastName
}
defined class Person
val martin = new Person("Martin", "Odersky") // we have a class
martin: Person = Person("Martin", "Odersky")
martin.firstName
res87: String = "Martin"
val martin2 = new Person("Martin", "Odersky")
martin2: Person = Person("Martin", "Odersky")
martin == martin2
// case를 사용하면 값만 같아도 true! classㄹㄹ 사용할 경우엔 false
// 데이터를 표현할 때 주로 사용
res90: Boolean = true
martin.name
res91: String = "Martin Odersky"
martin
res92: Person = Person("Martin", "Odersky")
// 기존엔 생성할 때 Person@63aef9fa 이런식이였는데 더 깔끔하게 보일 수 있음
martin equals martin2
res93: Boolean = true
martin.copy()
res94: Person = Person("Martin", "Odersky")
martin.copy(firstName = "Martin2")
// firstName을 바꿔서 만든 Case Class
res95: Person = Person("Martin2", "Odersky")
case object Citizen {
def firstName = "Martin"
def lastName = "Odersky"
def name = firstName + ' ' + lastName
}
// 다음 시간에 설명드리겠습니다!
defined object Citizen
case class Person(firstName: String, lastName: String)
defined class Person
object Stormtrooper {
def inspect(person: Person): String = person match {
case Person("Luke", "Skywalker") => "Stop, rebel scum!"
case Person("Han", "Solo") => "Stop, rebel scum!"
case Person(first, last) => s"Move along, $first"
}
}
defined object Stormtrooper
Stormtrooper.inspect(Person("Martin", "Odersky"))
res100: String = "Move along, Martin"
Stormtrooper.inspect(Person("Han", "Solo"))
res101: String = "Stop, rebel scum!"
val first = "test"
s"Move along, $first" // first 변수가 들어감
first: String = "test" res102_1: String = "Move along, test"
s"Hello ${1+1}"
res103: String = "Hello 2"
Person("first","last")
res105: Person = Person("first", "last")
val last = "last"
last: String = "last"
Person(first, last)
res107: Person = Person("test", "last")
Person(first, _)
cmd108.sc:1: missing parameter type for expanded function ((x$1) => Person(first, x$1)) val res108 = Person(first, _) ^
Compilation Failed
Person("Luke", "Skywalker")
res108: Person = Person("Luke", "Skywalker")
case class Avengers(realName: String, position: String)
val CaptainAmerica = Avengers("Steve Rogers", "Leader")
val IronMan = Avengers("Tony Stark", "Range Deler")
val Hulk = Avengers("Bruce Banner", "Tanker")
val Thor = Avengers("Thor Odinson", "God")
object GodFollower {
def inspect(avengers: Avengers): String = avengers match {
case Avengers(_, "God") => "Oh My God!"
case _ => "Mere mortal"
}
}
defined object GodFollower
println(GodFollower.inspect(Thor) == "Oh My God!")
println(GodFollower.inspect(CaptainAmerica) == "Mere mortal")
true true
case class Music(title: String, author: Author)
case class Author(firstName: String, secondName: String)
defined class Music defined class Author
object MusicPlayer {
// Author의 secondName이 Mozart인 경우와 아닌 경우
def play(music: Music): String = music match {
case Music(title, Author(_, "Mozart")) => s"$title by Mozart"
case Music(t, Author(f, s)) => s"$t by $f $s"
}
}
defined object MusicPlayer
val music1 = Music("애국가", Author("익태", "안"))
val music2 = Music("Requiem", Author("Wolfgang Amodeus", "Mozart"))
music1: Music = Music(애국가,Author(익태,안)) music2: Music = Music(Requiem,Author(Wolfgang Amodeus,Mozart))
println(MusicPlayer.play(music1) == "애국가 by 익태 안")
println(MusicPlayer.play(music2) == "Requiem by Mozart")
true true
trait Similarity {
def isSimilar(x: Any): Boolean
def isNotSimilar(x: Any): Boolean = !isSimilar(x)
}
defined trait Similarity
sealed trait Symbol
case class Note(name: String, duration: String, octave: Int) extends Symbol
case class Rest(duration: String) extends Symbol
defined trait Symbol defined class Note defined class Rest