Kotlin - BASIC

Hue·2023년 3월 20일
0

Android/Kotlin

목록 보기
38/42

Java언어를 개선시킨 표기법만 다른 함수형 프로그래밍 언어
독자적인 언어체계는 아님, java의 JRE/JVM이 필요
개발자 입장에서는 코틀린 언어를 사용하지만, 안드로이드 스튜디오의 입장에서는 여전히 자바

Java는 완전객체지향으로 class 안에 모두 설계해야함,
Kotlin은 함수지향 --> main함수 필요

🚩 kotlin 문법적 주요 특징

ⓐ 문자의 끝을 나타내는 세미콜론을 사용하지 않음 (써도 에러는 아니지만 거의 무시됨)

ⓑ 정적타입 언어
자료형은 존재하지만 자동 형변환 안됨
변수를 만들때 자료형을 먼저 쓰지 않고 var, val 키워드 사용

ⓒ new 키워드 없이 객체생성
new String() --> String()

ⓓ null safety 언어
안전하게 null을 다룰 수 있는 문법이 제공

ⓔ 함수형 언어
객체처럼 변수에 저장하고 파라미터로 넘겨주는 등의 작업 가능 람다식처럼)

Basic 문법

① 출력
콘솔창 출력 : print(), println()
변수명을 전달하면 변수 안의 값이 출력

② 자료형,변수

②-1. 자료형
코틀린은 소문자로 시작하는 자료형이 존재하지않음
--> 모든 변수가 참조형 (8byte)
1)기초타입 : Boolean, Byte, Char, Short, Int, Long, Float, Double
2)참조타입 : String, Random, Any...

②-2. 변수
var : 값 변경이 가능한 변수
자료형이 정해져있기때문에 다른 자료형의 변수 대입시 에러 (cf. 자바에서는 더 큰 자료형에 작은 자료형의 값 대입 가능)
.toInt(), .toDouble() 등으로 기초타입은 명시적으로 형변환하여 대입 가능

num = 3.14.toInt()

val : 값 변경이 불가능한 읽기 전용 변수
상수와는 다름, 상수는 const val 키워드 사용

※ var / val
상황에 맞게 사용, 무엇을 사용할지 어렵다면 다음과 같은 가이드 이용

  • var : 데이터를 가지고 있는 변수
    [ex. name, age, title...]
  • val: 객체를 참조하는 변수
    [ex. TextView, ImageView, NotifiactionManager...]

변수 선언시에 자료형 표기가 없으면 값이 대입되면서서 자동 추론됨
자료형 명시 생략을 통해 자동 추론하려면 변수 선언하면서 값 대입이 필수 (값을 바로 대입하지 않으면 자료형을 알 수 있는 방법이 없기때문에 변수를 만들 수 없음)

var a = 3.14f
val b = "Hi"

※ 정수값 특이 표기법
실생활에서 숫자의 세자리마다 콤마로 구분하는 것과유사한 표기법 (출력은 구분자 없이 됨)

var price = 5_000_000

⒞ 문자열 String
단순 문자열 객체를 생성할때 String() 생성자 사용불가
String() 생성자는 Buffer나 Byte배열을 String 객체로 생성할때만 사용

Any : kotlin만의 자료형 타입
자바의 Object처럼 최상위 타입
최상위 타입은 어떤 객체든 참조가 가능하므로 편해보이지만 실제 개발시에 어떤 자료형인지 예측이 어려워 혼란을 야기할 수 있으므로 필요한 경우에만 사용할 것

var v:Any 
v = 10
v = "Hi"

⒡ null값에 대한 자료형
코틀린은 자료형을 명시하면 null 안정성때문에 기본적으로 null 저장이 불가능
--> null값을 가질 수 있는 변수라고 표시 가능 : Nullable 변수

var n:Int? = null
var s:String? = null

Nullable변수는 값이 null일 수도 있으므로 .으로 멤버 사용 불가 : ?. 연산자 이용 - null이 아닐때만을 의미

var s:String? = "Hi"
println(s?.length)

※ 화면출력 Format
number타입과 string타입의 결합 : number타입이 string타입으로 변하지 않음
.toString()으로 number타입을 string타입으로 변환하여 결합

println(10.toString() + "Hi")

✅ 문자열을 맨앞에 있으면 자동형변환됨

println("Hi" + 10)

✅ 문자열 템플릿 이용
: php처럼 문자열 안에$이용하여 변수임을 명시
띄어쓰기를 하지않으면 변수명과 구분되지 않으므로 변수와 결합연산자의 띄어쓰기 필요
중괄호를 생략하여 약식표현으로 사용가능하나, 내부적인 연산이 필요한 경우 등에는 중괄호를 사용한 정식표현으로 사용

println("$a + $b = ${a+b}")

③ 연산자
number타입간의 산술연산은 자동형변환 [작은것 -> 큰것]
(number타입이 아닌 자료형과는 자동형변환 불가)

③-1. is/!is : 자료형 체크
nullable과 nonnullable을 구분하지는 않음

if (n is Int) println("n은 Int형 변수입니다")
else println("변수 아닌갑네")

다른 자료형으로 is 체크하면 문법에러...
즉, String은 String으로만 체크가능함
그렇다면 이미 자료형 알고 있는 것인데 의미가 없나요?

--> Any 타입에 대한 식별로 이용됨
(자바의 insstanceOf(어떤 객체가 어떤 부모의 자식인지)와 흡사한 역할)

var obj:Any
obj = 10
if (obj is Int) println("${obj}는 Int입니다") //true
if (obj is Double) println("${obj}는 Double입니다") //false

is 연산자의 특이기능 : is를 통해 어떤 객체인지 판별했다면 참인영역 안에서는 그 객체를 참조변수로 인식

class Person {
        var name = "Sam"
        var age = 20
}

var p = Person() //Person 객체 생성
println(p.name + " " + p.age)

var obj:Any
obj = Person()
if (obj is Person) {
		println("${obj.name} - ${obj.age}")
}		

if문 밖에서는 obj의 자료형이 Any타입이기때문에 멤버변수name과 age가 자동 리스트업되지 않음 (부모는 자식을 건들일 수 없음)
obj is Person이 참이기때문에 if문 내의 영역으로 들어온 것 --> obj를 참조변수로 인식, obj 내부의 name, age 사용 가능

③-2. 비트연산자&,|,~,^ 없음
대신에 비트연산의 기능을 가진 메소드가 존재

println(7.or(3)) //OR 비트연산
println(7 or 3)

④ 조건문
if, when (switch 문법 없음)

④-1. if 표현식
if문이나 else문의 마지막 실행문이 변수에 대입될 수 있음
이러한 특징때문에 코틀린에는 if문을 제어문 대신에 if 표현식이라고 표현
따라서 코틀린에는 삼항연산자가 없고 if표현식이 이를 대체함

//var str:String = (10>5)? "aaa" : "bbb" //삼항연산자
var str:String = if (10>5) "aaa" else "bbb"

④-2. switch 문법이 없어지고 when문법이 대체
다른 자료형, 변수, 2개 이상의 조건을 배치해도 가능
else의 경우 when의 경우와 맞는 것이 없어 빠져나와 만나기 때문에 switch문의 default 역할을 하게 됨

var h:Any = 10
var n:Int = 20
when(h) {
        10 -> println("ten")
        20 -> println("twenty")
        "Hi" -> println("Hello")
        n -> println("n변수와 동일값")
        30, 40 -> println("30이거나 40")
        
        else -> {
        		println("one")
            	println("two")
            	println("three")
        }
}

결과를 변수에 저장

var h = 30
    var result = when (h) {
        10 -> "a"
        20 -> "b"
        else -> {
            "c"
            "d" //마지막 결과값
        }
}

is키워드사용

var h = 50
    when(h) {
        is Int -> println("Int타입")
        is String -> println("String타입")
        else -> println("else")
}

특정수식으로 제어가능 -수식을 쓸때는 괄호 사용하지않음
사용문법이 조금 다르므로 주의할것!

var h = 85
    when {
        //h >= 90 && h <= 100 -> println("A score")
        h in 90..100 -> println("A score")
        h >= 80 -> println("B score")
        h >= 70 -> println("C score")
        h >= 60 -> println("D score")
        else -> println("F score")
    }

⑤ 반복문
while문은 다른것이 없지만 for문은 작성문법이 완전히 다름
변수를 만들고 값을 대입해서 범위를 만들고 변수의 값을 증가하던 자바와 달리 ..으로 변수의 범위를 작성

for (i in 0..5) {
        println(i)
}

until : ..은 마지막 자리수까지 포함하므로 마지막 수를 제외하고 싶을 경우 사용

for (i in 0 until 10) println(i)

step : 변수의 증가범위 조절

for (i in 0..10 step 2) println(i)

downTo : 변수를 증가시키지않고 감소시키기

for (i in 10 downTo 0) println(i)

⑥ 배열&Collection

⑦ 함수

0개의 댓글