Kotlin 기초정리 - 반복문,Nullable,클래스

4 min read

책만 보다가 다시 강의도 이어 보면서 정리 시작!
확실히 책으로 글만 쭉쭉 보다가 따라 쓰면서 정리하니 더 확 와닿는다.
아무튼 시작~
🔁 For / While 반복문
1. 기본 for
문
Java의 for (String name : list)
와 비슷하지만, Kotlin은 for (item in collection)
형식만 쓰면 됨.
fun forAndWhile() {
val students = arrayListOf("sy", "hihi", "momo")
for (name in students) {
println(name)
}
}
2. 범위 지정 반복
var sum: Int = 0
for (i in 1..10) {//1부터 10까지 포함
sum += i
}
println(sum) // 55
3. step 키워드로 증가 간격 조절(홀수만 더하기)
var sum: Int = 0
for (i in 1..10 step 2) {
sum += i
}
println(sum) // 1,3,5,7,9 가 더해질거라서 25
4. downTo
로 감소 반복
var sum: Int = 0
for (i in 10 downTo 1) {//10부터 1까지..
sum += i
}
println(sum)
5. until
은 마지막 숫자 제외
var sum: Int = 0
for (i in 1 until 100) {//100을 포함하지 않는 1부터99번만 포함
sum += i
}
println(sum)
6. while
문 기본 사용법
var index = 0
while (index < 10) {
println("current index : $index")
index++
}
7. index와 값 함께 출력: withIndex()
val students = listOf("sy", "hihi", "momo")
for ((index, name) in students.withIndex()) {
println("${index}번째 학생 : $name")
//sy,hihi,momo순서대로 노출됨.
}
🔒 Null Safety (Nullable vs Non-null)
자바의 대표적인 예외 중 하나인 NullPointerException
(NPE)을 컴파일 타임에 미리 방지해준다!
// npe : null point exception → 자바는 런타임 때 잡히는데,
// 코틀린은 컴파일 시점에서 잡을 수 있음 → ? 를 사용해서 방지
var name: String = "sy" // null이면 안 됨
var nullName: String? = null // ? 붙이면 nullable
var nameInUpperCase = name.toUpperCase()
// 아래는 에러 → nullName이 null일 수 있어서 경고 뜸
var nullNameInUppercase = nullName.toUpperCase()
// 안전하게 사용하려면
var nullNameInUppercase = nullName?.toUpperCase()
// null이 아니면 uppercase, null이면 null 반환됨
var name = "sy"
var nullName : String? = null //?붙여야해서 타입 생략하면 안됨
var nameInUpperCase = name.toUpperCase()
var nullNameInUppercase = nullName.toUpperCase()
//위와 같이 쓰면 빨간줄이 뜨는데 nullName가 Null인지 아닌지 몰라서 toUpperCase를 사용해야될지 모르겠다는 경고 뜸
var nullNameInUppercase = nullName?.toUpperCase() //그래서 ?를 붙여서 Null아니면 uppercase하고 nullName이 null이면 null을 반환함.
//이때 nullNameInUppercase는 string타입으로 추론이됨!
엘비스 연산자 (?:
) - 디폴트 값 주기
val lastName: String? = null // null일 수 있다.
var fullName = name + " " + (lastName ?: "no lastName") // null이면 no lastName
val lastName2: String? = "jung"
var fullName2 = name + " " + (lastName2 ?: "no lastName") // jung 사용됨
!!
- 컴파일에게 "null 아님!" 보장
확실하게 Null아님을 보장할 때 사용하는걸 추천!
fun ignoreNulls(str: String) {
val mNotNull: String = str!! // 절대 null 아님 보장
val upper = mNotNull.toUpperCase() // ? 안 써도 됨
}
//확실할 때만 쓰는 게 좋음!
let
사용 예시
kotlin복사편집var email: String? = "test@naver.com"
email?.let {
// 이메일이 null이 아니면 실행됨
println("my email is ${email}")
}
🧱 클래스와 생성자
기본 클래스
class Human {
val name = "sy"
fun eatingCake() {
println("yummy~")
}
}
fun main() {
val human = Human() // Java와 달리 new 키워드 불필요
human.eatingCake() // yummy~
println("this human's name is ${human.name}") //human.name에 sy가 출력됨.
}
생성자 정의(constructor)
// Java였다면 이런식으로 작성했을테지만..
class Human {
Human() {
println("yummy2~")
}
}
// Kotlin 기본 생성자는 이렇게 만든다.
class Human constructor(name: String) {
val name = name
}
→ 프로퍼티인 name과 constructor에서 쓰이는 name이 같아서 축약이 가능하다:
class Human constructor(val name: String){
}
//위에꺼 한번 더 줄이면 아래과 같이 constructor 생략해서 사용가능!
class Human(val name: String)
→ 디폴트 값도 가능!!:
class Human (val name: String="test"){
fun eatingCake(){
println("yummy~")
}
}
→ 디폴트 값을 넣음으로서 Human() 처럼 빈생성자도 생성 가능!
init
블록
class Human (val name: String="test"){
fun eatingCake(){
println("yummy~")
}
}
위의 코드에서는 생성자에서 코드블럭으로 실행할수가 없는데 코드블럭을 넣고싶으면 다음과 같이 한다.
class Human(val name: String = "test") {
init {
// 생성될 때 어떤 동작을 하고 싶은지 정의 가능
println("wow~")
}
fun eatingCake() {
println("yummy~")
}
}
부 생성자
constructor로 부생성자 생성이 가능하다.
class Human(val name: String = "test") { //이쪽 부분이 주 생성자
constructor(name: String, age: Int) : this(name) {
println("my name is ${name}, ${age} years old")
}
init {
println("wow~")
}
fun eatingCake() {
println("yummy~")
}
}
꼭 this 라는약어를 써서 생성자의 위임을 받아야함.
0
Subscribe to my newsletter
Read articles from seoyoon jung directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
