업데이트:

카테고리:

/

태그: , , , ,

기본문법과 변수

fun main() {
    var myName = "Sohee"
    print("Hello " + myName)
}

위의 코드와 같이 구성되있는 부분이 파일의 기본구조이다. 이 코드안에 들어있는 코드블록들이 실행하게 된다.

var와 val의 차이

var은 선언 후 재 할당이 가능하다.
val은 선언 후 재 할당이 불가능하다.

실제로 구동도 val가 좀 더 빠르다.

코틀린의 타입

코틀린은 타입 언어이다. 그러므로 모든 변수는 타입을 가지고 있다.

정수 데이터 타입

  • Byte : 8bit
  • Short : 16bit
  • Int : 32bit
  • Long : 64bit

타입을 직접 지정해주는 방법은 val myByte: Byte = 12식으로 변수 뒤에 타입을 적어준다.

var myAge = 31을 작성하였을 때 따로 타입을 지정하지 않아도 타입이 알아서 정해지는데 이것을 타입 추론이라고 한다.

부동 소수점 숫자 타입

  • Float : 32bit
  • Double : 64bit

Float을 따로 지정하지 않고 val myFloat = 13.37F와 같이 값뒤에 F를 넣어주면 Float로 인식하게 된다.
기본적으로 코틀린은 소수점 타입의 기본값을 Double로 갖고 있기 때문에 그렇다.

논리 타입

  • Boolean : ture, false

따로 지정하지 않고 true와 false만 적어줘도 코틀린 내부에서 타입 추론을 통해 자동으로 전환된다.

문자 타입

  • char : ‘문자 1개’
  • String : ‘문자열’

작은따옴표(‘’) 안에 적혀있는 데이터는 모두 문자로 인식한다. String은 결국 문자열이기 때문에 인덱스([0])로 각각의 문자에 접근할 수 있다.

문자열 합치기
다른 언어에서는 변수와 문자열을 합칠 때 +를 사용하여 합치는데 코틀린을 변수와 문자열을 합칠 때 "첫번째 문자열 {$firstChar}" 로 문자열 내부에 ${}를 통해서 변수를 넣어준다.

연산자

산술 연산자

  • + : 값을 더한다.
  • - : 값을 뺀다.
  • * : 값을 곱한다.
  • / : 값을 나눈 몫을 준다.
  • % : 값을 나눈 나머지를 준다.

이 때 연산하려는 값을 서로 타입이 맞거나 아님 결과에 타입을 지정해줘야 타입 에러가 발생하지 않는다.

비교 연산자

  • == : 값이 같은지 비교
  • != : 값이 다른지 비교
  • < : 보다 작은지 비교
  • > : 보다 큰지 비교
  • <= : 보다 작고 같은지 비교
  • >= : 보다 크고 같은지 비교

if문 - 흐름제어

var height1 = 170
var height2 = 189

// 해당 값이 참일 때 실행
if (height1 > height2) {
  println("use raw force")
// if 구문이 거짓이고 다음 조건이 참이면 실행
}else if (height1 == height2){
  println("use your power technique 1337")
// 위의 모든 조건이 거짓이면 실행
}else{
  println("use technique")
}

When문

특정한 변수를 값에 따라 조건을 보는 문이다.
Js에 Switch문과 유사하다.

var season = 3

// () 안에는 바라볼 변수를 작성한다.
when(season){
    // 여기에는 바라보는 변수에 따른 실행값을 작성한다.
    1 -> println("Spring")
    2 -> println("Summer")
    3 -> {
        println("Fall")
        println("Autumn")
    }
    4 -> println("Winter")
    // 아무것도 만족하지 못하면 else문으로 빠진다.
    else -> println("Error")
}

//범위로 값을 지정하고 싶다면
when(season){
  // 범위로 지정하고 싶을때는 in과 ..을 이용한다.
  in 1..2 -> println("Upper")
  // 내림차순은 DownTo를 사용
  in 4 DownTo 3 -> println("Downer")
  
  // 직접 지정하고 싶으면 ,로 구분하여 넣으면 된다.
  1,2,3,4 -> print("Wow")

  // in 앞에 !을 붙어 해당 범위외로 설정가능하다.
  !in 10..20 -> ...
}

// 특정 타입을 검사할 때는 is를 사용한다.
when(season){
  is Int -> ...
  is Double -> ...
  is String -> ...
}

While문 - 반복문

조건이 참이면 안에 코드를 계속하여 실행한다.
계속 코드가 돌아가지 않도록 조건 종료문이 반드시 필요하다

var x = 1
while(x<=10) {
  println("$x")
  x++
}

Do While문

while문과 비슷하지만 do안에 반복할 코드를 넣고 while문에 종료조건을 넣는다.
while문과의 차이점은 조건이 거짓이요도 do안의 코드는 한번 시행된다는 점이 차이가 있다.

  var x = 1
  do{
    x++
  }while (x <= 10)

for문

while문과 달리 조건에 들어갈 변수를 따로 지정하지 않아도 된다. for문 안에 있는 범위를 돌면서 코드를 실행한다.

// 오름차순
for (num in 1..10){
  print("$num")
}

for (num in 1 until 10){
  ...
}

// 내림차순(downTo) + 건너뛰는 범위 설정(step)
for (num in 10 downTo 1 step 2){
  ...
}

break & continue

  • break : 루프를 아예 끝내 더 이상 반복하지 않음
  • continue : 해당 루프를 건너뛰고 다음 루프를 시작함

함수

아래에 함수를 지정하고 main함수에서 불러서 사용하면 된다.

fun main(){
  myFunction() // "..."
  var result = addUp(5, 3)
  print("$result") // 8
}

// 기본구조 키워드-이름-매개변수-코드
fun myFunction(){
  print("...")
}

// 무언가를 리턴한다면 return 타입도 지정해야 한다.
fun addUp(a: Int, b: Int) : Int{
  return a + b
}

흔히 불리는 단어로 메서드와 함수가 있는데
메서드는 객체 안에 들어있는 함수이고, 함수는 가장 바깥에 존재한다.

Nullable

변수가 null을 가질 것인지 아닌지 체크한다.

fun main(){
  var name : String = "Sohee"
  // 이미 String으로 지정이 되어있기 때문에 null을 넣을 수 없다.
  name = null 

  // 타입 마지막에 ?을 붙이면 nullable하게 데이터가 들어갈 수 있다.
  var nullableName : String? = "Sohee"
  nullableName = null

  // nullable한 타입의 속성을 체크할 수 있다.
  var len = nullableName?.length
  // nullable한 값이 있든 없든 한번 체크한다.
  // 숏컷 if문의 예시
  nullableName?.let { println(it.length) }
}

엘비스 연산자와 Not null 단정

var nullableName : String? = "Sohee"
// ?: 엘비스 연산자
// nullable 변수가 빈칸이면 디폴트 값인 "Guest"가 name에 지정된다.
val name = nullableName ?: "Guest"

// !! Not null 타입 단정
print(nullableName!!.toLowerCase()) // sohee