쏭식
Ssongcode;
쏭식
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • JAVA (21)
      • Basic (21)
    • Kotlin (14)
      • Basic (14)
    • Android (64)
      • Basic (24)
      • JETPACK (30)
      • Compose (8)
      • 파고들기 (2)
    • Project (4)
    • etc (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 리사이클러뷰
  • 코테
  • DataBinding
  • AAC
  • 알고리즘
  • Kotlin
  • mvvm
  • Adapter
  • 코틀린
  • 프로젝트회고
  • 메소드
  • 자료구조
  • workmanager
  • Room
  • 코딩테스트
  • Android
  • 기초100제
  • 변수
  • 자바
  • 객체지향
  • 코틀린코테
  • 배열
  • 백준
  • 상속
  • 컴포즈
  • compose
  • Jetpack
  • ViewModel
  • 코드업100제
  • livedata

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쏭식

Ssongcode;

[Kotlin/Basic] 코틀린에서의 클래스
Kotlin/Basic

[Kotlin/Basic] 코틀린에서의 클래스

2022. 8. 15. 23:59

1. 클래스와 프로퍼티

class Person constructor(name : String, age : Int){
    val name = name
    var age = age
}

자바에서는 클래스를 생성해주고 안에 Person( ) 하고 생성자를 만들어 주었는데,

코틀린에서는 클래스를 생성한 뒤 constructor를 통해 생성자를 적어준다.

이 때 자동으로 getter, setter가 만들어지고, 이 constructor는 생략이 가능하다!!

val person = Person("ssongsik", 25)
println(person.name) 

또한, person.getName을 통해 데이터를 불러왔어야 했는데 위와 같이 person.name으로 이름을 불러올 수 있고,

setter 또한, person.setAge(10)가 아닌 person.age = 10를 통해 변경할 수 있다.

2. 생성자와 init

만일 위와 같은 생성자가 있는데, age에 0 이하의 값이 들어온다고 하면 나이가 될 수 없으니 예외처리를 해야만 한다.

그럴 때 우리는 init 블록을 사용할 수 있다.

init{ //클래스가 초기화되는 시점에서 한 번 실행되는 지점, 생성자가 실행되는 시점
    if(age <= 0){
        throw IllegalArgumentException("나이는 ${age}일 수 없습니다.")
    }
    println("초기화") //이는 역순으로 실행됨. = 초기화 블록부터 차례로 호출된다.
}

init은 클래스가 초기화 되는 시점에서 한 번 실행되는 지점으로서 생성자가 실행되는 시점이다!

따라서 이 때 age <= 0 일 때 예외처리를 하여 age의 값을 올바르게 받아낼 수 있다.

 

또한, 예를 들어, 새로 태어난 사람은 나이가 1살이기 때문에 이에 해당하는 생성자를 하나 더 만드려고한다면

자바에서는 Person(String name) { this(name, 1) } 이렇게 하나 더 만들어주었다.

 

하지만 코틀린에서 생성자를 추가하고 싶은 경우에는 위의 생성자를 그대로 두고 아래 생성자를 새로 적어준다.

constructor(name : String): this(name, 1){
    println("첫 번째 부 생성자")
}

위에 있는 생성자를 주 생성자로 부르고, 반드시 존재해야한다.

반면, 아래 있는 생성자(새로운 생성자)는 부 생성자로 부르고, 없을 수도 있다.

또한, 부 생성자를 사용할 때에는 주 생성자를 this로 반드시 호출해야한다!!!

 

->하지만 부 생성자 보다는 default파라미터를 넣어서 하는 것을 권장하고 있다!

3. 커스텀 getter, setter

위의 클래스에서 만일 age가 20이상일 때 성인인지 아닌지 판단하는 함수를 만든다고 가정해보자.

fun isAdult() : Boolean{
    return this.age >= 20
}

이렇게 만들 수도 있지만 다음과 같이 getter를 커스텀해서 만들 수 있다!!

val isAdult1 : Boolean
get() {
    return this.age >= 20
}

val isAdult2 : Boolean
 get() = this.age >= 20

이렇게 함수로 표현하는 것이 아니라 하나의 프로퍼티로 만들어 사용가능하다!!

 

또한, 다음과 같이 자기 자신을 변형하는 것을 커스텀해서 사용할 수도 있다!

4. backing field

생성자에서 val 로 선언하면 자동적으로 getter가 만들어지기 때문에 다음과 같이 지우고 생성한다.

class Person1 (
    name : String, var age : Int
){

이제 이 name을 커스텀해서 자동적으로 대문자로 바꿔서 출력하는 getter를 만들어보자!

val name = name
 get() = name.uppercase()

이름을 받아서 name.uppercase()를 사용하는 것이 상식적으로 맞는데, 이렇게 사용하면 에러가 발생한다.

왜냐하면 위에서 person.name을 하면 자동적으로 getter가 호출된다고 설명했는데

name.uppercase()의 name에서 get을 호출하게 되고, 왼쪽 get()에서는 또 다시 name을 불러오기 때문에

무한루프가 발생한다. 

따라서 우린 field를 사용할 수 있다.

val name = name
 get() = field.uppercase()

무한루프를 막기위한 예약어, 자기 자신을 가리킨다!

 

 

 

GitHub - SsongSik/Kotlin_Java_Practice: Practice kotlin grammar compared to Kotlin and Java.

Practice kotlin grammar compared to Kotlin and Java. - GitHub - SsongSik/Kotlin_Java_Practice: Practice kotlin grammar compared to Kotlin and Java.

github.com

 

저작자표시 (새창열림)

'Kotlin > Basic' 카테고리의 다른 글

[Kotlin/Basic] 코틀린에서의 접근제어  (0) 2022.08.23
[Kotlin/Basic] 코틀린에서의 상속  (0) 2022.08.22
[Kotlin/Basic] 코틀린에서의 함수  (0) 2022.08.14
[Kotlin/Basic] 코틀린에서의 예외처리  (0) 2022.08.13
[Kotlin/Basic] 코틀린에서의 반복문  (0) 2022.07.27
    'Kotlin/Basic' 카테고리의 다른 글
    • [Kotlin/Basic] 코틀린에서의 접근제어
    • [Kotlin/Basic] 코틀린에서의 상속
    • [Kotlin/Basic] 코틀린에서의 함수
    • [Kotlin/Basic] 코틀린에서의 예외처리
    쏭식
    쏭식

    티스토리툴바