코틀린) 코틀린 기본 1

밍나·2022년 2월 22일
0

Android

목록 보기
27/36

✏️ 변수

1. var와 val

(1) var

  • 변경 가능한 변수를 선언하는 키워드
// var로 선언한 변수는 값을 다시 지정할 수 있다
var name1 = "kotlin"
name1 = "I am kotlin"

// var는 초기화를 나중에 할 수도 있다
var name2: String
name2 = "kotlin"

(2) val

  • 변경 할 수 없는(읽기 전용) 변수를 선언하는 키워드
  • val은 나중에 변경할 수 없으므로 생성할 때 반드시 초기화를 해야 한다
val name = "kotlin"

2. 타입 추론

  • 코틀린은 항상 타입을 명시적으로 선언할 필요가 없다
  • 컴파일러가 표현식에 포함된 정보로 해당 타입을 찾으려고 시도한다
  • 선언과 동시에 초기화를 하지 않는 경우 타입을 선언해주어야 한다
  • 타입을 명시적으로 선언할 때는 :을 사용한다
var num: Number
num = 12.3

3. 기본 타입

(1) 숫자

var int: Int = 123
var long: Long = 123456L
var double: Double = 12.34
var float: Float = 12.34F

println("int is $int")
println("long is $long")
println("double is $double")
println("float is $float")
int is 123
long is 123456
double is 12.34
float is 12.34
  • int는 정수 체계의 기본값으로, double은 부동소수점수 체계의 기본값으로 사용된다
  • long은 접미사로 L을, float은 접미사로 F를 요구한다
  • 코틀린은 자동으로 숫자를 확장하지 않기 때문에 필요에따라 반드시 명시적으로 변환해줘야 한다
    • toInt(), toLong(), toDouble(), toFloat() 등

(2) 문자

var str: String = "코틀린입니다"
var chr: Char = '코'
var longStr: String = """안녕하세요
    코틀린입니다
    문자열 여러줄 출력이에요
"""

println("str is $str")
println("chr is $chr")
println("longStr is $longStr")
str is 코틀린입니다
chr is 코
longStr is 안녕하세요
        코틀린입니다
        문자열 여러줄 출력이에요
  • 단일 문자는 Char형으로 단일 따옴표를 사용한다
  • 문자열은 String형으로 이중 따옴표나 삼중 따옴표를 사용한다
    • 이중 따옴표는 이스케이프된 문자열을 생성한다
    • 삼중 따옴표는 원시 문자열을 생성해 이스케이프가 필요하지 않으며, 모든 문자를 포함할 수 있다

(3) 문자열 템플릿

val name = "Minha"
val age = 25
val lastName = "Lee"

println("Hi. My name is $name. I'm $age years old.")
println("My name is ${name + lastName}.")
Hi. My name is Minha. I'm 25 years old.
My name is MinhaLee.
  • 출력할 때 변수를 사용하고 싶으면 '$변수명'으로 작성하면 된다
  • 변수와 문자 사이에 띄어쓰기를 하고 싶지 않은 경우나 변수명 두개를 이어서 출력하고 싶은 경우 '${변수명}'으로 작성하면 된다
  • '$'를 그냥 문자로 쓰고 싶을 때는 이스케이프 문자로 사용하면 된다 → $

✏️ 함수

1. main 함수

fun main() {

}

2. 함수

fun add(a: Int, b: Int) : Int {
    return a + b
}
  • 무엇을 리턴하건 상관 없이 맨 앞에는 fun (function의 줄임)을 작성
  • fun 뒤에는 함수명 작성
  • 매개변수에는 '매개변수명: 매개변수 타입'으로 작성
  • 리턴형이 있다면 '함수명: 리턴형(Int, String 등)'으로 작성, 생략하면 안됨
  • 리턴형이 없다면 '함수명: Unit (void와 동일)'으로 작성, 생략해도 무방

✏️ Array and List

val array: Array<Any> = arrayOf(1, "b", 3)
val list: List<Any> = listOf(2, "c", 4, 5)
// 선언과 동시에 객체를 할당하는 경우
// arrayList의 값은 변하지만 참조값은 변하지 않아 val로 지정 가능
val arrayList = arrayListOf<Any>

// array의 경우 사이즈 수정 불가능, 값 수정 가능
array[0] = 7

// list의 경우 사이즈 수정 불가능, 값 수정 불가능 (읽기 전용)
var result = list.get(1)

// arrayList의 경우 사이즈 수정 가능, 값 수정 가능
arrayList.add(10)
arrayList.add(15)

1. Array

  • 사이즈가 지정되어 메모리에 할당되어 있다 → 사이즈 수정 불가
  • 값은 수정할 수 있다

2. List

  • 값을 변경하지 못하는 읽기 전용 리스트

2. MutableList

  • 사이즈와 값을 모두 변경할 수 있고 읽기, 쓰기 모두 가능한 리스트
  • 대표적인 예 : arrayList

✏️ 범위 지정

1. .. vs until 과 in

fun checkScore(score: Int) {
    when(score) {
        in 90..100 -> println("Excellent")
        in 70 until 90 -> println("Great")
        in 40 until 70 -> println("Not bad")
        else -> println("Fighting")
    }
}
  • ..로 표현되는 범위는 시작값보다 크거나 같고, 끝값보다 작거나 같다
  • until로 표현되는 범위는 시작값보다 크거나 같고, 끝값보다 작다
  • 범위에 포함되는지를 검사하기 위해 in 연산자를 사용할 수 있다

2. rangeTo와 downTo

val rangeTo = 10.rangeTo(20)
val countingDown = 100.downTo(50)

println("rangeTo : $rangeTo")
println("countingDown : $countingDown")
rangeTo : 10..20
countingDown : 100 downTo 50 step 1
  • rangeTo()와 downTo()는 범위를 생성하는 함수이다
    • rangeTo()는 숫자를 하나씩 올리는 순으로 범위를 생성
    • downTo()는 숫자를 하나씩 내리는 순으로 범위를 생성

3. step

val oneToFifty = 1..50
val oddNumbers = oneToFifty.step(2)
    
println("oddNumbers : $oddNumbers")
oddNumbers : 1..49 step 2
// oddNumbers : 1, 3, 5, ..., 49
  • step()은 범위에서의 델타값이다
    • step(2)의 경우 범위 내에서 값이 2씩 증가한다는 의미이다
val fiftyToZero = 50.downTo(0)
val evenNumbersDown = fiftyToZero.step(2)
    
println("evenNumbersDown : $evenNumbersDown")
evenNumbersDown : 50 downTo 0 step 2
// evenNumbersDown : 50, 48, 46, ..., 0
  • step의 값으로 음수를 지정할 수는 없다
    • 감소하는 값으로 범위를 지정하려면 downTo()로 범위를 거꾸로 뒤집고 해야한다

4. reversed

val evenNumbersDown = (0..50).step(2).reversed()
    
println("evenNumbersDown : $evenNumbersDown")
evenNumbersDown : 50 downTo 0 step 2
// evenNumbersDown : 50, 48, 46, ..., 0
  • 감소하는 값으로 범위를 지정하는 방법에는 reversed를 사용하는 방법도 있다

✏️ 조건문

1. If

fun maxBy(a: Int, b: Int): Int {
    if(a>b) {
        return a
    } else {
        return b
    }
}

2. 간결한 If

fun maxBy(a: Int, b: Int): Int = if(a>b) a else b
  • 삼항연산자 대신 간결한 If문을 사용하면 된다

3. when

fun checkScore(score: String) {
    when(score) {
        "A" -> println("score is A")
        "B" -> println("score is B")
        "C", "D", "F" -> println("score is under B")
        else -> println("I don't know")
    }
}
  • 다른 언어에서 switch의 역할을 대체한다

✏️ 반복문

1. For문

val animals: ArrayList<String> = arrayListOf("dog", "cat", "panda", "bear")

for(i in animals) {
    println(i)
}

var sum = 0
for(i in 1..10 step 2) {
    sum += i
}
println(sum)

2. While문

var index = 0

while(index < 10) {
    println("index : ${index}")
    index++
}

3. withIndex()

val students = arrayListOf("이민하", "오승재", "이짱구")
    
for((index, name) in students.withIndex()){
    println("${index+1}번째 학생 : ${name}")
}
  • Index를 같이 출력하고 싶을 때 사용한다

✏️ Expression vs Statement

// expression example
fun add(a: Int, b: Int): Int = a + b

//statement example
fun checkOdd(num: Int) {
    if(num % 2 == 1) {
        println("$num is odd")
    } else {
        println("$num is even")
    }
}
  • 일련의 과정을 통해 값을 반환하면 Expression
  • 동작만 한다면 Statement
  • 코틀린의 모든 함수는 Expression이다 (값을 리턴하지 않는 것처럼 보이지만 사실 Unit을 리턴하기 때문)
    • 하지만 자바에서 void형 함수는 Statement이다

profile
🤗🤗🤗

0개의 댓글