본문 바로가기
카테고리 없음

Kotlin언어 [화면출력, 자료형, 변수, 연산자, 제어문 등]

by EUN-JI 2023. 10. 19.
//문법적 주요 특징
//a. 문장의 끝을 나타내는 ; 사용안함. 써도 무관
//b. 변수를 만들 때 자료형을 명시하지 않음. var, val 키워드 사용. 단, 자료형은 존재함.
//c. 객체를 생성할 때 new 키워드 사용하지 않음. ex)new String()  --> String()
//d. 안전하게 null을 다룰 수 있는 문법을 제공함 **
//e. 코틀린은 함수형 언어. 즉, 함수를 객체처럼 생각해서 변수에 저장하고 파라미터로 넘겨주는 등의 작업이 가능.

//#. 프로그램의 시작함수 main함수가 반드시 있어야 함.
fun main(){

    //1. 화면출력: println(),print()
    print(10)
    print(3.14)
    print("hello")

    println()
    println(10)
    println(10.5)
    println(true)
    println('a')
    println("sam")
    println("5+3")
//    println(10,20) //error

    var a:Int=10
    println(a)
    println("a")
    var b:String= ("hello")
    println(b)
    println()
    ////////////////////////////////////////////////////////

    //2. 자료형과 변수
    //*코틀린 자료형의 종류
    //1)기초 타입 : Blloean, Byte, Char, Short, Int, Long, Float, Double[코틀린은 모든 변수가 참조형]
    //2)참조 타입 : String, Any(자바의 Object와 비슷 -최상위 클래스), Unit.......그 외 Kotlin APIs, JAVE APIs도 쓸수있음

    //* 변수의 2가지 종류 : var, val
    //2.1) var [값 변경이 가능한 변수]
    var num:Int =10
    println(num)

    var num2:Double=3.14
    println(num2)

    var  num3:Float
    num3=5.24F
    println(num3)

    //변수이므로 값 변경 가능
    num=20
    num2=1.12
    num3=4.67F
    println(num)
    println(num2)
    println(num3)

    //자료형이 고정되어 있기에 다른 자료형값을 대입 불가능
    //ex)num=3.14 //ERROR
    //num2= 50  코틀린은 에러 //자바는 됨

    //그럼에도 혹시 강제로 대입하고 싶다면 형변환하면 됨 type cast  [  . toXXX() ]- 기초타입만 가능함
    num=3.14.toInt()
    num2=50.toDouble()
    println(num)
    println(num2)

    var s:String="hello"
    println(s)

//    var s2:String= String("Hello") //error - 문자열객체는 그냥 ""로만 생성함
    s="nice"
    println(s)
    println()

    //2.2) val [값 변경이 불가능한 변수 - 읽기전용변수라고 부르기도 함]
    val n1:Int= 100
//    n1= 200 //errorr
    println(n1)

    val n2:Boolean= true
//    n2=false
    println(n2)
    println()

    //##var, val 사용 팁  : 데이터를 저장하는 변수는 var [(ex) name,age,title..값을 가지는 것들], 객체를 참조하는 변수val[(ex)TextView tv, Button btn...]


    //2.3) Any타입  - 코틀린의 최상위 자료형 [모든 객체를 참조할 수 있음]
    var v:Any
    v=10
    println(v)

    v=3.14
    println(v)

    v="hello"
    println(v)
    println()

//    v=20  권장안함
//    var w:Int=v //error


    //2.4) null값에 대한 저장 가능 여부 - nullable variable
//    var nn:Int =null //error  [non nullable variable]
    var nn:Int? =null   //nullable variable
    println(nn)

    //nullable 변수를 사용할 때.. 문법
    var ss:String?= "hello"
//    println(ss.length)  //자료형이 String? 이므로 null일 수도 있으니 .length의 오류가능성이 있기에 문법으로 막았음
    //null safety 연산자  ?.
    println(ss?.length)   //nul이면 그냥 null이 출력됨.
    println()

    //2.5)자료형의 자동 추론기능.. [값에 따라 변수의 자료형이 결정됨]
    var no= 10  //Int로 추론됨
    println(no)

//    no=3.14 //error  -- 이미 Int로 추론되어 만들어진 변수임[정적타입언어]   //파이썬 자바스크립트 [동적타입]
    var sss="hello"  //String으로 추론
    println(sss)

    //  ### 화면출력의 format 만들기################################################
    println("hello"+"kotlin")  //문자열데이터는  + 결합연산자됨

    //숫자타입은 String과 결합 안될 수도 있음.
//    println(10+"aaa")  //errror
    println("aaa"+10)  //ok  "aaa10"
    //즉 결합연산의 시작은 반드시 문자열!!

    //연습
    var nn1 =50 //Int
    var nn2=30  //Int
    println(""+nn1+"+"+"="+(nn1+nn2))  //"50 + 30=80" 이 포멧으로 출력하기
    println(nn1.toString()+"+"+"="+(nn1+nn2))

    //위 2가지 모두 가독성 떨어짐. .
    println("$nn1+$nn2= ${nn1+nn2}")
    //이렇게 $변수명을 사용하는 것을 [문자열 탬플릿] 이라고 부름

    var name="sam"
    var age=20
    println("이름: $name \n나이 : $age")

}

 

fun main(){
    //3. 연산자 - 자바와 거의 같음.
    println(10+3.14)
    //숫자가 아닌 자료형과는 덧셈 불가
//    println(10+true)  //error
//    println(10+'A')//error  - Char은 Number타입이 아님

    //is 연산자
    var a:Any

    a=10
    a="sam"
    if (a is Int) println("a는 Int형 값을 저장하고 있음")
    if (a is String) println("a는 String형 값을 저장하고 있음")

    //is의 조금 특별한 기능
    class Person{
        var name:String="sam"
        var age=20
    }
    var p:Person=Person()
    println(p.name)

    var obj:Any
    obj=Person()
//    println(obj.name) //편집기에서 name멤버변수의 존재를 모름.. 되긴 됨.

    if (obj is Person){  //별도의 형변환 없어도 ..조건이 true이기에 편집기로 person임을 인식함.
        println(obj.name)
    }

    //비트 연산자 없어짐. [& | ~ ^]     &&  ||  ! 이건됨
    //대신 비트연산 키워드가 등장 and, or
//    println(7&5)
    println(7 and 5)
    println()

    //4. 제어문은 다소 많이 다름
    //코틀린의 제어문 종류 : if, when, while, for [switch 가 없어짐 ==when으로 대체됨]

    //4.1) if와 삼항연산자의 결합
//    var s= (10>5)? "hello" :"nice"  //삼항연산자 문법이 없어짐
    var s=if (10>5) "hello" else "nice"

    //코틀린 if의 특징 - 조건에 따른 코드결과값을 대입할 수 있음.
    s=if (10>5){  //값이 여러개면 마지막값이 결과값
        "aaa"
        "sss"
    }else{
        "bbb"
    }
    println(s)
    println()

    //이런식으로 단순히 조건에 대한 코드만 실행하지 않고 마치 결과값을 주는 식 같은 문법이어서 ..
    //그래서 코틀린에서는 if제어문이라고 부르지 않고 [if 표현식]이라 부름
    //4.2) when  (switch문을 대체함)
    var h:Any? =null

    //switch(h){}  //문법이 없음
    var n:Int=30

    h=20
    when(h){
        10 -> println("aaa")
        20-> {
            println("bbb")
            println(".............")
        }
        "hello"-> println("ddddd")
        true-> println("eee")

        n-> println("n변수와 같은 값")
        40,50-> println("fff")

        else->{
            println("어떤 값과도 같지 않음")
        }
    }

    //when도 if문처럼 표현식임. 즉, 값을 결과로 대입할 수 있따는 것임.
    h=200
    var result= when(h){
        10->"hello"
        20->"nice"
        else->{
            println("else")
            "bad"
        }
    }
    println(result)
    println()

    when(h){
        is Int-> println("h의 값은 정수")
        is Double-> println("h의 값은 실수")
    }

    //when의 경우값에 부등호를 이용한 범위지정도 가능함
    var score=85
    when{
       // score>=90 && score<=100 -> println("A학점")
        // .. 스프레이드연산자
        score in 90.. 100-> println("A학점")
        score>=80 -> println("B학점")
        score>=70 -> println("C학점")
        score>=60 -> println("D학점")
        else -> println("F학점")
    }
println()
    //4.3)반복문  -while은 똑같음
    //for문은 완전히 다름
//    for (int i=0; i<5; i++){}  error

    //0부터 5까지 6번 반복
    for (i in 0..5){
        println(i)
    }
    println()

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

    //마지막 숫자를 포함하지 않는 반복문
    for (i in 0 until 10){   //0~9
        println(i)
    }
    println()

    //2씩 증가
    for (a in 0..10 step 2){
        println(a)
    }
    println()

    //감소하기
    for (n in 10 downTo 0){
        println(n)
    }
    println()

    //2씩 감소
    for (n in 10 downTo 0 step 2){
        println(n)
    }
    println()

}