오늘은 코드카타라는걸 해봤는데, 아무리해도 틀렸다고만 나와서 골머리를 싸메다가 코틀린 문법을 쓰고 있었는데 세팅이 c언어로 되어 있는걸 발견했다. 이런건 미리 알려줘야 하는거 아닌가? 결국 또 시간만 날리는 결과가 되어버렸다..
반복문
for, while가 있음
for은 안에있는 숫자에서 숫자까지 반복이란 뜻으로, 예를들자면,
내 이름을 for로 10번 반복시킨다고 하면
for(i in 1..10) {
println("${i}번째: 내 이름은 참새")
}
그걸 while로 하면,
var i = 0
while(i < 10) {
println("${i}번째: 내 이름은 참새")
i++
}
i를 0으로 하고 10보다 작을때까지 반복, 그리고 밑에 i가 1씩 증가하도록 해서 10번 반복을 만들수있다.
1에서 10으로 하려면
while(i < 10) {
println("${i+1}번째: 내 이름은 참새")
i++
이래도 된다. 사족으로, for엔 ..대신 until을 쓸수있는데, 그건 미만 이란 뜻이라 0..9는 0에서 9가지 출력되지만 until은 0에서 8까지 나옴
break알아보기 이건 중단이란뜻
for(i in 1..10){
if (i==3) break
println(i)}
} 그러면 1 2까지 나옴
Continue는 그거 빼고 지속
for(i in 1..10){
if (i==3) continue
println(i)} 이러면 1245678910 3빼고 다
그리고 배열은 = arrayOf("꿩", "닭", "참새", "오목눈이", "공작새")
이런식으로
전화번호부에서 이름이 “참새”인 사람을 찾을때까지 한명씩 조회하고 비교하는법
var infos = arrayOf("꿩", "닭", "참새", "오목눈이", "공작새")
for(info in infos) {
if(info == "참새") {
println("찾았다 참새!")
break
} else {
continue
}
}
이러면 참새가 될때까지 컨티뉴가 넘겨버리고 참새가 되면 정지하고 메시지 출력
고양이가 배고프면 사료 10번 줘서 배부르게 만들기
var catStatus = false
println("고양이는 매우 배고픕니다..")
println("사료를 10번 먹여주세요")
// 고양이가 현재 배고프니까(false) 사료 배급가능
if(catStatus == false) {
for(idx in 0..9) {
println("${idx}번째: 냠냠")
}
}
// 사료를 10번 준 이후의 상태변화
catStatus = true
if(catStatus == true) {
println("배부른 고양이입니다")
}
false상태에서 사료를 주고, 9에 도달하면 true가 되어 배부른 고양이
게임만들기
val worldName = "스코월드"
var myName = readLine()
var myAge = readLine()!!.toInt()
var myJob = readLine()
var isNamePass = true
var isAgePass = true
var isJobPass = true
var names = arrayOf("참새", "꿩", "비둘기")
for(name in names) {
if(myName == name) {
println("중복된 이름이 존재합니다.")
isNamePass = false
break
}
}
if(myAge < 12) {
println("12세 미만은 이용할 수 없습니다.")
isAgePass = false
}
if(myJob == "전사") {
println("일시적으로 전사를 이용할 수 없습니다.")
isJobPass = false
}
// 모든 조건을 통과한 경우에만 환영
if(isNamePass && isAgePass && isJobPass) {
println("==================${worldName}에 오신것을 환영합니다==================")
println("당신의 정보는 다음과 같습니다.")
println("이름: ${myName}입니다.")
println("나이: ${myAge}입니다.")
println("직업: ${myJob}입니다.")
println("모험을 떠나 볼까요?")
}
밑의 화면에 이름, 나이 직업을 입력하면 됨. 하지만 참새, 꿩,비둘기는 중복된 이름이라고 출력, 12세 이하도, 전사도 메시지 출력하며 정지. 하지만 그것들을 피하면 환영 메시지가 뜨는식
예를들면, 개, 40, 마법사라 하면
당신의 정보는 다음과 같습니다.
이름: 개입니다.
나이: 40입니다.
직업: 마법사입니다.
모험을 떠나 볼까요?
밑에서 입력한 숫자로 덧셈하는법
fun main() {
var num1 = readLine()!!.toInt()
var num2 = readLine()!!.toInt()
// sum이라는 이름의 메소드를 호출!
sum(num1, num2)
}
fun sum(num1:Int, num2:Int) {
var result = num1 + num2
println("num1과 num2의 덧셈결과는 ${result}입니다.")
}
숫자 두개 입력하면 자동 덧셈
오늘의 정보 출력하기
fun main() {
// displayInfo라는 이름의 메소드를 호출!
displayInfo()
}
fun displayInfo() : Unit {
println("오늘의 날씨는 화창합니다")
println("오늘은 검정색을 조심하세요")
}
fun main은 없어선 안됨 main이 displayInfo를 활성화
수학점수에 따라 등급 출력
fun main() {
var myMathScore = readLine()!!.toInt()
var myRank = checkRank(myMathScore)
println("나의 등급은 : ${myRank}")
}
fun checkRank(score:Int) : String {
return when(score) {
in 90..100 -> return "A"
in 80..89 -> return "B"
in 70..79 -> return "C"
else -> return "D"
}
}
클래스의 종류
클래스엔 여러 종류가 있음
1. data class: 유용한 메소드를 자동으로 만들어줘요
A. hashCode(): 객체를 구분하기 위한 고유값을 리턴해줘요
B. eauals(): 동일한 객체인지 비교해서 true 또는 false를 리턴해줘요
C. copy(): 현재 객체의 모든 정보를 복사해서 새로운 객체를 리턴해줘요
D. toString(): 현재 객체의 모든 정보(프로퍼티)를 예쁘게 출력해줘요
E. getXXX()/setXXX(매개변수): 변수의 값을 리턴하거나 설정해줘요
형태는 data class 클래스이름 {
정보1
정보2}
2. sealed class
클래스 상속과 관련된 개념이예요
상속받을 수 있는 자식클래스들을 미리 정의할 수 있어요
무분별한 상속을 방지할 수 있어요
컴파일 시점에 생성할 수 있는 자식을 알 수 있기때문에 효율적으로 다형성을 구현해요
sealed class 부모클래스 {
class 자식클래스1 : 부모클래스생성자
class 자식클래스2 : 부모클래스생성자
}
3. object class
자바의 static 대신사용. 자세한건 나중에
클래스의 사용 이유
캐릭터의 정보는 이거다! 게임배경의 정보는 이거다!를 따로 작성 가능
fun main() {
}
class Character {
var name:String = ""
var hairColor:String = ""
var height:Double = 0.0
fun fireBall() {
println("파이어볼!")
}
fun compositing(device1:String, device2:String): String {
var device3 = device1 + device2
println("새로운 무기인 ${device3}입니다")
return device3
}
}
이런식으로 클래스가 정보를 저장해줌
클래스에는 반드시 생성자가 필요함. 주 생성자는 init, 부 생성자는 constructor
주생성자는 하나만, 보조 생성자는 여러 개를 실행할 때 사용
fun main() {
// 불마법사로 객체화
var magicianOne = Character("불마법사", "red", 180.2)
println("${magicianOne.name}의 머리색상은 ${magicianOne.hairColor}입니다")
magicianOne.fireBall()
// 냉마법사로 객체화
var magicianTwo = Character("냉마법사", "blue", 162.2, 25, "여")
println("${magicianTwo.name}의 머리색상은 ${magicianTwo.hairColor}이고 나이는 ${magicianTwo.age}입니다.")
magicianTwo.fireBall()
}
class Character {
var name:String = ""
var hairColor:String = ""
var height:Double = 0.0
var age:Int = 0
var gender:String = ""
// 명시적 생성자 (Constructor)
// _name, _hairColor, _height와 같이 생성자에 변수를 넘기는 경우에 사용함
constructor(_name:String, _hairColor:String, _height:Double) {
println("${_name}을 생성자로 넘겼어요")
println("${_hairColor}를 생성자로 넘겼어요")
println("${_height}를 생성자로 넘겼어요")
name = _name
hairColor = _hairColor
height = _height
}
// _name, _hairColor, _height, _age, _gender와 같이 생성자에 변수를 넘기는 경우에 사용함
constructor(_name:String, _hairColor:String, _height:Double, _age:Int, _gender:String) {
println("${_name}을 생성자로 넘겼어요")
println("${_hairColor}를 생성자로 넘겼어요")
println("${_height}를 생성자로 넘겼어요")
println("${_age}를 생성자로 넘겼어요")
println("${_gender}를 생성자로 넘겼어요")
name = _name
hairColor = _hairColor
height = _height
age = _age
gender = _gender
}
fun fireBall() {
println("파이어볼!")
}
fun compositing(device1:String, device2:String): String {
var device3 = device1 + device2
println("새로운 무기인 ${device3}입니다")
return device3
}
}
이렇게하면 클래스 캐릭터를 컨스트럭터가 실체화 시켜준다.
var magicianOne = Character("불마법사", "red", 180.2)
이건 =이게 오른쪽을 왼쪽으로 넘겨주기에 매지션원은 불마법사 red 180.2가 되고
캐릭터이므로 밑의 클래스 캐릭터로 이동, 주어진 값이 세개라서 컨스트럭터중 위에 있는것과 연결, 이름, 머리카락, 키의 정보를 위의 클래스로 넘기고 출력할수 있게 됨. 그리고 파이어볼을 출력하라 되어있으니
불마법사을 생성자로 넘겼어요
red를 생성자로 넘겼어요
180.2를 생성자로 넘겼어요
불마법사의 머리색상은 red입니다
파이어볼! 이라고 출력
밑에있는녀석은 다른 컨스트럭터로 가서 똑같이 반복
냉마법사을 생성자로 넘겼어요
blue를 생성자로 넘겼어요
162.2를 생성자로 넘겼어요
25를 생성자로 넘겼어요
여를 생성자로 넘겼어요
냉마법사의 머리색상은 blue이고 나이는 25입니다.
파이어볼! 이렇게 됨
좀비 클래스 만들기. 아예 클래스 파일을 따로 만든후
class Zombie {
var name:String = ""
var color:String = ""
var height:Double = 0.0
var hp:Int = 0
var damage:Int = 0
constructor(_name:String, _color:String, _height:Double, _hp:Int, _damage:Int) {
println("${name}좀비 생성")
name = _name
color = _color
height = _height
hp = _hp
damage = _damage
}
fun attack() {
println("물어뜯기 공격!")
}
fun virus() {
println("바이러스 퍼뜨리기!")
}
}
이런식으로 좀비, 슬라임, 아처, 위저드 이렇게 클래스를 만들고
package com.example.myapplication
fun main() {
val worldName = "스코월드"
println("이름을 입력해주세요")
var myName = readLine()!!
println("나이를 입력해주세요")
var myAge = readLine()!!.toInt()
println("직업을 입력해주세요")
var myJob = readLine()!!
println("성별을 입력해주세요")
var myGender = readLine()!!
println("초기자본을 입력해주세요")
var myMoney = readLine()!!.toInt()
println("초기체력 입력해주세요")
var myHp = readLine()!!.toInt()
var myMp = 0
var isNamePass = true
var isAgePass = true
var isJobPass = true
var names = arrayOf("참새", "꿩", "비둘기")
for(name in names) {
if(myName == name) {
println("중복된 이름이 존재합니다.")
isNamePass = false
break
}
}
if(myAge < 12) {
println("12세 미만은 이용할 수 없습니다.")
isAgePass = false
}
if(myJob == "전사") {
println("일시적으로 전사를 이용할 수 없습니다.")
isJobPass = false
}
// 모든 조건을 통과한 경우에만 환영
if(isNamePass && isAgePass && isJobPass) {
displayInfo(worldName, myName, myAge, myJob)
if(myJob == "마법사") {
println("마법사는 초기 mp도 입력해주세요")
myMp = readLine()!!.toInt()
var myCharacter = Wizard(myName, myAge, myGender, myMoney, myHp, myMp)
println("던전을 선택해주세요")
println("[1] 슬라임동굴, [2] 좀비마을")
var selectWorld = readLine()!!.toInt()
selectWorldByWizard(selectWorld, myCharacter)
} else if(myJob == "궁수") {
println("궁수를 선택했군요")
var myCharacter = Archer(myName, myAge, myGender, myMoney, myHp)
println("던전을 선택해주세요")
println("[1] 슬라임동굴, [2] 좀비마을")
var selectWorld = readLine()!!.toInt()
selectWorldByArcher(selectWorld, myCharacter)
}
}
}
fun displayInfo(worldName:String, myName:String, myAge:Int, myJob:String) {
println("==================${worldName}에 오신것을 환영합니다==================")
println("당신의 정보는 다음과 같습니다.")
println("이름: ${myName}입니다.")
println("나이: ${myAge}입니다.")
println("직업: ${myJob}입니다.")
println("모험을 떠나 볼까요?")
}
fun selectWorldByArcher(selectWorld:Int, myCharacter: Archer) {
if(selectWorld == 1) { // 슬라임 던전
var slime1 = Slime("초록슬라임", "초록", 30.2, 200, 10)
slime1.attack()
myCharacter.windArrow()
} else if(selectWorld == 2) { // 좀비 던전
var zombie1 = Zombie("파랑좀비", "파랑", 142.2, 500, 25)
zombie1.virus()
myCharacter.windJump("건물1")
}
}
fun selectWorldByWizard(selectWorld:Int, myCharacter: Wizard) {
if(selectWorld == 1) { // 슬라임 던전
var slime1 = Slime("초록슬라임", "초록", 30.2, 200, 10)
slime1.attack()
myCharacter.attack()
} else if(selectWorld == 2) { // 좀비 던전
var zombie1 = Zombie("파랑좀비", "파랑", 142.2, 500, 25)
zombie1.virus()
myCharacter.fireBall()
}
}
이걸 새로 만들면 슬라임,좀비,아쳐,마법사의 따로 만들어 놓은 클래스들이 전부 이곳에 연결됨
그리고 println의 순서대로 정보 입력
이름을 입력해주세요
이름
나이를 입력해주세요
15
직업을 입력해주세요
마법사
성별을 입력해주세요
남
초기자본을 입력해주세요
1000
초기체력 입력해주세요
100
==================스코월드에 오신것을 환영합니다==================
당신의 정보는 다음과 같습니다.
이름: 이름입니다.
나이: 15입니다.
직업: 마법사입니다.
모험을 떠나 볼까요?
마법사는 초기 mp도 입력해주세요
200
마법사 생성
던전을 선택해주세요
[1] 슬라임동굴, [2] 좀비마을
1
초록슬라임슬라임 생성
점성 공격!
에너지 볼!
이런식으로 작동
상속: 상위 클래스를 만들고 밑에 하위클래스를 만들어 종속시킴. 장점으론 내용 변경할때 고쳐야 하는걸 줄일수있음.
예시
fun main() {
var bird = Bird()
var chicken = Chicken()
var sparrow = Sparrow()
var pigeon = Pigeon()
bird.fly()
chicken.fly()
sparrow.fly()
pigeon.fly()
}
open class Bird {
fun fly() {
println("새는 날아요~")
}
}
class Chicken : Bird() {
}
class Sparrow : Bird() {
}
class Pigeon : Bird() {
open class가 부모 class 새이름 이게 자식
이러면 println은 부모에게만 있는데 새는 날아요 메시지는 모든 새들에게 반복되서
새는 날아요~
새는 날아요~
새는 날아요~
새는 날아요~
라고 나옴
un main() {
var bird = Bird("새")
var chicken = Chicken("닭")
var sparrow = Sparrow("참새")
var pigeon = Pigeon("비둘기")
bird.fly()
chicken.fly()
sparrow.fly()
pigeon.fly()
}
open class Bird(name:String) {
var name: String = ""
init {
// this는 현재 클래스의 상태변수를 의미합니다
// var name: String = ""
this.name = name
}
fun fly() {
println("${name} 날아요~")
}
}
class Chicken(name: String) : Bird(name) {
}
class Sparrow(name: String) : Bird(name) {
}
class Pigeon(name: String) : Bird(name) {
}
이러면 부여된 이름으로 날아요가 출력됨.
오버라이딩
자식 클래스에게 개성을 주고 싶을때 사용. 쓰고싶으면 자식 클래스에서 Controll o누르면 됨
위에 있는 녀석을 오버라이드로 개성을 주면?
fun main() {
var bird = Bird("새")
var chicken = Chicken("닭", 2)
var sparrow = Sparrow("참새", "갈색")
var pigeon = Pigeon("비둘기", "서울")
bird.fly()
chicken.fly()
sparrow.fly()
pigeon.fly()
}
open class Bird(name:String) {
var name: String = ""
init {
// this는 현재 클래스의 상태변수를 의미합니다
// var name: String = ""
this.name = name
}
open fun fly() {
println("${name}은 날아요~")
}
}
class Chicken(name: String, age: Int) : Bird(name) {
var age:Int = 0
init {
this.age = age
}
override fun fly() {
// super객체는 부모의 객체를 의미하며 자동으로 생성됨
// 즉 부모객체의 fly메소드를 부르는 행위임
// 필요없으니 주석처리완료
// super.fly()
println("${age}살의 ${name}가 날아봅니다~ 꼬끼오!")
}
}
class Sparrow(name: String, color: String) : Bird(name) {
var color:String = ""
init {
this.color = color
}
override fun fly() {
// super객체는 부모의 객체를 의미하며 자동으로 생성됨
// 즉 부모객체의 fly메소드를 부르는 행위임
// 필요없으니 주석처리완료
// super.fly()
println("${color}의 ${name}이 날아봅니다~ 짹짹!")
}
}
class Pigeon(name: String, address: String) : Bird(name) {
var address: String = ""
init {
this.address = address
}
override fun fly() {
// super객체는 부모의 객체를 의미하며 자동으로 생성됨
// 즉 부모객체의 fly메소드를 부르는 행위임
// 필요없으니 주석처리완료
// super.fly()
println("${address} 살고있는 ${name}가 날아봅니다~ 구구!")
}
}
바꾸고 싶은 자식 클래스 안에서 override 넣고 새로 println("넣고싶은 내용")
오버로딩: 같은 이름의 메소드 여러개 만들기
fun main() {
var calc = Calculator()
var intResult = calc.add(1,2)
var doubleResult = calc.add(1.2, 2.2)
println("정수 덧셈결과: ${intResult}")
println("실수 덧셈결과: ${doubleResult}")
}
class Calculator {
fun add(num1: Int, num2: Int): Int {
return num1+num2
}
fun add(num1: Double, num2: Double): Double {
return num1+num2
}
}
여기에서
fun add(num1: Int, num2: Int): Int { return num1+num2 }
fun add(num1: Double, num2: Double): Double { return num1+num2}
둘다 똑같은 add지만 각각 정수, 실수를 다루기에 다르다 이런걸 할때 오버로딩이 쓰임
인터페이스란?
인터페이스는 어느 클래스에서 나머지는 다른 클래스와 같은데 혼자서만 다른점이 있을때 사용.
예를들면, 새들의 클래스에서 오리만 수영이 가능한 경우, 오리에만 따로 수영의 인터페이스를 추가하는것.
주로 그냥 이름만 있는 추상 메소드에 쓰인다,
인터페이스를 만드려면 먼저 새로 만들기로 인터페이스를 따로 만든 뒤 거기에 추가할것을 집어 넣으면 된다. 예를 들자면,
interface WaterBirdBehavior {
fun swim()
이걸 인터페이스를 만들어 집어 넣은 뒤,
fun main() {
var bird = Bird("새")
var chicken = Chicken("닭")
var sparrow = Sparrow("참새")
var pigeon = Pigeon("비둘기")
var duck = Duck("오리")
bird.fly()
chicken.fly()
sparrow.fly()
pigeon.fly()
duck.swim()
}
open class Bird(name:String) {
var name: String = ""
init {
// this는 현재 클래스의 상태변수를 의미합니다
// var name: String = ""
this.name = name
}
fun fly() {
println("${name} 날아요~")
}
}
class Chicken(name: String) : Bird(name) {
}
class Sparrow(name: String) : Bird(name) {
}
class Pigeon(name: String) : Bird(name) {
}
class Duck(name: String) : Bird(name), WaterBirdBehavior {
override fun swim() {
println("${name}가 수영해요~")
}
}
이러면 인터페이스를 잘 받아와서 남들이 날아다닐때 수영을 하게 된다.