TIL 20231211

2023. 12. 11. 21:44코틀린

접근 제한자

객체를 이용해서 변수나 메소드를 호출할 수 있는지의 여부를 접근이라 한다.

접근권한을 통해 데이터에 무분별한 접근을 막을 수 있고, 클래스들간에 접근하면 안되는 상황을 구분하기 때문에 향후에 유지보수 하기에 용이하다.

 

프로젝트> 모듈> 패키지> 클래스

프로젝트

: 최상단 개념이고 모듈, 패키지, 클래스를 포함한다. 

 

모듈

:프로젝트 아래의 개념이고 패키지, 클래스를 포함한다.

 

패키지

: 모듈 아래 개념이고 클래스를 포함한다.

 

public: 명시하지 않으면 기본적으로 public 이다. (어디서나 접근가능)
private: 동일한 클래스 내부에서만 접근할 수 있다.
internal: 같은 모듈 내부에서만 접근할 수 있다.
protected: 기본적으로 private이지만 상속을 받은경우에 타 모듈에서 접근할 수 있다.

 

 

 

예외처리

프로그램을 실행하기 전에 알 수 있는 컴파일 에러를 오류라고 한다. 프로그램을 실행하는 도중에 발생하는 런타임 에러인 예외가 발생할 수 있어서 프로그램이 비상적으로 종료하게 한다....이는 심각하는 문제다.....

 

그래서 프로그램 실행도중에 발생하는 예외를 적절하게 처리해야하는데,

이를 예외처리라고 하며

미리 예외를 생각하고 소스코드를 작성해야 안정성을 높인 프로그램이라고 할 수 있다.

 

kotlin의 예외처리

1) try-catch 구조

 

fun method1() {
try {
예외가 발생할 가능성이 존재하는 코드
} catch(예외종류) {
예외가 발생했을때 처리할 코드
}
}

 

while(true) {
    try {
        var num1 = readLine()!!.toInt()
        println("내가 입력한 숫자는 ${num1}입니다")
        break
    } catch(e:java.lang.NumberFormatException) {
        println("숫자를 입력하세요")
    }
}

 

 

 

2) throw의 구조

fun method1(num1:Int) {
if(num1 > 10) {
throw 예외종류
}
}

 

while(true) {
    try {
        var num1 = readLine()!!.toInt()
        println("내가 입력한 숫자는 ${num1}입니다")
        break
    } catch(e:java.lang.NumberFormatException) {
        println("숫자를 입력하세요")
    } finally {
        println("키보드와의 연결은 정상적입니다")
    }
}

 

 

지연초기화

변수나 상수의 값을 나중에 초기화할 수 있다.

 

코틀린은 클래스를 설계할 때 안정성을 위해 반드시 변수의 값을 초기화할 것을 권장하며 설계시 초기의 값을 정의하기 난처하므로 나중에 대입하기 위한 문법이다. 저사용으로 제한되어 있는 환경에서는 메모리를 더욱 효율적으로 사용 할 수 있다.

 

초기화 하는 방법

코틀린은 지연초기화 또는 늦은초기화를 위해 lateinit, lazy 키워드를 활용하는데,
변수는 lateinit로, 상수는 lazy로 지연초기화한다.

 

변수의 지연초기화

fun main(){
    var s1 = Student()
    s1.name = "참새"
    s1.displayInfo()

    s1.age = 10
    s1.displayInfo()
}

class Student {
    lateinit var name:String
    var age:Int = 0

    fun displayInfo() {
        println("이름은: ${name} 입니다.")
        println("나이는: ${age} 입니다.")
    }
}

 

여기서 displayinfo를 불러 올때 isInitialized를 활용해서 값이 초기화되었는지 확인할 수 있고, 사용할때는 값이 아니라 참조형태로 사용해야하기 때문에 this:: 또는 ::를 붙인다.

 

fun displayInfo() {
    if(this::name.isInitialized) {
        println("이름은: ${name} 입니다.")
        println("나이는: ${age} 입니다.")
    } else {
        println("name변수를 초기화해주세요.")
    }
}

 

 

상수의 지연초기화

상수를 사용하는 시점에 값을 대입하고 초기화 수행된다.

 

fun main(){
    var s1 = Student()
    s1.name = "참새"
    s1.displayInfo()

    s1.age = 10
    s1.displayInfo()
}

class Student {
    lateinit var name:String
    var age:Int = 0
    val address: String by lazy {
        println("address 초기화")
        "seoul"
    }

    fun displayInfo() {
        println("이름은: ${name} 입니다.")
        println("나이는: ${age} 입니다.")
        println("주소는: ${address} 입니다.")
    }
}

 

 

널 세이프티

 

코틀린의 Null 안정성을 향상시켜줄 수 있다.

Null 예외는 프로그램의 가용성을 저하시키는 치명적인 오류이다. 안전한 설계를 위해 자료형에 Null 여부를 명시할 수 있다.

 

코틀린의 널 세이프티 방법

Null 예외로부터 안전한 설계를 위한 다양한 키워드들을 지원한다.

?,!!,?.,?:를 이용해서 Null 예외로부터 벗어나려고 하며 강제로 null이 아니라고 하는 !!는 최대한 사용을 지양하는 편이 좋다.

각 의미를 간략히 설명하자면, 

 

널을 가질 수 있다. 


?. 

널 아닐 때만 출력 가능 널이 아닐때는 그 문자열 그대로 출력한다.

 

?:

엘비스 연산자라고 하며, 널 아닐 때와 그럴 때를 구별 할 수 있다. 널 일 때 널이 아닌 다른 문자열으로 대체해서 출력 가능하다.


조금씩 배웠던 것들을 되새감질 할 수 있게 해준다,,, ㅠㅠ

공부 파이팅 하자 다음엔 내가 다 쓸수있도록

'코틀린' 카테고리의 다른 글

TIL 20231213  (0) 2023.12.13
TIL 20231212  (0) 2023.12.12
WIL 20231209  (0) 2023.12.09
TIL 20231208  (0) 2023.12.08
TIL 20231207  (1) 2023.12.07