Code with Joyce 님의 영상,
부스트코스 코틀린강좌,
오준석의 안드로이드 생존코딩 책(2판)을 기반으로 작성하였습니다
그럼 기본개념 정리 Start💫
자료형 | 설명 |
---|---|
Double | 64bit 부동소수점 |
Float | 32bit 부동소수점 |
Long | 64bit 정수 |
Int | 32bit 정수 |
Short | 16bit 정수 |
Byte | 8bit 정수 |
자료형 | 설명 | 리터럴 |
---|---|---|
String | 문자열 | "", """ """ |
Char | 한 문자 | '' |
비교 | 자바 | 코틀린 |
---|---|---|
문자열 | equals() | == |
Object | == | === |
val uInt : UInt = 153u
dog as Animal
is키워드로 type 체크.
if(str is String){}
JAVA
접근제한자 + 반환형 + ... + 함수이름
Kotlin
fun + 함수이름(): Unit{}
코틀린의 entry 함수는 fun main(){}
매개변수와 반환형이 있는 함수
fun add(a: Int, b:Int): Int{
return a + b
}
java랑 다르게 변수명을 먼저! 반환형이 뒤에!
fun add(a: Int, b:Int) = a + b
함수 몸체가 Expression인 경우 return 생략가능하며 return type이 자동 추론됨
value 은 immutable type = 변수
variable 은 mutable type = 상수
val a: Int = 10
a = 4
val은 재대입이 불가 (final과 유사)
kotlin은 타입 추론 기능이 있어서 생략가능
val b = 3
해줘도 알아서 Int로 저장됨
But, 초기화시 값을 할당하지 않는다면 type명시해줘야함
val c : String
c = "minju"
lateinit | by lazy | |
---|---|---|
사용가능변수 | var | val |
null 초기화 | X | O |
초기화 전 변수 사용가능여부 | X | O |
유의 | Int,Long,Double,Float에서 사용불가 | val 선언 후 by lazy{}블럭에 초기화에 필요한 코드 작성 |
$ / ${...}
변수이름 or 함수이름 앞에 $ 붙여서 출력가능
fun main(){
val name = "minju"
val lastName = "Kim"
println("my name is $name")
println("my name is ${name+lastName}I'm 24")
}
대괄호{}를 이용하여
1. 변수이름이 어디까지인지 지정해 줄 수도 있음
2. + 로 변수 여러개를 합칠 수도 있음
3. 수식계산도 가능
4. $를 쓰고 싶다면 $ 로 escape처리
kotlin에는 삼항연산자가 없기 때문에
java 처럼 써도 되지만 훨씬 간결하게 쓸 수 있음
fun maxBy(a: Int, b: Int) = if(a>b) a else b
if ~ else 로 바로 return를 넘겨줄 수도 있다
when
switch 역할.
식과 범위 모두 들어올 수 있고, !is String
같은 비교할 곳에 타입이 무엇인지까지 들어올 수 있음
fun check(score : Int){
when(score) {
100 -> println("만점")
in 1..99 -> println("${score}점")
0 -> println("빵점")
}
var b = when(score){
100 -> println("만점")
0 -> println("빵점")
else -> println("${score}점")
}
}
1개면 ->
여러개면 0,1 ->
범위면 in a..b
범위아닐시 !in a..b
도 가능
when(x) { parseInt(s) ->
도 가능
변수의 리턴값으로 when을 쓸 때는 else절을 꼭 써줘야한다!
Expression : 하나 이상의 값을 만듦. = 수식
Statement : 실행만 하고 값을 따로 만들진 않음. =최소 독립코드
자바의 void 리턴 함수는 Statement 지만,
코틀린은 Unit 리턴하기 때문에
자바에서는 if문이 Statement 로 밖에 사용할 수 없지만,
코틀린은 Expression으로도 사용 가능하다.
val array2 : Array<Any> = arrayOf(1,"m",3.4f) //Mutable
val list2 :List<Any> = listOf(1,"j",11L) //Immutable
val arrayList = arrayListOf<Int>(1,2,5) //Mutable
val foods = mutableListOf("양꼬치","마라샹궈","김치볶음밥")
: key-value의 키가 중복될 수 없는 자료구조
val citiesMap = mutableMapOf("한국" to "서울", "일본" to "도쿄", "프랑스" to "파리")
citiesMap["미국"] = "워싱턴" //추가
citiesMap["일본"] = "동경" //변경
: 중복되지 않은 요소들로 구성된 자료구조
val citySet = mutableSetOf("서울","부산")
citySet.add("대구")
citySet.remove("부산")
for
for(변수 in 범위)
for(i in 1..10 step 2){ // 1 3 5 7 9
sum += i
}
for(i in 10 downTo 1){ // 10~1
sum += i
}
for(i in 1 until 10){ // 1~9 마지막 미포함
sum += i
}
1. step: 단계
2. downTo: 내림차순 (step 적용가능)
3. a until b: a부터 b-1까지
val blackpink : ArrayList<String> = arrayListOf("jenny", "rose","jisoo","lisa")
for(a in blackpink){
println("${a}")
}
for(변수 in 리스트) : arrayList 원소들 출력
for(i in blackpink.indices){
println("${i+1}번째 멤버: ${blackpink[i]}")
}
for(변수 in 리스트.indices) : 인덱스 반환
for((idx, name) in blackpink.withIndex()){
println("${idx+1}번째 멤버이름: ${name}")
}
for((인덱스,변수) in 리스트.withIndex()) : arrayList 인덱스 및 원소 출력
while(index < 10){
index++
}
Type을 생략하게 되면 기본적으로 NonNull
Type뒤에 ? 붙이면 Nullable
?.
안전한 호출
Nullable 변수를 쓸 때는 ?.로 nullcheck를 해주자!
(안하면 컴파일에러..)
var name: String = "minju"
var nullName: String? = null //Nullable
var nameInUpperCase = name.toUpperCase() // nonNull이라 사용가능
var nullNameInUpperCase = nullName?.toUpperCase()
//null이면 null반환, 아니면 함수실행
?:
Elvis operator
Nullable 변수에 null일때 디폴트 값 지정
(변수?: default 값)
val fullName = name + (lastName?: " No lastName")
upperCase = str?.toUpperCase ?: "초기화하세요"
!!
강제 not null 처리
절대 null 이 아닐 때 null아니라는 것을 보장
확실하지 않는이상 NPE마주치니 지양하자
fun ignoreNulls(str: String?){
val mNotNull: String = str!! //절대 NULL아님~
val upper = mNotNull.toUpperCase()
}
let
let 함수는 자신의 리시버객체를 내부로 옮겨 실행하는 함수
val email : String?= "minju@haha.com"
email?.let{
println("my email is ${email}")
}
java와는 다르게 파일 이름과 클래스 이름이 일치하지 않아도 된다
여러 클래스가 한 클래스 안에 들어갈 수도 있음
class Human constructor(val name: String = "miyeon") {
open class Human(val name: String = "Anonymous") {
//기본생성자
constructor(name:String, age:Int) : this(name){
//부 생성자는 주 생성자의 위임을 받아야해서 this로 받아옴
println("my name is ${name}, ${age}years old")
}
init{ //젤먼저 실행 그다음 constructor
println("이건 주 생성자")
}
open fun eatingCandy() {
println("yummy mintCandy~~")
}
}
fun main() {
val human = Human("minju")
val idle = Human()
val ive = Human("Liz",20)
human.eatingCandy()
println("She's name is ${human.name}")
println("She's name is ${idle.name}")
}
클래스 상속은 자바랑 똑같이 하나만 상속할 수 있다.
자바는 extends
코틀린은 : 부모클래스
코틀린클래스는 기본적으로 상속금지
접근허락을 위해 부모클래스 및 함수,프로퍼티를 open 해줘야 함
class Korean : Human(){
//오버라이딩
override fun eatingCandy(){
super.eatingCandy() //민트캔디 출력
println("yummy kimchiCandy~~")
println("my name is ${name}") // 마넴이즈 Anonymous 출력
}
}
fun main(){
val korean = Korean()
korean.eatingCandy() // 김치캔디 출력
}