📌 Kotlin Variable Type

Kotlin의 변수 타입은 크게 valvar로 나누어진다.

  • val : 선언 후 변수에 지정된 값을 바꿀 수 없다.
  • var : 선언 후 변수에 지정된 값을 바꿀 수 있다.
val valValue = 3	// Int형 Type 추론
valValue = 4	// error 발생

var varValue = 3	// Int형 Type 추론
varValue = 4	

📌 변수의 자료형

기본 자료형(Primitive Type)

  • Byte
  • Short
  • Int
  • Long
  • Float
  • Double
  • Char
  • Boolean

위와 같은 타입들이 기본 자료형이며 모두 객체로 취급한다.

변수의 자료형을 지정할 때는 ? 🤔

val 또는 var [변수명] : [자료형] = "값"

다음과 같은 형태로 자료형을 지정한다.
Kotlin의 경우, Statically Typed Language, Modern Language의 특징으로, Compile 시점에 Type Inference를 지원하므로 자료형을 굳이 지정해주지 않아도 된다.

하지만 특수한 경우, lateinit var를 사용하여 늦은 초기화를 하게 될 때, 자료형을 표기해주어야 한다.

private lateinit var lateinitValue : Int

fun main() {
	lateinitValue = 3		// Int 타입 lateinit 
    // lateinitValue = 0.3  // error 발생
   
    val intValue : Int = 3
    val intValue2 = 30		// Type Inference
    
   	val boolValue : Boolean = true
    val boolValue2 = false		// Type Inference
    
    // Byte, Short, Long, Float, Double, Char, String ... 등등 여러 자료형이 있을텐데
    // 위와 같이 똑같은 형식으로 선언하여 사용해주면 된다.
}

📌 Kotlin 연산자

Arithmetic Operators (산술 연산자)

산술할 때 사용하는 연산자이다.
다른 프로그래밍 언어들과 유사하게 +, -, *, /, % 연산 등이 있다.

  • a + b : a.plus(b)
  • a - b : a.minus(b)
  • a * b : a.times(b)
  • a / b : a.div(b)
  • a % b : a.rem(b)
fun main(args: Array<String>) {

    val number1 = 12.5
    val number2 = 3.5
    var result: Double

    result = number1 + number2
    // result = number1.plus(number2)
    println("number1 + number2 = $result")

    result = number1 - number2
    // result = number1.minus(number2)
    println("number1 - number2 = $result")

    result = number1 * number2
    // result = number1.times(number2)
    println("number1 * number2 = $result")

    result = number1 / number2
    // result = number1.div(number2)
    println("number1 / number2 = $result")

    result = number1 % number2
    // result = number1.rem(number2)
    println("number1 % number2 = $result")
}

위 코드에서 알 수 있듯이 result 앞에 $를 표기함으로써 "문자열" 속에서 변수의 값을 불러 출력문에 포함시킬 수 있다.


Assignment Operator (할당 연산자)

Assingment Operator는 연산 후 값을 할당 한다는 뜻으로
+=, -=, *=, /=, %= 가 있다.

  • += : a += 3 : a = a + 3
  • -= : a -= 3 : a = a - 3
  • *= : a *= 3 : a = a * 3
  • /= : a /= 3 : a = a / 3
  • %= : a %= 3 : a = a % 3

연산을 진행 후, 값을 다시 변수에 할당하는 것이다.

fun main(args: Array<String>) {
    var x = 10
	x += 5		// x = x + 5
    
    var number = 12
    number *= 5   // number = number*5
    
    println("x = $x")				// x = 15
    println("number  = $number")	// number = 60
}

Bitwise Operators (비트 연산자)


fun main() {

    // or - 비트 단위 논리 합
    // and - 비트 단위 논리 곱
    // xor - 배타적 논리합
    // inv - 비트단위 역
    // shl - Signed Left Shift
    // shr - Signed Right Shift
    // ushr - Unsigned Right Shift

    val bitwise = -15

    println("bitwise or 15 -> ${bitwise.or(15)}")
    println("bitwise and 15 -> ${bitwise.and(15)}")
    println("bitwise xor 15 -> ${bitwise.xor(15)}")
    println("bitwise inv 15 -> ${bitwise.inv()}")
    println("bitwise shl 15 -> ${bitwise.shl(15)}")
    println("bitwise shr 15 -> ${bitwise.shr(15)}")
    println("bitwise ushr 15 -> ${bitwise.ushr(15)}")

}

Kotlin Comparison, Equality Operators

비교, 동등 연산자.

Java

  • == : 같은 인스턴스를 참조하고 있는 지 ?
  • .equals() : 참조하는 값이 같은 지 ?

Kotlin

  • == : 참조하는 값이 같은 지 ?
  • === : 같은 인스턴스를 참조하고 있는 지 ?
fun main() {
    // Java
    // ==, equals
    // ==  -> 참조하는 주소 값이 같느냐 ?
    // equals -> 참조하는 값이 같느냐 ?

    /*
    String a = "hi" // 주소값 : 1번지
    String b = "hi" // 주소값 : 2번지

    System.out.println(a == b) // false
    System.out.println(a.equals(b)) // true
     */

    // Kotlin
    // ==(equals) , ===
    // kotlin 에서는 equals 와 == 이 동일하다.
    // == -> 참조하는 값이 같느냐 ?
    // === -> 참조하는 주소 값이 같느냐 ?

    val a1 = "abc"
    val a2 = "abc"
    val a3 = String( StringBuffer("abc"))

    println(" a1 == a2 -> ${a1 == a2}")
    println(" a1 == a3 -> ${a1 == a3}")
    println(" a2 == a3 -> ${a2 == a3}")

    println(" a1 === a2 -> ${a1 === a2}")
    println(" a1 === a3 -> ${a1 === a3}")
    println(" a2 === a3 -> ${a2 === a3}")
}

서로 다른 두 변수가 선언되었을 때, 두 인스턴스 또는 변수가 값이 할당된 힙 메모리 영역에 서로 다른 주소 영역에 값을 가지고 생성이 된다.

이 때, Java에서는 ==을 사용하면, 두 인스턴스 또는 변수가 참조하고 있는 메모리의 주소 값(같은 인스턴스인지?)을 비교하게 되고, equals 메서드를 사용 해 참조하는 값을 비교한다.

Kotlin에서는 == 을 사용하게 되면, 값을 비교하게 되며, ===을 사용 시, 주소 값이 같은 지(같은 인스턴스인지?)를 비교하게 된다.


Kotlin Logical, Contain Operators


fun main() {
    // Kotlin `in` 연산자
    // in 연산자는 중위(infix) 표기법의 하나로 무엇에 속해 있느냐를 나타내는 kotlin Keyword

    // in -> a in b -> b.contains(a)
    // !in -> a !in b -> !(b.contains(a))

    val nums = intArrayOf(1,2,3,4,5,6,7,78,0)
    if( 5 in nums ) println("5는 포함됨!")

    val a = 21
    val b = 19
    val c = 29

    println("( a > b ) || ( a < c ) = ${ ( a > b ) || ( a < c ) }")
    println("( a > b ) or ( a < c ) = ${ ( a > b ) or ( a < c ) }")

    println("( a > b ) && ( a > c ) = ${ ( a > b ) && ( a > c )}")
    println("( a > b ) and ( a > c ) = ${ ( a > b ) and ( a > c )}")
    println("( a > b ).and( a > c ) = ${ ( a > b ).and( a > c )}")

    // 1부터 9까지의 홀수 값을 가지는 Int 배열을 만든다
    val intArray = intArrayOf(1,2,3,4,5,6,7,8,9)
    var result = 5 in intArray
    println("5 in intArray = $result")

    result = intArray.contains(5)
    println("intArray.contains(5) = $result")

    result = 5 !in intArray
    println("5 !in intArray = $result")

    result = !(intArray.contains(5))
    println("!(intArray.contains(5)) = $result")

}

in 연산자 ? 🤔

in 연산자를 유심히 살펴보면 좋을 것이다.

어떤 Range 또는 배열 또는 컬렉션에 속하는 지 확인할 떄 사용하는 Contain Operator이다.

주로, 반복문, 조건문에서 사용하며, 조건을 만족할 시 반복 또는 구문을 실행할 때 사용한다.


📌 Kotlin Range

기본 타입의 경우, 범위를 표현할 수 있는 xxxRange Class를 제공한다.

  • Kotlin 표준 라이브러리인 kotlin.ranges에 존재하며, 범위(수열에 해당하는 열거된 값들)를 선언하여 변수에 담을 수 있다.

  • 값 사이에 ..을 표기하여 Range를 표현할 수 있다.

  • 세 가지 종류의 Range 타입이 존재한다.

    • Char : CharRange('A','Z') 또는 'A'..'Z'
    • Int : IntRange(1,45) 또는 1..45
    • Long : LongRange 클래스를 사용하며, IntRange와 같음.
val intRange = 1..45
// val intRange = IntRange(1,45)

val charRange = 'A'..'Z'
// charRange = CharRange('A','Z')

다음과 같이 사용하며, 보통 반복문이나 조건문에서 in 연산자를 통해 많이 사용한다.


📌 Kotlin Expression & Statement

Expression ? 🤔

Kotlin 에서 표현식(Expression)은 변수, 연산자로 구성되어 단일 값을 리턴하는 코딩 표현을 의미한다.

val sum : Int = 21 + 27

21 + 27 은 단일 값 48 Int 값을 반환하는 표현식(Expression)

  • Kotlin에서 if, when 은 문장(Statement)이 아니라 표현식(Expression)이다.
val random = Random()
val randomValue = random.nextInt(100)   // 0 ~ 99 까지의 랜덤한 값을 발생시킨다.
println("randomValue => $randomValue")

// Kotlin 에서 사용하는 if, when, try 는 문장이 아니라 표현식이다.
var evenOrOdd = if(randomValue % 2 == 0) "Even" else "Odd"
evenOrOdd = when(randomValue % 2 ) {
    0 -> "Even"
    else -> "Odd"
}
println("randomValue is evenOrOdd ? => $evenOrOdd")
  • if의 경우, Java와 똑같다고 생각하면 되고, when에 대해서 살펴보겠다
var value = 1
value = 2

fun valueisOne() {}
fun valueisTwo() {}

when(value) {
	1 -> { valueisOne() } // value 값이 1일 때 이 구문이 동작한다.
	2 -> { valueisTwo() } // value 값이 2일 때 이 구문이 동작한다.
    else -> { println("잘못된 숫자입니다") } // 조건에 없는 경우가 발생할 때는 'else'구문으로 처리
}

다음과 같이 when( value ) { } 구문은 value에 할당된 값이 무엇인지에 따라서 다음과 같은 구문이 동작하는 표현식이다.

  • when의 다른 사용법

// 1. 여러 조건으로 분기 시 ' , ' 사용.
    
when(x) {
	0,1 -> print(x)
	2,3,5 -> print(x)
    else -> { println("잘못된 숫자입니다") } 
}
     
// 2. Error 처리
    
fun getBody = when( val response = executeRequest() ) {
	is Success -> response.body()
	is Error -> response.errorBody()
	else -> throw httpException(HTTP.STATUS)
}
     

Statement ? 🤔

프로그래밍에서 문장(Statement)은 수행 할 작업을 나타내는 명령형 프로그래밍 언어의 가장 작은 독립된 실행형 요소이다.

완전한 실행단위를 구성하는 모든 것.

val sum = 21 + 27 ---> 이 구문 자체가 모두 문장이다.
val evenOdd = if(randomValue % 2 == 0) "Even" else "Odd" --> 이 구문 자체가 문장.
  • if 라는 표현식이 Statement 안에 속해있다.
  • 식(Expression) 은 문장(Statement)의 한 부분이다.
  • Statement >= Expression

📌 Kotlin Loop

for ~ each

Java의 for문이다.

int sum = 0
for( int i = 1 ; i <= 100; i++ ) {
	sum += i;
}

Kotlin 에서도 이와 같이 하면 가능할까 ?

var sum = 0
for( var i = 1; i <= 100; i++ ) { ----> error 발생
	sum += i
}

Kotlin에서는 Java와 같은 형식으로 구현하면 error가 발생하는 점을 확인할 수 있다.

어떻게 해야할까 ? 🤔

Kotlin 에서 for~each 구문은 다음과 같이 구현한다.

  • for 기본 문법 : for( item in 수열[...] ) {}
var sum = 0

// 1 <= item <= 100
for( item in 1..100 ) { // --> in 키워드 다음에 수열, 범위 변수를 구현한다.
	sum += item
}
println( sum )	// 1부터 100까지의 합 5050이 출력된다.

until, step, downTo

  • until - 값 사이에 until 을 사용하면, 뒤에 오는 값포함하지 않는 범위로 설정할 수 있다.
var sum = 0
val startValue = 2
val endValue = 100

// 2 <= item < 100 ( 100을 포함하지 않는 수열 )
for( item in startValue until endValue ) {
    sum += item
}
println(sum)    // 4949
  • step - step 을 사용하여, 증가하거나 감소하는 수의 가중치를 지정할 수 있다. 기본적으로는 step 1 이 생략되어있다.
var sum = 0
val startValue = 2
val endValue = 100

// 2 <= item <= 100 step 2( 2에서 100까지 2씩 증가 )
for( item in startValue..endValue step 2 ) {
    sum += item
}
println(sum) // 2550

2에서 100까지 증가하는 수열이며, 증가하는 가중치를 2로 지정하였다.

  • downTo 를 역방향으로 감소하는 수열을 만들 수 있다.
var sum = 0
val startValue = 2
val endValue = 100

// 100 에서 2까지 2씩 감소하는 수열, ( 100, 98, 96 ..... 2 )
for( item in endValue downTo startValue step 2 ) {
	sum += item
}

println( sum ) // 2550

100에서 2로 감소하는 수열이며, 감소하는 가중치를 2로 설정하였다.


while, do-while

Java와 같은 방식으로 사용한다.

// 2. while, do- while
var condition : Boolean = true

// while : condition 이 true인 동안만 실행한다.
while ( condition ) {
	condition = false
}

// do-while : 처음 한 번은 무조건 실행(do)하고, condition 이 true인 동안 실행한다.
do {
	condition = false
}while ( condition )

📌 참조

profile
Yoon's Dev Blog

0개의 댓글