class House {
val color: String = "white"
val numberOfWindows: Int = 2
val isForSale: Boolean = false
fun updateColor(newColor: String){...}
...
}
클래스는 생성자(파라미터)를 가지고 있을 수도 없을 수도 있다.
class A {
val aa = A()
}
// A 클래스에는 파라미터 없음
class B(x: Int) {
val bb = B(12)
println(bb.x)
}
// B 클래스에서 파라미터에 변수명을 지정해주지 않으면, 컴파일 에러(생성자 내에서만 유효하기 때문)
class C(val y: Int)
val cc = C(42)
println(cc.y)
=> 42
// C 클래스에서 파라미터에 변수명을 지정해주면, 모든 인스턴스에 존재하게 됨
class Box(val length: Int, val width:Int = 20, val height:Int = 40)
val box1 = Box(100, 20, 40)
val box2 = Box(length = 100)
val box3 = Box(length = 100, width = 20, height = 40)
// Box class 의 기본 매개변수는 width, height 이다.
클래스 인스턴스는 기본값을 가질 수 있다.
기본값을 사용하여 필요한 생성자 수를 줄일 수 있으며, 기본 매개변수와 필수 매개변수는 혼합 가능
class Circle(i: Int) {
init {
...
}
}
class Circle {
constructor(i: Int) {
...
}
}
class Square(val side: Int) {
init {
println(side * 2)
}
}
val s = Square(10)
=> 20
Square 클래스 내에 기본 생성자 side 가 파라미터로 존재한다.
class Circle(val radius:Double) {
constructor(name:String) : this(1.0)
constructor(diameter:Int) : this(diameter / 2.0) {
println("in diameter constructor")
}
init {
println("Area: ${Math.PI * radius * radius}")
}
}
val c = Circle(3)
변수 c의 Circle(3) 을 통해 Circle 클래스의 diameter 가 호출되고, "in diameter constructor" 가 출력. diameter 는 3 / 2.0 = 1.5 로 radius 로 간다.
init 블록 통해 3.14 1.5 1.5 의 결과 출력.
변수 c의 Circle 인수에 문자열을 넣을 시 constructor(name:String) 이 호출된다.
class Person(var name: String)
fun main() {
val person = Person("Alex")
println(person.name) // 객체 person 에 접근하기 위해서, 객체 뒤에 (.)찍고 속성이름 name 을 적으면 됨
person.name = "Joey" // 값을 설정할 때도 마찬가지.속성 값 변경 가능
println(person.name)
}
class Person(val firstName: String, val lastName:String) {
val fullName:String
get() {
return "$firstName $lastName"
}
}
val person = Person("John", "Doe")
println(person.fullName) // .fullName 을 통해 속성 호출하면 get() 블록 실행. $firstName $lastName 반환
=> John Doe
class Person(var firstName: String, var lastName: String) {
var fullName: String = ""
get() = "$firstName $lastName"
set(value) {
val components = value.split(" ") // 문자열 value 를 공백 기준으로 분리, 분리된 부분을 'component' 배열에 저장
firstName = components[0] // 첫번째 분리조각(firstName)
lastName = components[1] // 두번째 " (lastname)
field = value // 속성의 실제 값을 저장하는 키워드
}
}
fun main() {
val person = Person("Jane", "Smith")
println(person.fullName)
}
변수 person 에서 초기값으로 Jane이 firstName, Smith 가 lastName 에 할당
person.fullName 호출 시,
get() 실행되어 firstName 과 lastName 을 조합한 Jane Smith 반환
interface Shape {
fun computeArea() : Double
}
class Circle(val radius:Double) : Shape {
override fun computeArea() = Math.PI * radius * radius // 인터페이스 Shape 를 구체적으로 구현
}
val c = Circle(3.0)
println(c.computeArea())
=> 28.274333882308138
Circle 클래스는 Shape 인터페이스를 구현하며, 주생성자 radius 속성을 받음.
클래스 간 상속은 불가능. 하위 클래스를 사용하려면 open 사용
class A {
class B : A
}
=>Error: A is final and cannot be inherited from
클래스 선언
open class C
서브 클래스
class D : C()
// 추상 클래스 내의 프로퍼티도 추상화를 시켜야함. 추상 프로퍼티는 하위클래스에서 반드시 구현!
abstract class Food { // Food 는 추상클래스
abstract val kcal : Int // 추상 프로퍼티
abstract val name : String // 추상 프로퍼티
fun consume() = println("I'm eating ${name}")
}
//
class Pizza() : Food() { // Pizza 클래스는 Food 추상 클래스를 상속받음
override val kcal = 600 // 추상 프로퍼티 kcal 구현하여 값 제공
override val name = "Pizza" // "
}
fun main() {
Pizza().consume() // Pizza 클래스 인스턴스 생성하고 consume 호출
}
추상클래스는 하위클래스로 분류된다. (open 키워드 불필요)
define data clas
data class Player(val name: String, val score: Int)
Use
val firstPlayer = Player("Lauren", 10)
println(firstPlayer)
val secondPlater = Player("Courtois", 30)
println(goalKeeper)
=> Player(name=Lauren, score=10)
Player(name=Courtois, score=30)
두 개의 값을 그룹화하는 데 사용
val bookAuthor = Pair("Harry Potter", "J.K. Rowling")
println(bookAuthor)
=> (Harry Potter, J.K. Rowling)
to 함수를 사용하여 Pair를 만들 수 있다.
val bookAuth1 = "Harry Potter".to("J. K. Rowling")
val bookAuth2 = "Harry Potter" to "J. K. Rowling"
=> Harry Potter, J. K. Rowling
컬렉션에서 키-값 쌍을 표현할 때도 사용
val map = mapOf(1 to "x", 2 to "y", 3 to "zz")
=> {1=x, 2=y, 3=zz}
세 개의 값을 그룹화하는 데 사용
val bookAuthorYear = Triple("Harry Potter", "J.K. Rowling", 1997)
println(bookAuthorYear)
println(bookAuthorYear.third)
=> (Harry Potter, J.K. Rowling, 1997)
1997