[Kotlin공부]코틀린문법정리 : 06 클래스

2021. 3. 3. 12:40프로그래밍 언어/Kotlin 기초

728x90
반응형

6.1 클래스와 설계

  • 그룹화할 수 있는 함수와 변수를 한군데 모아놓고 사용하기 쉽게 이름을 붙여놓은 것
class 클래스명 {
	var 변수
    fun 함수() {
    	// 코드
    }
}

 

class Log {
    var status: Intcompanion objext {
        static fun d(tag: String, msg: String) {
            // 문자열을 출력하는 코드
        }
        static fun e(tag: String, msg: String) {
            // 문자열을 출력하는 코드
        }
    }
}

 

6.2 클래스의 생성

  • 함수 형태로 제공되는 생성자를 호출해야지만 클래스 실행
class Kotlin {
	init {
    	// 생성자가 없으면 아무것도 없는 init 블록이 실행되는 것과 같음
    }
}

⊙ 프라이머리 생성자

class KotlinOne (생략가능)constructor(value: String) {
    // 코드
}

⊙ 세컨더리 생성자

class KotlinTwo {
    constructor (value: String) {
        println("생성자로부터 전달받은 값은 ${value}입니다.")
    }
}

 

6.3 클래스의 사용

  • 클래스 이름에 괄호를 붙여서 클래스의 생성자 호출 : 클래스명() -> constructor 키워드를 직접 호출하지 않음
  • Kotlin클래스의 생성자를 호출한 후 생성되는 것을 인스턴스라고 하는데, 생성된 인스턴스는 변수에 담아둘 수 있음
  • : var kotlin = Kotlin()
  • 생성자에 파라미터가 있으면 값을 입력해야함 :  var one = KotlinOne("value")
class KotlinTwo {
    constructor (value: String) {
        println("생성자로부터 전달받은 값은 ${value}입니다.")
    }
}

var one = KotlinTwo("value")
*** 출력 결과 ***

생성자로부터 전달받은 값은 value입니다.

⊙ 클래스 안에 정의된 함수와 변수 사용하기

class KotlinThree {
    var one: String = "None"
    fun printOne() {
        println("one에 입력된 값은 ${one}입니다")
    }
}

var kotlinThree = KotlinThree();

kotlinThree.one = "new value"
kotlinThree.printOne()
*** 출력 결과 ***

one에 입력된 값은 new value입니다

⊙ 클래스를 인스턴스화 하지 않고 사용하기 : companion object

class KotlinFour {
    companion object {
        var one: String = "None"
        fun printOne() {
            println("one에 입력된 값은 ${one}입니다")
        }
    }
}

KotlinFour.one = "새로운 값"
KotlinFour.printOne()
*** 출력 결과 ***

one에 입력된 값은 새로운 값입니다

 

6.4 데이터 클래스

data class 클래스명 (val 파라미터1: 타입, var 파라미터2: 타입)

⊙ 데이터 클래스의 정의와 생성

data class DataUser (var name: String, var age: Int)
var dataUser = DataUser("Michael", 21)
println("DataUser는 ${dataUser.toString()}")
*** 출력 결과 ***

DataUser는 DataUser(name=Michael, age=21)

⊙ copy() 메서드 지원

var newData = dataUser.copy()

 

6.5 클래스의 상속과 확장

  • 코틀린은 클래스의 재사용을 위해 상속을 지원

⊙ 클래스의 상속

  • 상속 대상이 되는 부모 클래스는 open 키워드로 만들어야만 자식 클래스에서 사용 가능
  • 만약 open 키워드로 열려있지 않은 경우 상속 불가능
  • 상속을 받을 자식 클래스에서는 콜론을 이용해서 상속할 부모 클래스 지정
open class 상속될 부모 클래스 { // 코드 }
class 자식 클래스 (value: String) : 부모 클래스(value) { // 코드 }

⊙ 생성자 파라미터가 있는 클래스의 상속

open class 상속될 부모 클래스 (value: String) { // 코드 }
class 자식 클래스 (value: String) : 부모 클래스(value) { // 코드 }

⊙ 부모 클래스의 프로퍼티와 메서드 사용하기

open class Parent {
    var hello: String = "안녕하세요"
    fun sayHello() {
        println(hello)
    }
}
class Child: Parent() {
    fun myHello() {
        hello = "Hello"
        sayHello()
    }
}

⊙ 프로퍼티와 메서드의 재정의 : 오버라이드

  • 상받은 부모 클래스의 프로퍼티와 메서드 중에 자식 클래스에서는 다른 용도로 사용해야 하는 경우 Override 필요
  • 동일한 이름의 메서드나 프로퍼티를 사용할 필요가 있을 경우 override 키워드를 사용해 재정의

⊙ 메서드 오버라이드

open class BaseClass {
    open fun opened() {
    }
    fun notOpend() {
    }
}
class ChildClass: BaseClass() {
    override fun opened() {
    }
    override fun notOpend() { // notOpend 메서드는 open 키워드가 없으므로 잘못된 사용
    }
}

⊙ 프로퍼티 오버라이드

open class BaseClass2 {
    open var opened: String = "I am"
}
class ChildClass2 : BaseClass2() {
    override var opened: String = "You are"
}

 

⊙ 익스텐션

fun 클래스.확장할 함수() {
	// 코드
}

 

 

728x90
반응형