💡함수
1. 함수 시작은 반드시 fun
2. 매개변수는 변수 : 변수타입
3. return형은 아무것도 없을 때 Unit, 있을 땐 fun 함수명(매개변수) : return 타입
fun main() : Unit{ //return 형식 없을 땐 Unit(굳이 필요 없어서 redundant 하다고 뜰 수 있음)
println("hello!")
}
fuc add(a : Int, b : Int) : Int{
return a+b
}
💡val vs. var
1. val = value , 상수를 의미(변경X)
2. var = variable , 일반 변수를 의미(변경O)
3. val / var는 반드시 구분해서 써줘야 함
4. 변수에 값을 바로 할당할 경우 python처럼 타입 작성을 하지 않아도 자동으로 설정, But 값을 바로 할당하지 않을 경우 타입 명시 필요
💡String 템플렛
1. 변수명을 string 형식으로 사용하기 위한 서식 지정자 역할
2. $변수명 이후 띄어쓰기를 하지 않으면 템플렛 적용X, 이를 방지하기 위해 항시 ${변수명} 으로 구분해 사용 권장
3. 순수하게 $를 사용하여 싶으면 '\$' 로 사용
4. ${논리식} 안에 논리식도 사용 가능
fun main(){
val name = "joyce"
println("my name is ${name}I'm 23")
println("1==0 is ${1==0}") // 1==0 is False
}
💡조건식
1. JAVA와 동일하게 작성 가능
2. kotlin에는 삼항 연산자가 없기 때문에 간결하게 표현하기 위해 아래와 같이 사용 권장
//JAVA와 동일한 방식
fun maxBy(a : Int, b : Int) : Int{
if(a>b){
return a
}
else{
return b
}
}
// 간결한 방식(삼항연산자를 대신함)
fun maxBy2(a : Int, b : Int) : Int = if(a>b) a else b
3. JAVA 의 switch를 대신하여 when 을 사
4. 변수에 값을 할당할 때도 when을 사용할 수 있디만 반드시 else로 조건 외 경우까지 처리 필요
fun checkNum(score : Int) {
when(score) {
0->println("this is 0") // when문에서 조건이 맞을 경우 결과는 '->'사용
1->println("this is 1")
2,3->println("this is 02 or 3")
}
}
// 변수에 값을 할당할 때도 사용 //when 조건문을 사용해 값을 만들어냄
var b : Int = when(score){ // java에서는 이런 처리X
1->1
2->2
else -> 3 // 1,2 이외의 경우도 처리 필요
}
when(score){
in 90..100 -> println("you are genius") //포함 여부는 'in'
in 10..80 -> println("not bad")
else -> println("ok")
}
💡Expression vs. Statement
1. 값을 만들어 내면 expression, 단순 실행만 시키는 것이라면 statement
2. kotlin의 모든 함수는 expression (return 타입이 Unit 이여도 Unit 이라는 값을 만들어내는 것!!)
3. JAVA의 함수는 return값이 void면 진짜로 어떤 값도 만들어내지 않음
4. JAVA와 달리 Kotlin은 when을 사용하면 조건문으로도 값을 만들어내기 때문에 expression으로 사용된다.
💡Array vs. List
Array
1. size 고정
2. size를 변경하지만 않는다면 요소 변경 가능(Mutable)
List
1. size 고정 X
2. 요소 변경 불가능
3. 가져오는 것만 가능, 요소 add/remove/수정 불가
ArrayList(Mutable List)
1. size 고정 X
2. 요소 변경 가능
3. add, remove, 수정 가능
fun array():Unit{
val array : Array<Int> = arrayOf(1,2,3)
val list : List<Int> = listOf(1,2,3)
val array2: Array<Any> = arrayOf(1,"d",3.4f)
val list2 : List<Any> = listOf(1,"d",11L)
array[0] = 3 // array는 size만 그대로라면 변경 가능
var result : Int = list.get(0) // list는 get(가져오기)만 가능
val arrayList : ArrayList<Int> = arrayListOf<Int>()
arrayList.add(10)
arrayList.add(20)
arrayList[0] = 20
// 이미 값을 갖고 있는 arrayList에 새로운 arrayList 배열을 할당하면 오류!!
arrayList = arrayListOf()
}
✔️val은 값을 변경 불가한 변수인데 array, arrayList에 사용하는 이유?
→ 배열의 변수는 '배열의 주소'를 가르키고 있다. 따라서 그 안에 담긴 원소를 변경하는 것은 상관X
ex. 우리집에는 많은 사람들이 드나들지만 우리집의 주소는 바뀌지 않음
💡반복문
for
1. 파이썬 for문과 유사
- for ( i : int in 1..10) - 1~10까지
- for ( i : int in 1 until 10) - 1~10까지 (10 포함 X)
- for ( i : int in 1..10 step 2) - 1~10까지 2개씩 건너뜀
- for ( i : int in 10 downTo 1) - 10에서 1까지 반대로
- for ((index :int , name : int) in students.withIndex()) - students에 저장되어 있는 내용과 index 번호까지 함께 전달
while
1. 일반 while문과 동일
💡Nullable / NonNull
- Null pointer Exception 처리를 조건문 사용 등 많은 코드 사용 없이 연산자로 처리
?
1. '?' 를 붙여 Null이 들어갈 수 있는 경우 nullable 타입의 변수로 선언 가능
2. nullable 타입의 변수 사용시, 해당 변수가 null인지 아닌지 모르기 때문에 컴파일 타임 에러가 뜰 수 있다.
이때도 nullable 타입 변수에 '?' 붙여 사용하면 null 이 아닐 때 기능을 수행하고, null 일 때는 null을 반환
var name : String = "joyce"
var nullName : String? = null
var nameInUpperCase : String = name.toUpperCase()
var nullNameInUpperCase : String? = nullName?.toUpperCase()
// nullName이 null 이면 nullNameInUpperCase도null
?:
1. null 일 때 null을 반환하는 것 외에 다른 반환을 하고 싶을 때 다음과 같이 사용
nullable 타입 변수 ?: null 일때 반환할 데이터
val lastName : String? = null
val fullName : String = "joyce" + (lastName?: "No lastName")
!!
1. 절대 null 이 들어올 일이 없다는 것을 명시하는 연산자
2. 정말 확실한 상황이 아니면 사용 지양
fun ignoreNulls(str : String?){
val mNotNull : String = str!!
// str은 nullable 타입 매개변수지만 절대 null이 될 일이 없다는 명시
val upper : String = mNotNull.toUpperCase() //오류X
val email : Stirng? ="keung903@naver.com"
email?.let{ // email이 null이 아닐때만 let 람다식 안으로 email 옮겨줌
println("my email is ${email}") // email이 null 아닐 때만 수행
}
}
💡Class
1. class 선언 시, class 'class명'
2. 인스턴스 생성 시, 클래스 변수 = class명()
3. 생성자는 constructor 사용
4. class 매개변수의 변수명과 property 변수명이 같을 경우, 굳이 변수 선언 따로 안 하고 매개변수로 그대로 변수 사용. (constructor 도 사용 안 해도 됨)
5. class 매개변수에 default 값을 주면 인스턴스 객체 생성시, 생성자 매개변수를 주지 않아도 알아서 빈 생성자를 만든다.
class Human(){
fun eatingCake(){
println("yummy")
}
}
class Human constructor(val name : String = "Annonyomus"){
val name = name // 생략 가능 -> constructor생략 가능
fun eatingCake(){
println("yummy")
}
}
fun main(){
val human = Human("minsu")
val stranger = human() // deafult 값이 있으므로 오류X
human.eatingCake()
println("this human's name is ${human.name}")
}
6. init() 로 인스턴스 생성 시, 초기화 동작 설정 가능
7. 생성자 오버로딩 시, constructor 사용.
주생성자 및 init()를 우선적으로 초기화 하기 때문에 주생성자에 있는 매개변수가 추가 생성자에도 똑같이 사용되면 굳이 작성하지 않아도 됨.
8. 상속 및 오버라이딩 시, open 붙여줌.
부모 클래스의 주생성자 및 init() 먼저 호출 → 자식 클래스 주생성자 호출 → 자식 클래스 추가생성자 호출
open class Human constructor(val name : String = "Annonyomus"){ // 상속가능
//val name = name // 생략 가능 -> constructor생략 가능
init(){
println("Now human has been born!!")
}
open fun singAsong(){ // 함수 오버라이딩 가능
println("lalala")
}
}
class Korean : Human(){
override fun singAsong(){
super.singAsong() // 부모클래스의 함수 호출
println("라라라")
}
}
fun mian(): Unit(){
val korean = Korean()
korean.singAsong() // 부모클래스 init 호출 -> 부모클래스 singAsong -> 자식클래스 singAsong
}
'Kotlin' 카테고리의 다른 글
[Kotlin 문법] apply / run / with / let / also 확장함수 (1) | 2024.07.01 |
---|---|
[Kotlin] 고급 문법 (0) | 2022.07.13 |