App노자

[Kotlin] 생성자, 상속과 다형성 본문

Android/Kotlin

[Kotlin] 생성자, 상속과 다형성

앱의노예 2023. 4. 24. 23:54

1. 클래스란?


class Test() {
    var name: String = ""
    var age: Int = 18
    //프로퍼티

    fun ShowAge() = println("Age: $age")
    fun ShowName() = println("Name: $name")
    //메서드
}

fun main() {
    val Inf = Test()   //클래스의 생성자를 통한 객체의 생성
    Inf.name = "app"   //객체의 프로퍼티에 값 할당

    println("Test.age: ${Inf.age}")   //Test.age: 18
    Inf.ShowName()   //Name: app
}

객체를 생성하는 일종의 틀이며 var나 val로 선언이 가능하다

클래스의 멤버는 생성자, 변수, 함수 클래스로 구성되며 클래스를 선언하려면 class 키워드가 필요하다  

클래스만 작성한다고 해서 메모리에서 만들어지지 않으며 클래스를 이용하여 객체를 생성해야만 프로그램 메모리에 객체가 생성된다

2. 생성자


//주 생성자 선언
class Test constructor(_name: String, _age: Int) {
    //프로퍼티
    var name: String = _name
    var age: Int = _age

    fun ShowAge() = println("Age: $age")
    fun ShowName() = println("Name: $name")
}

fun main() {
    val Inf = Test("app",22)

    Inf.ShowAge()
    Inf.ShowName()
}

객체를 생성할 때 클래스 이름뒤에 사용되는 소괄호()가 클래스로부터 객체를 생성하는 생성자를 의미한다

생성자는 주생성자와 부 생성자(보조 생성자)로 구분되며 그중 주 생성자는  클래스 이름과 함께 생성자 정의를 이용할 수 있는 기법이다

주 생성자는 클래스 이름과 블록 시작 사이에 선언하며 constructor 키워드로 시작한다

constructor는 생략이 가능하며 생성자의 매개변수는 기본값을 사용할 수 있다

 

//constructor 생략
class Test (var name: String, var age: Int) {
    fun ShowAge() = println("Age: $age")
    fun ShowName() = println("Name: $name")
}

fun main() {
    val Inf = Test("app",22)

    Inf.ShowAge()
    Inf.ShowName()
}

내부의 프로퍼티를 생략하고 생성자의 매개변수에 프로퍼티를 작성하는 방식이다

val, var를  사용하여 매개변수를 선언하면 생성자에서 this 키워드를 사용하거나 

언더스코어로 생성자에게 인자를 할당하지 않아도 된다

 

class Test (var name: String, var age: Int) {
    init {
        println("init 키워드 시작")
        println(name)
        println(age)
        println("init 키워드 끝")
    }

    fun ShowAge() = println("Age: $age")
    fun ShowName() = println("Name: $name")
}

fun main() {
    val Inf = Test("app",22)   //객체 생성과 함께 초기화 블록 수행

    Inf.ShowAge()
    Inf.ShowName()
}

init 초기화 블록에서는 출력문이나 메서드 같은 코드를 사용할 수 있다

객체 생성 시점에서 같이 실행된다

 

class Test{
    var name: String
    var age: Int

    constructor(_name: String, _age: Int) {
        name = _name
        age = _age
    }

    fun ShowAge() = println("Age: $age")
    fun ShowName() = println("Name: $name")
}

fun main() {
    val Inf = Test("app",22)

    Inf.ShowAge()
    Inf.ShowName()
}

부 생성자는 클래스의 본문에 constructor 키워드로 선언하는 함수이다

매개변수를 다르게 해서 여러 번 정의할 수 있다

주 생성자와 함께 사용하는 것이 가능하며 언더스코어를 이용해 this키워드를 생략하는 것이 가능하다

3. 상속


class Test() {
    var name: String = ""
    var age: Int = 18
    //프로퍼티

    fun ShowAge() = println("Age: $age")
    fun ShowName() = println("Name: $name")
    //메서드
}

fun main() {
    val Inf = Test()   //클래스의 생성자를 통한 객체의 생성
    Inf.name = "app"   //객체의 프로퍼티에 값 할당

    println("Test.age: ${Inf.age}")   //Test.age: 18
    Inf.ShowName()   //Name: app
}

클래스를 선언할 때 다른 클래스를 참조해서 선언하는 것을 상속(Inheritance)이라고 한다

선언부에 콜론과 함께 상속받을 클래스를 작성하여 사용한다

상속을 이용하면 하위 클래스는 상위 클래스의 내용을 재사용할 수 있다

 

4. 오버로딩


class Test() {
    var name: String = ""
    var age: Int = 18
    //프로퍼티

    fun ShowAge() = println("Age: $age")
    fun ShowName() = println("Name: $name")
    //메서드
}

fun main() {
    val Inf = Test()   //클래스의 생성자를 통한 객체의 생성
    Inf.name = "app"   //객체의 프로퍼티에 값 할당

    println("Test.age: ${Inf.age}")   //Test.age: 18
    Inf.ShowName()   //Name: app
}

 

 

5. 오버라이딩


class Test() {
    var name: String = ""
    var age: Int = 18
    //프로퍼티

    fun ShowAge() = println("Age: $age")
    fun ShowName() = println("Name: $name")
    //메서드
}

fun main() {
    val Inf = Test()   //클래스의 생성자를 통한 객체의 생성
    Inf.name = "app"   //객체의 프로퍼티에 값 할당

    println("Test.age: ${Inf.age}")   //Test.age: 18
    Inf.ShowName()   //Name: app
}

'Android > Kotlin' 카테고리의 다른 글

[Kotlin] 접근제한자  (0) 2023.04.26
[Kotlin] super와 this의 참조  (0) 2023.04.25
[Kotlin] 흐름 제어문과 예외 처리문  (0) 2023.04.08
[Kotlin] 조건문과 반복문  (0) 2023.04.02
[Kotlin] 고차함수와 람다식  (0) 2023.02.14