# 1. Language/🔰 Kotlin

Kotlin # 클래스/상속

둥굴둥굴둥굴레차 2022. 6. 29. 16:42

🎈클래스

 

// 생성자 실습

class User1 constructor(name: String) {
    val userName: String

    init {
        userName = name

        println("init에 출력가능")
    }
}

val user1 = User1("박소현") // 클래스를 호출 -> 인스턴스화
println(user1.userName)

////////////////////////////////////////

class User2 constructor(name: String) {
    val userName: String = name
}

val user2 = User2("박소현2")
println(user2.userName)

////////////////////////////////////////

class User3(name: String) {
    val userName: String = name
}

val user3 = User3("박소현3")
println(user3.userName)

////////////////////////////////////////

class User4(name: String = "박소현4"){ // 기본값이 있는 주생성자
    val userName = name
}

val user4 = User4()
println(user4.userName)

////////////////////////////////////////
// 생성자에서 받는 속성이 복수개인 경우
// Java 스타일
class User5(name: String, age: Int) {
    val name: String
    val age: Int

    init {
        this.name = name
        this.age = age
    }
}

val user5 = User5("박소현5", 5)
println(user5.age)
// 부생성자 (Secondary Constructor)


//실행순서
// 부생성자 호출 -> 부생성자 안의 주생성자 호출 -> init 호출 -> 부생성자 실행
class User1(name: String) {
    var age: Int = 0 //init블럭 안에 들어가있지 않기 때문에 여기서 직접 초기화해줘야 한다.
    var name: String

    init { // 초기화블럭은 클래스가 생성될 때 무조건 실행되기 때문에 무조건 초기화된다.
        // 따라서 초기화블럭에 없는 속성은 선언할 때 초기화해줘야한다.
        this.name = name
        //println 동작함
    }

    // 부생성자
    // - 부생성자는 클래스명 우측에 올 수 없다.
    // - 클래스의 본문에 있어야 한다.
    constructor(name: String, age: Int) : this(name) {
        this.age = age
        //println 동작함
    }
}

val user1 = User1("가나다", 20)
println(user1.name)

///////////////////////////////////////////////////////////////////////////

class User4(name: String, age: Int) {
    var userName: String = name
    var userAge: Int = age

    var gender: String = "여자"

    constructor(name: String, age: Int, gender: String) : this(name, age) {
        this.gender = gender
    }
}

val user4 = User4("박소현", 23, "남자")
println(user4.gender)
// 실습

class Player(uniform: String, ball: String) {
    val uniform: String
    val ball: String

    init {
        this.uniform = uniform
        this.ball = ball
    }

    fun kick() {
        println("공 참")
    }
}

val player = Player("빨간색", "축구공")

println(player.uniform)
player.kick()

///////////////////////////////////////////////////////
class Player2(uniform: String, ball: String) {
    val uniform: String = uniform
    val ball: String = ball


    fun kick() {
        println("공 참")
    }
}

val player2 = Player2("빨간색", "축구공")

println(player2.uniform)
player2.kick()

 

🎈클래스 속성

 

 

// 실습

class Bank {

    fun save(account: Account, money: Int) {
        if (money >= 0) account.balance += money
        else println("마이너스는 예금 불가능")
    }

    fun withdraw(account: Account, money: Int) {
        if (account.checkBalance() >= money) account.balance -= money
        else println("잔액부족")
    }
}

class Account(val initBalance: Int = 0) {
    var balance: Int = 0



    init {
        this.balance = initBalance
    }

    fun checkBalance(): Int {
        return balance
    }
}

val account = Account(1000)
val bank = Bank()

println(account.checkBalance())

bank.save(account, 1000)

println(account.checkBalance())

/////////////////////////////////////////////////////////
class Bank2 {
    fun save(account: Account2, money: Int) {
        if (money >= 0) account.balance += money
        else println("마이너스는 예금할 수 없습니다.")
    }

    fun withdraw(account: Account2, money: Int) {
        if (money <= account.balance) account.balance -= money
        else println("잔액부족")
    }
}

class Account2 {
    var balance: Int = 0

    fun checkBalance() : Int{
        return balance
    }
}

val user2 = Account2()
println(user2.checkBalance())

val bank2 = Bank2()
bank2.save(user2, 333)
println(user2.checkBalance())

bank2.withdraw(user2, 222)

println(user2.checkBalance())

 


🎈 상속

 

// 실습

// 부모클래스
open class Warrior(var name: String, var age: Int) {
    fun attack(){
        println("공격")
    }
}

// 자식클래스 1 -> 주생성자가 부모클래스를 만들어 주는 경우
class DefenceWarrior(name: String, age: Int, height: Int): Warrior(name, age){

    fun defence() {
        println("방어")
    }
}

val defenceWarrior = DefenceWarrior("박소현", 20, 5)
defenceWarrior.defence()
defenceWarrior.attack()

println("//////////////")

// 자식클래스 2 -> 주생성자가 없는 경우
class HardAttackWarrior: Warrior{
    var power: Int = 0
    constructor(name: String, age: Int, power: Int): super(name, age){
        this.power = power
    }
    fun hardAttack(){
        println("강하게 공격")
    }
}

val hardAttackWarrior = HardAttackWarrior("박소현", 20, 50)
hardAttackWarrior.hardAttack()
hardAttackWarrior.attack()
// 오버로딩 -> 사용빈도 낮음

class Sum {
    fun sum(): Int {
        return 10
    }

    fun sum(number1: Int): Int{
        return number1 + 10
    }
    fun sum(number1: Int, number2: Int): Int {
        return number1 + number2 + 10
    }
}

val sum = Sum()
println(sum.sum())
println(sum.sum(10))

// 오버라이딩
open class Warrior(var name: String, var age: Int) {
    open fun attack(){ // 오버라이드 해주기 위해 open시키자
        println("공격")
    }
    open fun getDefencePower() : Int {
        return 10
    }
}

// 자식클래스 1 -> 주생성자가 부모클래스를 만들어 주는 경우
class DefenceWarrior(name: String, age: Int, height: Int): Warrior(name, age){

    fun defence() {
        println("방어")
    }

    override fun attack() {
        super.attack()
    }

    override fun getDefencePower(): Int {
//        return super.getDefencePower()
        val defenceWarrior: Int = super.getDefencePower()
        return defenceWarrior + 5
    }
}

val defenceWarrior = DefenceWarrior("박소현", 39, 12)
defenceWarrior.attack()
// 실습 - 총정리

open class Warrior(name: String, age: Int){
    var userName: String = name
    var userAge: Int = age

    open fun attack(): Int{
        println("공격!!")
        return 10
    }
}

class DefenceWarrior(name: String, age: Int, height: Int): Warrior(name, age){
    var userHeight: Int = height

    fun defence() {
        println("방어..")
    }
}

val defenceWarrior = DefenceWarrior("박소현", 23, 23434)
println(defenceWarrior.userHeight)
println(defenceWarrior.userAge)
println(defenceWarrior.userName)
defenceWarrior.attack()
defenceWarrior.defence()

class HardAttackWarrior: Warrior{
    var power: Int = 0

    constructor(name: String, age: Int, power: Int ): super(name, age){
        this.power = power
    }

    fun hardAttack(){
        println("강하게 공격")
    }

    override fun attack(): Int {
        val attack: Int = super.attack()
        return attack + 10
    }
}

val hardAttackWarrior = HardAttackWarrior("박", 24, 4555)
hardAttackWarrior.hardAttack()
hardAttackWarrior.attack()