In [1]:
class Person {
val firstName = "Martin"
val lastName = "Odersky"
def name = firstName + " " + lastName
}
Out[1]:
In [1]:
Person
In [1]:
// Object는 바로 생성되나, Class의 경우 바로 생성되진 않음
In [2]:
// new라는 키워드를 사용
val martin = new Person
Out[2]:
In [7]:
val martin2 = new Person
Out[7]:
In [3]:
martin.firstName
Out[3]:
In [4]:
martin.lastName
Out[4]:
In [3]:
object greeter {
def greet(p: Person) =
"Greeting, " + p.firstName + " " + p.lastName
}
Out[3]:
In [4]:
greeter.greet(martin)
Out[4]:
In [8]:
greeter.greet(martin2)
Out[8]:
In [8]:
greeter.greet("Martin")
In [9]:
greeter greet martin
Out[9]:
In [10]:
class Person(first: String, last: String) {
val firstName = first
val lastName = last
def name = firstName + " " + lastName
}
Out[10]:
In [11]:
val heungin = new Person("Heunjin", "Kim")
Out[11]:
In [12]:
heungin.name
Out[12]:
같은 이름의 클래스를 생성할 경우, Repl에선 replace하나 컴파일할 경우엔 error 발생
class 선언시 val이라고 명시하면 바로 필드가 됩니다
In [13]:
class Person(val firstName: String, val lastName : String){
def name = firstName + " " + lastName
}
Out[13]:
In [14]:
val heungin = new Person("Heunjin", "Kim")
Out[14]:
In [15]:
new Person("Heungjin", "Kim").name
// 생성되고 바로 method 호출
Out[15]:
In [16]:
new Person("Heungjin", "Kim").name
// 위와 다른 인스턴스
Out[16]:
In [17]:
res14 == res15
// repl이면 false로!
Out[17]:
In [18]:
res16 == res14
Out[18]:
In [19]:
class Person(val firstName: String, val lastName: String = "!"){
def name = firstName + " " + lastName
}
Out[19]:
default parameter는 모두 뒤에 붙어야 함! 그래야 하나 넣을 때 앞부터 쇽쇽!
In [20]:
new Person(lastName = "Last", firstName="First")
Out[20]:
In [21]:
new Person("seongyun")
Out[21]:
In [5]:
class Adder(amount: Int) {
def apply(in: Int): Int = in + amount
}
Out[5]:
In [6]:
val add3 = new Adder(3)
Out[6]:
In [8]:
new Adder(3)(2)
Out[8]:
In [24]:
add3(2)
Out[24]:
In [32]:
class Avengers(val realName: String, val position: String)
Out[32]:
In [27]:
val CaptainAmerica = new Avengers("Steve Rogers", "Leader")
Out[27]:
In [56]:
val CaptainAmerica = new Avengers("Steve Rogers", "Leader")
Out[56]:
In [57]:
val IronMan = new Avengers("Tony Stark", "Range Deler")
Out[57]:
In [58]:
val Hulk = new Avengers("Bruce Banner", "Tanker")
Out[58]:
In [59]:
val Thor = new Avengers("Thor Odinson", "God")
Out[59]:
In [60]:
object GodFollower {
def inspect(avengers: Avengers): String = ""
}
Out[60]:
In [72]:
object GodFollower {
def inspect(avengers: Avengers): String = if (avengers.position.toLowerCase == "god") "Oh My God!" else "Mere mortal"
}
Out[72]:
In [73]:
println(GodFollower.inspect(Thor) == "Oh My God!")
println(GodFollower.inspect(CaptainAmerica) == "Mere mortal")
In [67]:
GodFollower.inspect(CaptainAmerica)
Out[67]:
In [74]:
def badness = throw new Exception("Error")
// badness : Nothing
// 모든 것의 하위 타입
Out[74]:
In [ ]:
null
// Null=null
In [76]:
var bar = if(true) 123 else badness
Out[76]:
In [77]:
val baz = if(false) "it worked" else null
// Baz: String = null
Out[77]:
In [78]:
class Timestamp(val seconds: Long)
Out[78]:
In [79]:
// 자바는 static method가 있어서 클래스의 인스턴스를 생성하지 않아도 되는 것을 제공해주는데 그런 것들을 companion objects로 지정
object Timestamp {
def apply(hours: Int, minutes: Int, seconds: Int): Timestamp =
new Timestamp(hours*60*60 + minutes*60 + seconds)
}
// 메소드로 생성되게 해줬던 것임!!
Out[79]:
In [80]:
Timestamp(1, 1, 1).seconds
Out[80]:
In [81]:
val t = Timestamp(1, 1, 1)
Out[81]:
In [83]:
t.seconds
Out[83]:
In [84]:
val t2 = new Timestamp(3662)
Out[84]:
In [85]:
t2.seconds
Out[85]:
In [86]:
case class Person(firstName: String, lastName: String) {
def name = firstName + " " + lastName
}
Out[86]:
In [87]:
val martin = new Person("Martin", "Odersky") // we have a class
Out[87]:
In [88]:
martin.firstName
Out[88]:
In [89]:
val martin2 = new Person("Martin", "Odersky")
Out[89]:
In [91]:
martin == martin2
// case를 사용하면 값만 같아도 true! classㄹㄹ 사용할 경우엔 false
// 데이터를 표현할 때 주로 사용
Out[91]:
In [92]:
martin.name
Out[92]:
In [93]:
martin
Out[93]:
In [93]:
// 기존엔 생성할 때 Person@63aef9fa 이런식이였는데 더 깔끔하게 보일 수 있음
In [94]:
martin equals martin2
Out[94]:
In [95]:
martin.copy()
Out[95]:
In [96]:
martin.copy(firstName = "Martin2")
// firstName을 바꿔서 만든 Case Class
Out[96]:
In [97]:
case object Citizen {
def firstName = "Martin"
def lastName = "Odersky"
def name = firstName + ' ' + lastName
}
// 다음 시간에 설명드리겠습니다!
Out[97]:
In [98]:
case class Person(firstName: String, lastName: String)
Out[98]:
In [99]:
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"
}
}
Out[99]:
In [101]:
Stormtrooper.inspect(Person("Martin", "Odersky"))
Out[101]:
In [102]:
Stormtrooper.inspect(Person("Han", "Solo"))
Out[102]:
In [103]:
val first = "test"
s"Move along, $first" // first 변수가 들어감
Out[103]:
In [104]:
s"Hello ${1+1}"
Out[104]:
In [106]:
Person("first","last")
Out[106]:
In [107]:
val last = "last"
Out[107]:
In [108]:
Person(first, last)
Out[108]:
In [108]:
Person(first, _)
In [109]:
Person("Luke", "Skywalker")
Out[109]:
In [ ]:
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")
In [117]:
object GodFollower {
def inspect(avengers: Avengers): String = avengers match {
case Avengers(_, "God") => "Oh My God!"
case _ => "Mere mortal"
}
}
Out[117]:
In [118]:
println(GodFollower.inspect(Thor) == "Oh My God!")
println(GodFollower.inspect(CaptainAmerica) == "Mere mortal")
In [120]:
case class Music(title: String, author: Author)
case class Author(firstName: String, secondName: String)
Out[120]:
In [136]:
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"
}
}
Out[136]:
In [137]:
val music1 = Music("애국가", Author("익태", "안"))
val music2 = Music("Requiem", Author("Wolfgang Amodeus", "Mozart"))
Out[137]:
In [138]:
println(MusicPlayer.play(music1) == "애국가 by 익태 안")
println(MusicPlayer.play(music2) == "Requiem by Mozart")
In [139]:
trait Similarity {
def isSimilar(x: Any): Boolean
def isNotSimilar(x: Any): Boolean = !isSimilar(x)
}
Out[139]:
In [140]:
sealed trait Symbol
case class Note(name: String, duration: String, octave: Int) extends Symbol
case class Rest(duration: String) extends Symbol
Out[140]:
In [ ]: