본문 바로가기
언어/Kotlin

[Kotlin 문법 종합] - 자료형 변환, 타입확인 @@@ 수정하기

by 젼젼39 2024. 3. 6.

 

1. 자료형 변환

1) 일반 자료형간의 변환

    (1) 숫자 자료형끼리    =   .to자료형()

    var num1 = 20
    var num2 = 30.2

    var num3 = num2.toInt()
    var num4 = num1.toDouble()

    (2) 문자열 -> 숫자    

@@@@근데 Integer.parseInt 안해도 toInt만 해도 되던데...?? 뭐지 다시보

    var strNum5 = "10"
    var strNum6 = "10.21"

    var num5 = Integer.parseInt(strNum5) 		//int로 변환
    var num6 = strNum6.toDouble() 			//double로 변환

 

2) 객체 자료형간의 변환

    : 상속관계에서 가능

    (1) 업 캐스팅 (부모클래스의 자료형을 가지고 자식클래스의 객체 생성)
                        //하위 클래스의 객체를 상위 클래스의 타입으로 캐스팅

                        - slicing problem이 여기서 나타남...

fun main() {
    println("몇 마리를 생성하시겠습니까?")
    var count = readLine()!!.toInt()
    var birds = mutableListOf<Bird>() 		//Bird 클래스 타입을 받는 리스트 생성

    for(idx in 0..count-1) { 		//총 count번 실행
        println("조류의 이름을 입력해주세요")
        var name = readLine()!!

        // as Bird는 생략가능
        birds.add(Sparrow(name) as Bird) 	//리스트에 자식클래스이름(" ")  //위에서 <Bird>라고 했음
    }
    println("============조류 생성완료============")
    for(bird in birds) {
        bird.fly() 		//birds 안의 bird들을 한번에 출력, but 자식클래스의 이름으로 출력됨
    }
}

open class Bird(name: String) {
    var name: String
    
    init {
        this.name = name
    }
    
    fun fly() {
        println("${name}이름의 조류가 날아요~")
    }
}

class Sparrow(name: String): Bird(name) { }
        if(myJob == "마법사") {
            var myCharacter = Wizard(myName, myAge, myGender, myMoney, myHp, myMp)

            while(true) {
                println("[1] 슬라임동굴, [2] 좀비마을, [3] 캐쉬샵, [4] 종료")
                var selectNumber= inputMyInfo("selectNumber").toString().toInt()

                when(selectNumber) {
                    1 -> {
                        selectWorld(1, myCharacter) 		//myCharacter은 Wizrard의 객체
                    }
                    2 -> {
                        selectWorld(2, myCharacter)
                    }
                    3 -> {
                        openCashShop(myCharacter)
                    }
                    4 -> {
                        println("게임 종료")
                        break
                    }
                    else -> {
                        break
                    }
                }
            }
        }
        
fun selectWorld(selectWorld:Int, myCharacter: Character) { 		//Character로 받음
    if(selectWorld == 1) { // 슬라임 던전
        if(myCharacter is Archer) {
            var slime1 = Slime("초록슬라임", "초록", 30.2, 200, 10)
            slime1.attack()
            myCharacter.windArrow() 			//myCharacter로 다 통일함!!!
            slime1.poison()
        } else if(myCharacter is Wizard) {
            var slime1 = Slime("파랑슬라임", "파랑", 30.2, 200, 10)
            slime1.attack()
            myCharacter.fireBall()
            slime1.poison()
        }
    } else if(selectWorld == 2) { // 좀비 던전

        if(myCharacter is Archer) {
            var zombie1 = Zombie("파랑좀비", "파랑", 142.2, 500, 25)
            zombie1.virus()
            myCharacter.windJump("건물1")

        } else if(myCharacter is Wizard) {
            var zombie1 = Zombie("파랑좀비", "파랑", 142.2, 500, 25)
            zombie1.virus()
            myCharacter.teleport(10, 20)
        }
    }
}

fun openCashShop(character: Character) { 		//Archer, Wizard 등을 Character로 받음
    var cashShop = CashShop.getInstance() 		//싱글톤으로 받는 것은 동일

    if(character is Archer) {
        println("구매전 무기: ${character.weapons}")
        cashShop.purchaseWeapon(character)
        println("구매후 무기: ${character.weapons}")
    } else if(character is Wizard) {
        println("구매전 무기: ${character.weapons}")
        cashShop.purchaseWeapon(character)
        println("구매후 무기: ${character.weapons}")
    }
}

 

    (2) 다운 캐스팅 (자식클래스의 자료형으로 부모클래스의 객체 생성)
                        //상위 클래스의 객체를 하위 클래스의 타입으로 캐스팅    --> as? 를 사용해야 안전함

open class Animal
class Dog : Animal()

fun main() {
    val animal: Animal = Dog() // 업 캐스팅

    // 다운 캐스팅 시도
    val dog = animal as Dog // 오류! ClassCastException 발생 가능
    
    val dog = animal as? Dog
	if (dog != null) {
    	// 다운 캐스팅 성공
	} else {
    	// 다운 캐스팅 실패
	}
}
open class Animal
class Dog : Animal()

fun main() {
    val animal: Animal = Dog()
    if (animal is Dog) {
        val dog: Dog = animal // 다운캐스팅
        println("다운캐스팅 성공: $dog")
    } else {
        println("실패: animal은 Dog 타입이 아님")
    }
}
open class Animal
class Dog : Animal()

fun main() {
    val animal: Animal = Dog()
    val dog: Dog? = animal as? Dog // 안전한 다운캐스팅
    if (dog != null) {
        println("다운캐스팅 성공: $dog")
    } else {
        println("실패: animal은 Dog 타입이 아님")
    }
}

 

fun main() {
    println("몇 마리를 생성하시겠습니까?")
    var count = readLine()!!.toInt()
    var birds = mutableListOf<Bird>()

    for(idx in 0..count-1) {
        println("조류의 이름을 입력해주세요")
        var name = readLine()!!

        birds.add(Sparrow(name) as Bird)
    }
    println("============조류 생성완료============")
    for(bird in birds) {
        bird.fly()
    }
    // 다운캐스팅 오류
    // Sparrow는 Bird가 가져야할 정보를 모두 가지고 있지 않기 때문임
    // ???? 이거보다는 자식클래스의 객체에 부모클래스의 객체를 넣으려고 해서 그런거 아닌가
    //      부모클래스 객체가 가진 정보가 자식클래스의 객체를 생성?하기에 부족해서
    //          (ex. 오버리딩했다거나... 변수나 함수를 추가했다거나)
    //@@@@@@@
//    var s1:Sparrow = birds.get(0)
 
}

 

^^ @@@ 수정하기

 

2. 자료형의 타입 확인

    - if ( 변수 is 자료형)

    : 해당 값이 아니라, 변수의 자료형을 보는것.

if(name is String) {
    println("name은 String 타입입니다")
} else {
    println("name은 String 타입이 아닙니다")
}
class CashShop private constructor() {
// 코드 생략
fun purchaseWeapon(character:Character){
    if(character is Archer) { 		//is 키워드
        character?.run { 		// 확장함수 run
            if(money >= bowPrice) {
                println("[구매 후 금액]: [${money} - ${bowPrice}] = ${money-bowPrice}")
                money -= bowPrice
                weapons.add("슈퍼 활")
            } else {
                println("돈이 부족합니다.")
            }
        }
    } else if(character is Wizard) {
        character?.run {
            if(money >= staffPrice) {
                println("[구매 후 금액]: [${money} - ${staffPrice}] = ${money-staffPrice}")
                money -= staffPrice
                weapons.add("슈퍼 스태프")
            } else {
                println("돈이 부족합니다.")
            }
        }
    }
}

}