Kotlin 문법 readLine(), toInt() + 자료형 변환, 조건문, 반복문, 명시적 생성자, 상속

박미소·2023년 12월 4일
0

코틀린

목록 보기
7/44

a. readLine() / toInt()

val a = readLine()!!.toInt()
  • 자료형 변환
    toInt() : Int정수형으로 변환
    toDouble() : Double 실수형으로 변환
    toFloat() : Float 실수형으로 변환
    toLong() : Long 정수형으로 변환
    toString() : 문자열로 변환
  • readLine()!! --> !! 쓰는 이유:
    쓰지 않으면 컴파일러가 빨간 줄을 그어버리기 때문에 추가해야 한다. 오류가 나는 이유는 readLine() 직접 써야 하는 input() 값이 입력되지 않아 NULL값이 들어가 있을 수 있기 때문에 컴파일러가 미리 경고한 것.
    !! == 이 변수는 null값이 아니다.
    ? == null이면 null값을 반환해라.

  • 배열 선언
var names = arrayOf("참새", "꿩", "비둘기)

val 변수명 = arrayOf<자료형/생략>(값1, 값2, 값3)


b. 조건문


  1. if
if (조건1) {
} else if (조건2) {
} else {
}
  1. when
when{ 특정 값
    값1 -> { 
    }2 -> {
    }3 -> {
    }
    else -> {
    }

c. 반복문


1-1. for + ..

for ( i in 1 .. 10) {
    println(i)
} 

1-2. for + until

for ( i in 1 until 10) {
    println(i)
} 

=> for문에서 i 자체가 상수라서 i++증감쓰지 않아도 됨.

until => start 이상 end 미만
.. => start 이상 end 이하


  1. while
var i = 0
while (i < 10) {
    println(i)
    i++
}
  1. for + array
var numbers = arrayOf(1,2,3,4,5,6,7)
for ( i in numbers) {
    if (i == 5) {
        break
    } else {
        continue
    }

=> 5가 되면 for문이 멈추고 1,2,3,4일땐 그 다음의 ++된 i를 실행시킴.

  • break는 가장 가까운 반복문에서 탈출하고 다음 블록으로 넘어간다.
  • continue는 이후의 코드를 실행하지 않는다.


d. 데이터 타입 Unit

Unit은 흔히 함수의 반환 구문이 없다는 것을 표현하기 위해 사용된다.

  • fun myFun1() { }
  • fun myFun2(): Unit { }

위 코드에서 myFun1( ) 함수를 선언했다. 이 함수에는 return 구문이 없다. 딱히 반환할 데이터가 없다는 것. 함수는 함수 선언 부분에 콜론(:)으로 구분해서 함수의 반환 타입을 명시해야 하는데 선언하지 않았다. 그러면 기본으로 Unit으로 선언한 것과 같다. 그러므로 myFun1과 Unit으로 반환 타입을 명시한 myFun2는 선언이 같다. 이처럼 Unit을 반환 타입으로 사용하는 함수는 함수에서 의미 있는 리턴값이 없다는 의미이다.

  • 의미있는 반환값이 없다는 Nothing

Nothing은 의미 있는 데이터가 없다는 것을 명시적으로 선언하기 위해 사용하는 타입이다.


e. 메소드

  • 메소드 내 변수 선언

    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"
        }
    }

checkRank 메소드 return 값의 자료형 선언뿐만 아니라 파라미터 score는 처음 선언되는 변수인데 score:Int로 선언되면서 when절에서 쓰인다.



  • fun main() {}
    main 메소드는 자바의 시작점. 안에 코드가 비어있으면 아무것도 실행되지 않는다.

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
    }
}

클래스 초기 설정에서 변수 선언과 함께 자료형 꼭 써줘야 함.



f. 생성자


  • 명시적 생성자 - Init, 주 생성자
fun main() {
    var magician = Character("타조", "black", 182.0)
}

// 클래스 선언부에 생성자를 명시함

class Character(_name: String, _hairColor: String, _height: Double) {
    var name: String = ""
    var hairColor: String = ""
    var height: Double = 0.0


    // 매개변수를 직접 넘기지않음
    init {
        println("매개변수없는 생성자 실행 완료!")
        var lv = 2
        println(lv)
    }

    fun fireBall() {
        println("파이어볼!")
    }

    fun compositing(device1: String, device2: String): String {
        var device3 = device1 + device2
        println("새로운 무기인 ${device3}입니다")
        return device3
    }
}

매개변수없는 생성자 실행 완료!
2

매개변수를 넣어 객체를 생성하자마자 나오는 초기 설정 값.
init (객체초기화) 블록만 실행됨. 블록 내 프린트 문 두개.


  • 명시적 생성자 - Constructor, 부 생성자
fun main() {
    var magician = Character("타조", "black", 182.0)
//    println(magician.fireBall())
//    magician.compositing("파이썬","자바")
}

// 클래스 선언부에 생성자를 명시함
class Character {
    var name:String = ""
    var hairColor:String = ""
    var height:Double = 0.0
    var age:Int = 0
    var gender:String = ""

    // 매개변수를 직접 넘기지않음
    init {
        println("매개변수없는 생성자 실행 완료!")
        var lv = 2
        println(lv)
        var age = 28
        var gender = "female"
        println(age)
        println(gender)
    }

    // 명시적 생성자 (Constructor)
    // _name, _hairColor, _height와 같이 생성자에 변수를 넘기는 경우에 사용함
    constructor(_name:String, _hairColor:String, _height:Double) {
        println("${_name}을 생성자로 넘겼어요")
        println("${_hairColor}를 생성자로 넘겼어요")
        println("${_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}를 생성자로 넘겼어요")
    }

    fun fireBall() {
        println("파이어볼!")
    }
    fun compositing(device1:String, device2:String): String {
        var device3 = device1 + device2
        println("새로운 무기인 ${device3}입니다")
        return device3
    }
}

주 생성자는 이름, 머리색상, 키만을 가진 값으로 고정된다.
여러 값을 가진 형태로 객체를 만들고 싶다면 constructor를 붙여 부 생성자를 이용한다. 최초 코드에 + a 추가 가능. init 주 생성자 안 초기 값에 부 생성자가 만든 var age:Int = 0 , var gender:String = ""를 설정해두면 주 생성자의 매개변수 3개만 받아도 나이와 성별 기본 값을 가질 수 있다. 클래스 만들 때 init 주 생성자 없이 constructor 부 생성자만 쓸 수 있다.


g. 상속


open 키워드를 활용해서 상속 관계를 만들 수 있다.

부모 클래스의 init 블록 - 생성자가 호출한 시점에 바로 실행된다.


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(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) {

}

새 날아요~
닭 날아요~
참새 날아요~
비둘기 날아요~

init 내 this.name은 var name(프로퍼티)이다. 상위 클래스에 생성자가 있기 때문에 상속받는 하위 클래스도 파라미터에 name을 넣어야 함.



  • 예시. 객체와 인스턴스
fun main(){
    var family = Family("인천")
    var grandma = Grandma("충주")          
    var aunt = Aunt("원주")

    family.weather()
    grandma.weather()
    aunt.weather()
}

open class Family(region: String) {
    var region = ""
    init {
        this.region = region

    }

    fun weather(){
        println("${region} : 추워요.")
    }
}

class Grandma(region: String) : Family(region) {     

}
class Aunt(region: String) : Family(region) {

}

인천 : 추워요.
충주 : 추워요.
원주 : 추워요.

family에 Family객체 생성. 인스턴스화 한 grandma와 aunt가 상속받은 하위(자식) 클래스.

0개의 댓글