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("돈이 부족합니다.")
}
}
}
}
}
'언어 > Kotlin' 카테고리의 다른 글
[Kotlin 문법 종합] - 확장함수, 비동기 프로그래밍 @@@수정하기 (2) | 2024.03.06 |
---|---|
[Kotlin 문법 종합] - 여러 인스턴스 리턴, 자신의 객체 전달 @@수정하기 (0) | 2024.03.06 |
[Kotlin 문법 종합] - Single-expression function, 싱글턴 (@@질문하기) (1) | 2024.03.06 |
[Kotlin 문법 종합] - 널 세이프티 @@수정하기 (0) | 2024.03.06 |
[Kotlin 문법 종합] - 지연 초기화 (@@0313 추가중~) (0) | 2024.03.06 |