Kotlin의 변수 타입은 크게 val
과 var
로 나누어진다.
val valValue = 3 // Int형 Type 추론
valValue = 4 // error 발생
var varValue = 3 // Int형 Type 추론
varValue = 4
위와 같은 타입들이 기본 자료형이며 모두 객체로 취급한다.
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 ... 등등 여러 자료형이 있을텐데
// 위와 같이 똑같은 형식으로 선언하여 사용해주면 된다.
}
산술할 때 사용하는 연산자이다.
다른 프로그래밍 언어들과 유사하게 +
, -
, *
, /
, %
연산 등이 있다.
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
앞에 $
를 표기함으로써 "문자열" 속에서 변수의 값을 불러 출력문에 포함시킬 수 있다.
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
}
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)}")
}
비교, 동등 연산자.
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
에서는 ==
을 사용하게 되면, 값을 비교하게 되며, ===
을 사용 시, 주소 값이 같은 지(같은 인스턴스인지?)를 비교하게 된다.
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
이다.
주로, 반복문, 조건문에서 사용하며, 조건을 만족할 시 반복 또는 구문을 실행할 때 사용한다.
기본 타입의 경우, 범위를 표현할 수 있는 xxxRange Class를 제공한다.
Kotlin 표준 라이브러리인 kotlin.ranges에 존재하며, 범위(수열에 해당하는 열거된 값들)
를 선언하여 변수에 담을 수 있다.
값 사이에 ..
을 표기하여 Range를 표현할 수 있다.
세 가지 종류의 Range 타입이 존재한다.
val intRange = 1..45
// val intRange = IntRange(1,45)
val charRange = 'A'..'Z'
// charRange = CharRange('A','Z')
다음과 같이 사용하며, 보통 반복문이나 조건문에서 in
연산자를 통해 많이 사용한다.
Kotlin 에서 표현식(Expression)은 변수, 연산자로 구성되어 단일 값을 리턴
하는 코딩 표현을 의미한다.
val sum : Int = 21 + 27
21 + 27
은 단일 값 48
Int 값을 반환하는 표현식(Expression)
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)
은 수행 할 작업을 나타내는 명령형 프로그래밍 언어의 가장 작은 독립된 실행형 요소
이다.
완전한 실행단위
를 구성하는 모든 것.
val sum = 21 + 27 ---> 이 구문 자체가 모두 문장이다.
val evenOdd = if(randomValue % 2 == 0) "Even" else "Odd" --> 이 구문 자체가 문장.
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( 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로 설정하였다.
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 )