[Kotlin] Class & Object

이도연·2023년 12월 22일
0

기초 문법

목록 보기
9/10

Class

class House {
  val color: String = "white"
  val numberOfWindows: Int = 2
  val isForSale: Boolean = false

  fun updateColor(newColor: String){...}
  ...
}

Constructor(생성자)

클래스는 생성자(파라미터)를 가지고 있을 수도 없을 수도 있다.

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 클래스에서 파라미터에 변수명을 지정해주면, 모든 인스턴스에 존재하게 됨



Default parameter(기본 매개변수)

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 이다.

클래스 인스턴스는 기본값을 가질 수 있다.
기본값을 사용하여 필요한 생성자 수를 줄일 수 있으며, 기본 매개변수와 필수 매개변수는 혼합 가능



primary constructor (주 생성자)

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 가 파라미터로 존재한다.



Multiple constructor (다중 생성자)

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) 이 호출된다.




properties

class Person(var name: String)
fun main() {
    val person = Person("Alex")
    println(person.name) // 객체 person 에 접근하기 위해서, 객체 뒤에 (.)찍고 속성이름 name 을 적으면 됨
    
    person.name = "Joey" // 값을 설정할 때도 마찬가지.속성 값 변경 가능              
    println(person.name) 
}



get()

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

set()

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

클래스 간 상속은 불가능. 하위 클래스를 사용하려면 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 키워드 불필요)




data class

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)



pair

두 개의 값을 그룹화하는 데 사용

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}

triple

세 개의 값을 그룹화하는 데 사용

val bookAuthorYear = Triple("Harry Potter", "J.K. Rowling", 1997)
println(bookAuthorYear)
println(bookAuthorYear.third)
=> (Harry Potter, J.K. Rowling, 1997)
  1997




0개의 댓글