이 글은 Android 12 및 Kotlin 개발 완전 정복을 참고하여 작성하였습니다.
작성자: 조미서
개발환경 : Windows, Android Studio
1. 변수 그리고 'Val'과 'Var'의 차이
먼저 val과 var은 변수의 시작을 알릴 때 변수 앞에 위치하여 사용된다.
이 둘은 '중복기재의 가능여부'에서 큰 차이점을 가지는 데,
먼저 중복기재란
fun main(){
val myName = "Frank"
myName = "Heidi" // 중복기재!
}
위와 같이 변수를 다시 기재하는 것을 의미합니다.
그렇다면 val과 var 중 무엇이 중복 기재가 가능하고 불가능한지 코드를 통하여 보겠습니다.
val을 사용할 시
fun main(){
val myName = "Frank" // val 사용
myName = "Heidi" // 중복기재!
print("Hello " + myName)
}
출력:
Val cannot be ressigned
var을 사용할 시
fun main(){
var myName = "Frank" // var 사용
myName = "Heidi" // 중복기재!
print("Hello " + myName)
}
출력:
Hello Heidi
이렇듯
| - 'Val'은 '중복 기재의 불가능' => 초기에 할당한 값 변경 불가능 - 'Var'은 '중복 기재의 가능' => 초기에 할당한 값을 변경한 값으로 변경 가능 |
++ 주석처리
다음으로 넘어가기 전 짧게 코틀린 주석처리 방법을 알고가자면
// - 한 줄 주석처리
/* */ - 여러줄 주석처리
//TODO - todo 주석처리를 하게 되면 아래의 TODO 작업 목록 창으로 빠르게 내용을 찾아볼 수 있다
2. 데이터 타입
코틀린은 변수에 값을 정하면 그 변수의 타입을 알아서 정해주는 '타입추론'을 하는 '타입언어'이다.
(이때 타입추론은 변수의 입력값에 따라 추론하므로 꼭 값을 넣어줘야 한다.)
만약 사용자가 타입을 직접 지정할 때는
var age : Int // 이처럼 (변수이름) : (타입종류)를 써서 타입을 지정한다.
이제 다양한 유형들의 타입을 알아보자
- 정수형 타입
byte (8 bit)
short (16 bit)
int (32 bit)
long (64 bit) - 실수형 타입
float (32 bit) *float타입 선언시 변수값 뒤에 F를 붙여 구분해준다*
double (64 bit) - Boolean 타입
논리 변수 (True(참) 또는 False(거짓)만 값으로 정한다.) - Character(문자형)타입
1개의 '문자'만을 저장 - String(문자열)타입
문자들이 모인 '문자열'을 저장
데이터 유형을 지정하는 이유는 각 변수가 가지는 값은 서로 다른 space/storage를 요구하고,
변수가 특정 데이터 유형으로 지정될 시, 다른 유형으로 데이터를 할당할 수는 없기 때문이다.
데이터타입 코드 예시
// 정수형 타입
val myByte :Byte = 13
val myShort : Short = 125
val myInt : Int = 123123123
val myLong : Long 12_039_812_309_487_120
// 실수형 타입
val myFloat: Float = 13.37F
val myDouble : Double = 3.14159265358979323846
// Boolean 타입
var isSunny : Boolean = true
// not sunny anymore...
isSunny = false
// Characters (문자형) 타입
val letterChar = 'A'
val digitChar = '1'
// Strings (문자열) 타입
val myStr = "Hello World"
3. 문자열 보간법
fun main(){
val myStr = "Hello World"
val firstCharInStr = myStr[0] // myStr변수의 첫번째 값
print("First character " + firstCharInStr + "and the length of myStr is " + myStr.length)
} // myStr.length는 myStr문자열의 공백을 포함한 길이를 나타낸다
출력:
First character H and the length of myStr is 11
위와 같은 식을 기호 '$'와 '{}' 사용하여 '문자열 보간'을 해줄 수 있다
문자열 보간을 사용하면 변수에 해당하는 값을 유동적으로 문자열에 넣을 수 있다.
이때 변수값은 어떠한 값으로 바뀔지 모르기 때문에 '문자열 보간'을 통하여 변수에 저장된 값을 보간해준다는 뜻이 있다.
이제 문자열 보간을 한 위와 같은 식을 보자
fun main(){
val myStr = "Hello World"
var firstCharInStr = myStr[0]
print("First character $firstCharInStr and the length of myStr is ${myStr.length}")
}
출력:
First character H and the length of myStr is 11
위의 식과 약간의 차이가 나지만 출력문은 둘 다 동일한 것을 알 수 있다.
4. 산술연산자
- + 더하기
- - 빼기
- * 곱하기
- / 나누기(몫)
- % 나누기(나머지)
5. 비교연산자
- == 같음
- != 같지 않음
- < 보다 작음
- > 보다 큼
- <= 보다 작거나 같음
- >= 보다 크거나 같음
비교연산자는 두 값을 서로 비교해주고 'boolean' 결과(True or False)가 나타난다.
예시를 보자면
fun main(){
val isEqual = 5==3
print("isEqual is $isEqual")
}
출력:
isEqual is false
isEqual에서 5와 3은 같은지 비교하여 같지않으므로 false를 출력한 것을 알 수 있다.
6. 복합대입연산자
- +=
- -=
- *=
- /=
- %=
복합대입연산자의 쓰임
fun main(){
var myNum = 5
myNum += 3 //myNum = myNum + 3과 같은 의미이다
print("myNum is $myNum")
}
출력:
myNum is 8
위와 같이 만약 a *=5라는 식이 있다면 이 식은 a = a*5와 같이 볼 수 있다.
7. 증감연산자
- ++ 증가 연산자 // 값이 1씩 증가
- -- 감소 연산자 // 값이 1씩 감소
증감연산자의 쓰임
fun main(){
var myNum = 5
myNum++ //myNum에서 1증가
print("myNum is $myNum")
}
출력:
myNum is 6
그렇지만 증감연산자는 '위치'에 따라서 전혀 다른 출력을 냅니다.
fun main(){
var myNum = 5
print("myNum is $myNum")
print("myNum is ${myNum++}") //증가 연산자가 myNum 뒤에 위치한다
print("myNum is ${++myNum}") //증가 연산자가 myNum 앞에 위치한다
}
출력:
myNum is 5
myNum is 5 //출력 후 ++ 되어 변수의 값이 6이 된다
myNum is 7 // ++myNum에 의해 7이 되고 이 값이 출력된다
두번째까지는 myNum이 5로 출력되고 세번째에서 myNum이 7로 변하는 것을 알 수 있는데, 이는 바로 두번째에서
myNum뒤에 ++를 붙여 코드가 모두 끝난 후에 변수에 1이 증가하고(세번째코드에서 변수의 값은 6이다), 이는 ++가
앞에서 수식하는 세번째 코드를 만나 변수의 값이 7이 되고, 이것이 출력시킨다는 것을 볼 수 있다.
8. If문
if(조건문){
실행코드
}
else if(조건문){
실행코드
}
else{
실행코드
}
if문의 기본 틀은 이렇게 구성되고, 첫번째 if 옆 조건문의 식이 해당될 시에 바로 밑 중괄호 안의 코드를 실행시키고,
아닐 시 else if문으로 가서 조건문식과 일치할 때 실행시킨다. 모든 조건에 해당하지 않을시 else 중괄호 안 코드가
실행된다.
9. When문 (C, C++, C#, Java등의 프로그래밍 언어에서 switch문의 대체)
when문은 코드를 통해 알아보자
fun main(){
var season = 3
when(season) {
1 -> println("Spring")
2 -> println("Summer")
3 -> println("Fall")
4 -> println("Winter")
else -> println("Invalid Season")
}
var month = 3
when(month) {
1,2,3 -> println("Spring")
in 4..6 -> println("Summer") //in 4..6은 4<=..<=6의 범위와 같다
in 7..9 -> println("Fall")
in 10..12 -> println("Winter")
else -> println("Invalid Season")
}
var age = 17
when(age){
!in 0..20 -> println("now you may drink in the US") // 0부터 20사이가 아닐 시 코드 실행
in 18..20 -> println("now you may vote")
16,17 -> println("you now may drive")
else -> println("you're too young")
}
var x : Any = 13.37F //any타입 : 객체 타입 => 타입 중 아무거나 변화가능
when(x) {
is Int -> println("$x is an Int")
!is Double -> println("$x is not Double") //13.37F는 double형이 아니므로 출력
is String -> println("$x is a String")
else -> println("$x is none of the above") //앞선 코드 실행으로 이 줄은 코드 실행X
}
}
// ++추가적으로 내려가는 범위를 표현하려면 (숫자) downTo (숫자) 처럼 표현해야한다
// EX) 12 downTo 7 (12,11,10,9,8,7)
출력:
Fall
Spring
you now may drive
13.37 is not Double
10. While문 (반복문)
while(조건문){
실행코드
}
while문의 기본 틀은 이렇게 구성되고, while루프는 조건문이 성립하면 조건이 거짓이 될 때까지 계속해서 실행되므로, 조건을 직접 종료점으로 이동시켜야 한다. 이 말은 즉, 만약 조건문이 x <= 10이라고 할 때 x를 10보다 크게하게 되면 그 시점부터 조건문은 성립이 되지 않으므로 루프를 빠져나올 것이다.
while문의 사용을 보면
fun main(){
var x = 1
while(x <= 10) {
print("$x ")
x++
}
}
출력:
1 2 3 4 5 6 7 8 9 10
11. Do while문 (반복문)
do{
실행코드
}while(조건문)
do while문의 기본 틀은 이렇게 구성되고, while과 같이 조건문이 성립하면 계속 반복하다 조건이 거짓이 되면 빠져나온다.
do while문의 사용을 보면
fun main(){
var x = 1
do{
print("$x ")
x++
}while(x <= 10)
}
출력:
1 2 3 4 5 6 7 8 9 10
그렇지만 이 둘은 차이점을 가지고 있다.
차이점을 코드를 통해 알아보자
먼저 while문에서 조건이 거짓일 때
fun main(){
var x =15
while(x <= 10){ //x는 조건문에 성립하지 않는다
print("$x ")
x++
}
}
출력:
// 출력X
출력이 아무것도 나오지 않는 것을 볼 수 있다.
그렇다면 do while문에서 조건이 거짓일 때는
fun main(){
var x = 15
do{
print("$x ")
x++
}while(x <= 10)
}
출력:
15
조건이 맞지 않았지만 한 번 실행이 되어 15를 출력한 것을 볼 수 있다.
이처럼 이 둘의 차이점은 do while은 조건이 성립하지 않아도 무조건 한 번이 실행되지만 while은 조건이 성립되지 않을 시는 아무 실행을 하지 않는다는 점이다.
12. For문 (반복문)
for(변수 in 변수범위){
실행코드
}
for문의 기본 틀은 이렇게 구성되고, while과는 달리 단순히 코드를 실행할 변수의 범위를 지정하고 이에 벗어날 시 루프를 빠져나온다.
for문의 사용을 보면,
fun main() {
for(num in 1..10) {
print("$num ")
}
print("\n")
for(i in 1 until 10) { // for(i in 1.until(10))과 같이 쓸 수도 있다
print("$i ")
}
print("\n")
for(i in 10 downTo 1) { // for(i in 10.downTo(1))과 같이 쓸 수도 있다
print("$i ")
}
print("\n")
for(i in 1 until 10 step 2) { // for(i in 1.until(10).step(2))과 같이 쓸 수도 있다
print("$i ")
}
}
출력:
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9
10 9 8 7 6 5 4 3 2 1
1 3 5 7 9
13. 쉬어가기 (break, continue)
break는 반복루프를 끝내거나 반복 실행을 더는 하지 않도록 하고
continue는 그 이하의 코드를 실행하지 않고 다음 반복문으로 이동하게 한다.
코드를 통해 알아보면 (break 사용)
fun main(){
for(i in 1 until 20){ // 1 이상 20 미만
print("$i ")
if(i/2 == 5){
break
}
}
print("Done with the loop")
}
출력:
1 2 3 4 5 6 7 8 9 10 Done with the loop
i가 10이 되면 break가 실행이 되고 for루프에서 빠져나와 "Done with the loop"라는 구문을 출력하는 것을 볼 수 있다.
continue 사용
fun main() {
for(i in 1 until 20){
if(i/2 == 5){
continue
}
print("$i ")
}
print("Done with the loop")
}
출력:
1 2 3 4 5 6 7 8 9 12 13 14 15 16 17 18 19 Done with the loop
i가 10과 11일 때의 몫이 5 이므로 continue가 실행되고 이는 밑의 "$i"를 무시하고 다음 반복문을 실행하여
12 13....으로 나오는 것을 볼 수 있다.
14. 함수, 매개변수, 인수
fun 함수이름(매개변수){
실행코드
}
함수의 기본 틀은 이렇게 구성된다
함수의 다양한 예시를 알아보자
fun main() {
myFunction() //myFunction 함수 불러옴
println(addUp(5, 3)) //addUp 함수 출력
var result = avg(3.2, 5.3) //여기서 3.2, 5.3은 인수이다
println("result is $result") //avg 함수 출력
}
fun myFunction() {
println("myFunction was called")
}
// 두 개의 매개변수를 가지고 Int타입의 값을 반환하는 함수
fun addUp(a: Int, b: Int): Int {
return (a + b)
}
fun avg(a: Double, b: Double): Double {
return (a + b) / 2
}
출력:
myFunction was called
8
result is 4.25
위의 코드에서 인수와 매개변수를 헷갈리지 않도록 주의한다.
15. Null
null값을 허용하기 위해서는 변수의 자료형을 지정하고 끝에 물음표를 붙여야 한다.
- var name: String = "choms"
name = null
출력:
Compliation Error - var name1: String? = "choms"
name1 = null
출력: //아무것도 출력되지 않지만 error 뜨지 않는 것을 확인할 수 있다
- ?. SafeCall // 변수?.함수 ==> 변수가 null이 아닐 때 오른쪽 함수를 수행, null일 때는 null 반환
- ?: 엘비스(프레슬리 머리) 연산자
// 변수?:"~" ==> 변수의 값이 null일 때 엘비스 연산자 뒤의 문자열이 변수 값에 들어간다 - !! non-null 단언 연산자
// 변수!!함수 ==> 변수에 null이 아닌 정확히 지정된 값이 있음을 선언
'GDSC HUFS 4기 > Kotlin Team #1' 카테고리의 다른 글
| [1팀] 코틀린 - 분 단위 나이 계산기 (0) | 2022.11.21 |
|---|