ref : Udemy [Android 12 및 Kotlin 개발 완전 정복] 섹션 3
안드로이드 스튜디오 시작하기 듣고 기록한 내용
SDK란?
Software Development Kit의 약자
소프트웨어 개발 도구와 설치 패키지를 모은 것.
하드웨어 플랫폼이랑 운영체에 연결되어 있다.
구현할 앱이랑 연결하면 됨.
이거 설정할때 API 21 이용자 수가 많기 때문에(94%) API 21로 설정할 것!
Run 단축키
ctrl + shift + f10
코틀린 기초 문법을 살펴보자
함수
코틀린에서는 함수를 fun 이라고 쓴다.
package org.techtown.kotlinbasics
fun main(){
}
변수
package org.techtown.kotlinbasics
fun main(){
var myName = "Dawon"
print("Hello" + myName)
}
변수를 쓸 때에는 var 을 사용한다.
그리고 문자열과 변수는 + 로 이어서 작성할 수 있다.
근데 val 도 변수로 선언할때 사용이 가능하다고 한다. 차이가 뭘까?
val과 var의 차이점
var 는 변경이 가능하고
val은 변경이 안된다.
val에는 한번 값을 넣으면 새로운 값으로 변경이 안된다는 의미!
package org.techtown.kotlinbasics
fun main(){
var myName = "Dawon"
myName = "Sangwon"
print("Hello" + myName)
}
var은 위 코드가 가능하고 val은 오류가 난다.
숫자 데이터 타입
var myName = "Dawon"
var myAge = 23
문자열을 넣으면 string 타입이고
숫자를 넣으면 숫자 타입이다. 여기선 int 32 bit 에 해당
// Integer TYPES: Byte (8 bit), Short (16 bit), Int (32 bit), Long (64 bit)
val myByte : Byte = 12
val myShort: Short = 125
val myInt : Int = 123123123
val myLong : Long = 12_123_123_123_123_123
이렇게 타입을 직접 써넣어서 지정할 수 도 있다.
하지만 타입을 지정하지 않아도 var 로 변수를 선언하면 알아서 판단한다.
val myFloat : Float = 13.37F // F를 붙여서 float 타입이라고 지정해줌
val myDouble : Double = 3.1459265358979323846
Float 는 32bit, Double은 64bit
데이터 타입 bool, char, string
var isSunny: Boolean = true
// not sunny anymore...
isSunny = false
boolean은 ture 혹은 false
// Characters
val letterChar = 'A'
val digitChar = '1'
문자 하나를 넣는 char 타입도 있다.
문자일수도 있고 숫자일수도 있고 기호일 수도 있다.
char이 모이면 string이 된다.
// Strings
val myStr = "Hello World"
var firstChar = myStr[0]
var lastChar = myStr[myStr.length - 1]
print(firstChar)
print(lastChar)
//Hd
문자열을 하나 지정해서 그 문자열의 맨 첫글자와 맨 뒷글자를 출력해보았다.
문자열 보간법
print("Fisrt Character" + firstChar)
위 코드에 마우스를 갖다대면 다음과 같이 나온다.
결합을 template 으로 변환하라고 뜬다.
print("Fisrt Character$firstChar")
convert를 하면 위와 같이 바뀐다.
두가지 스트링을 더하는 대신에
한개의 스트링으로, 하나의 구문으로 바뀌었다.
string template 의 시작은 $로 시작하면된다.
print("Fisrt Character$firstChar and the length of ${myStr.length} is ")
근데 $로 시작한다고 항상 그게 변수 취급이 되는 것은 아니고
적절한 상황에 { } 중괄호도 $ 랑 같이 쓰일 수 있다.
산술 연산자
산술 연산자로 사칙연산이 있다.
+, -, *, /, %(나머지)
var result = 5+3
result *= 2 // result = result * 2
print(result)
+=, -=, *=, /= 와 같은 연산자도 사용 가능하다. (이건 잠시 뒤에서 나올 대입 연산자이다,)
var result = 5+3
val a = 5
val b = 3
result = a / b
print(result)
위 코드를 보았을때 result의 값은 1.6666... 이 나와야할 것만 같지만
결과는 정수가 나온다.
이유는 a랑 b가 정수여서 둘이 계산한 값도 정수가 나오기 때문이다.
이럴 때 해결방법으로는 double 타입으로 바꿔주는 게 있다.
비교 연산자
== : 양쪽을 같은지 비교하고 boolean 값을 return 한다.
!= : 양쪼이 다른지 비교하고 boolean
val isEqual = 3==3
println("isEqual is " + isEqual)
위와같이 코드를 작성할 경우 이번에도 결합을 템플릿으로 바꾸라고 한다.
val isEqual = 3==3
println("isEqual is $isEqual")
템플릿으로 전환하면 위와 같다.
아까 말한 $와 { } 같이 쓰기를 여기서도 응용할 수 있는데 아래처럼 { } 안에 boolean 값으로 넣는 것이다.
그럼 true나 false 값으로 나온다.
이러한 개념을 스트링 인터폴레이션이라고 한다고 한다.
val isEqual = 3==3
println("isEqual is ${5>3
// isEqual is true
이 외에도 <= , >= 비교연산자도 존재한다.
대입, 증가, 감소 연산자
대입 연산자에는
+=, -=, *=, /=, %= 가 있다.
var myNum = 5
myNum += 3 //myNum = myNum + 3
예시로 위 코드를 보면 주석과 같은 의미로 동작한다는 걸 알 수 있다.
다른 연산자들도 똑같이 동작한다.
var myNum = 5
myNum += 3 //myNum = myNum + 3
println(myNum)
myNum ++
println(myNum)
// 8
// 9
증가 연산자는 ++
감소 연산자는 -- 이다.
// increments after use
println("myNum is ${myNum++}")
// increments before use
println("myNum is ${++myNum}")
println("myNum is ${--myNum}")
변수 앞에 붙이거나 뒤에 붙이는 것에 따라
변수를 실행하기전에 증감를 시킬지
변수를 실행하고나서 증감을 시킬지 정할 수 있다.
if문
if(h_person1 > h_person2) {
println("use raw force")
}else if(h_person1 == h_person2){
println("use tyour power technique 1337")
}else{
println("use technique")
}
if, else if, else 문을 사용 가능하다.
if에 마우스를 갖다대면 아래와 같이 뜨는데
if를 when으로 바꾸라고 제안한다(일단 알고 넘어가자).
이번에는 문자열을 이용해서 조건문을 만들어봤다.
var name = "denis"
if(name == "denis"){
println("welcome")
}else{
println("who are you")
}
식으로 된 If문
//create a variable for testing all condition
val age = 16
//create a variable for drinkingAge
val drinkingAge = 21
//create a variable for votingAge
val votingAge = 18
//create a variable for drivingAge
val drivingAge = 16
//Assign the if statement to a variable
val currentAge = if (age >=drinkingAge){
println("Now you may drink in the US")
//return the value for this block
drinkingAge
}else if(age >=votingAge){
println("You may vote now")
//return the value for this block
votingAge
}else if (age>=drivingAge){
println("You may drive now")
//return the value for this block
drivingAge
}else{
println("You are too young")
//return the value for this block
age
}
//print the age for the passing condition
print("current age is $currentAge")
currentAge 라는 변수를 val 로 선언해서
if 문에 따라 만족하는 return 값을 currentAge에 넣어주는 모습이다.
when 표현식
var season = 3
when(season){
1 -> println("Spring")
2 -> println("Summer")
3-> {
println("Fall")
println("Autumn")
}
4-> println("Winter")
else -> println("Invalid")
}
var month = 3
when(month){
in 3..5 -> println("Spring")
in 6..8 -> println("Summer")
in 9..11 -> println("Fall")
12, 1, 2 -> println("Winter")
when 표현식을 쓸 때에는 when 안에 조건을 살펴볼 변수를 넣고
그 변수가 만족할 조건을 쓰고
화살표를 쓰다음에 그 조건을 만족하면 실행할 것을 써준다.
지금 위의 코드에서는 season이 1일 때에는 "Spring" 을 출력해줘라 라는 의미이고
{ } 중괄호를 사용해서 실행할 코드를 여러줄 쓸 수도 있다.
그 아래 코드를 보면 in 3..5 이런식으로 코드를 작성한 걸 볼 수 있는데
범위가 3에서 5에 포함되면 "Spring" 을 출력해달라- 의미이다.
12..2 같은 경우에는 donwTo 여서 12부터 2까지 작아지는 범위이기때문에(우리가 원하는게 아니다)
저렇게 , 콤마를 이용해서 따로 써주었다. 그래도 된다.
위 코드에서 x는 어느 타입이라도 될 수 있도록 Any라고 적어준 것이다.
그리고 이 x의 타입을 알아보기 위해 when 을 써봤는데
is 라는 표현을 썼다. 만약 Int 타입이면 오른쪽의 println 문을 실행하는 것이다.
is 말고 !is 라는 표현도 가능하다.
while
while 문으로 반복문을 만들어보았다.
반복문이 끝나면 끝났다는 문구를 출력하도록 했다. 이때 \n 은 줄바꿈으로 인식된다.
while 루프와 비슷한 do while 문을 살펴보자
아까와 똑같이 x 에는 1로 설정을 해주고
먼저 do { } 에 있는 코드를 실행한다. 그리고 while 문에 있는 조건을 확인한다.
출력은 아까와 같다.
이런식이면 일단 do 문 안에 있는 코드는 무조건 한번은 실행한다는 얘기이다.
이번에는 x를 15로 해봤다.
이 경우에는 do 안에 있는 코드를 한번 실행하지만 while 문에서 조건을 만족하지 못해서
do while 문에서 빠져나올 것이다. 그리고 끝났다는 문구를 바로 출력할 것이다.
do while문은 보통 서버에서 다양한 사용자 목록을 받는 경우와 같은 상황에 사용한다고 한다.
while 문에 다른 조건을 넣어보자
feltTemp 은 문자열인데 이 문자열이 "cold" 라면 roomTemp 를 증가시키고 if문도 확인하는 예제이다.
for
이번에는 for 문이다.
num 이 1부터 10까지 변화한다는 것을 의미한다(in 이라는 표현과 .. 표현이 계속 같이 쓰이는 것 같다)
.. 말고 until 이라는 표현도 있다. 그런데 이 표현은 until 뒤에 오는 숫자를 포함하지는 않는다.
10까지라고 해서 1부터 9까지 나오는 것 같다.
downTo도 기억해두자. 반대로 작아지는 표현이다.
break과 continue
i 가 1부터 19까지 증가하는데
만약에 2로 나눴을 때 몫이 5라는 조건을 만족하면
반복문을 아예 종료해버리는 것이다.
그래서 i가 10이 되었을 때 반복문이 종료된다.
위 예시는 continue 예시이다.
i를 2로 나눴을 때 몫이 5이면 continue 하라는 것이다.
continue는 건너뛰는 의미이다.
이러한 이유때문에 10이랑 11은 건너뛰고 print 문을 실행하지 않았다.
매개변수 - 인수와 반환
위와 같은 코드의 경우 main 함수 밖에 addUp 이라는 함수와 myFunction 이라는 함수를 따로 만들어줬다
이 함수들은 main 함수 안에서 호출이 가능하다.
그리고 addUp 함수는 a 와 b 라는 매개변수를 더해 그 값을 반환한다.
그래서 main 함수에서 addUp 을 부를때에 인자로 1과 2를 넣어보았다
매개변수와 인자의 차이점을 기억하자
null 타입
변수가 null을 값으로 가질 수 있다.
0은 아니며 자바나 코틀린에서는 null 이라고 한다.
위 코드와 같은 상황에서는 name 이라는 변수를 String이라고 했는데
null 값을 넣으려고 하니 오류가 난다. 빈상태로 둘수는 없는거다.
하지만 다음과 같이 String? 로 타입을 지정해주면 null 타입일 수도 있다는 의미이다.
그래서 null 값을 넣어도 오류가 뜨지 않는다.
null인 값의 length 를 구하려고 하면 오류가 날 것이다.
만약에 그 값이 null 인지 아닌지 모르겠다면 저런식으로 표현할 수 있다.
마지막 줄을 보면..
nullableName 이라는 null 일수도 있는 변수가 있는데 만약 이게 null 이 아니라면 이것의 length 를 출력해달라는 의미이다.
let과 it 쓰는 표현을 기억하자.
엘비스 연산자와 non-null 단언 연산자
엘비스 연산자에 대해서 먼저 알아보자
위 코드를 보면 한 변수에 "dawon" 이라는 문자열이 들어가 있다. 이 변수는 null 값이 허용되는 변수다.
만약 이 변수에 null 값을 넣어서 null값이 된다면 default 값으로 "guest"를 넣어달라고 하는 표현식을 작성해봤다.
?: 를 사용하고 null 값일 경우에 대신 대입할 값을 ?: 오른쪽에 작성해주면된다.
다음은 non-null 단언 연산자 이다.
이 표현은 !!을 사용하는데
위와 같이 변수 뒤에다가 !! 를 작성해준다.
만약에 이 변수가 null 값이라면 저 코드는 오류가 나지만,
null 값이 아니라면 오류가 나지 않는다.
이거는 체인 표현 방식인데 wifeAge 라는 변수에다가 user 라는 클래스에 있는 wife, 그 wife 에 있는 age 값을 넣는 것이다.
만약에 null 값이면 default 값으로 0을 넣도록 한다.
체인으로 연달아 작성해서 null 인지 확인해볼 수 있는 방법이다.(후에 클래스와 객체는 자세히 다룬다)