Kotlin

Kotlin 4주차

wlsds00_ 2024. 2. 2. 11:17

접근제한자

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

 

  • 외부에서 데이터에 무분별하게 접근하는 것을 막기 위해 사용.
  • 내부에서 작업을 위해 사용되는 변수나 부분작업을 위한 메서드 등을 감추기 위해 사용.

접근 제한자의 종류

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

프로젝트 > 모듈 > 패키지 > 클래스 : 오른쪽으로 올수록 작은 단위, 큰 개념은 아래 개념을 포함함.

 

예외 처리의 활용

예외 처리란? 

  • 프로그램 실행 도중에 문제가 발생했을 때 다른 처리를 함으로서 흐름을 옮기는데 사용.
  • 미리 예상 가능한 예외처리를 함으로서 프로그램이 비정상적으로 종료되는 것을 막음.

Compile Error : 프로그램을 실행하기 전, 컴파일 단계에 알 수 있는 에러.

                            오타, 잘못된 구문, 자료형 에러 등 여러 이유로 발생함.

Runtime Error : 프로그램 실행 시점에서 발생하는 에러, 컴파일 에러와 달리 바로 알 수 없다.

Logical Error : 컴파일에서 문제가 없고, 런타임 에러가 발생하는 것도 아니지만 원래 의도대로 작동하지 않는 에러

 

// 코틀린의 예외처리 방법

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

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

// 2-2. try-catch-finally
// 예외 처리와 관계없이 항상 실행하는 코드를 finally 에 작성
while(true) {
	fun method1() {
		try {
			예외가 발생할 가능성이 존재하는 코드
		} catch(예외종류) {
			예외가 발생했을때 처리할 코드
		} finally {
			예외 처리와 관계없이 항상 실행하는 코드
		}
	}
}

 

지연초기화

지연초기화란? : 변수나 상수의 값을 나중에 초기화 할 수 있음.

 

  • 코틀린은 클래스를 설계할 때, 안정성을 위해 반드시 변수의 값을 초기화 할 것을 권장함.
  • 초기값을 바로 정의하기 어려워 나중에 대입하기 위한 문법.
  • 변수는 lateinit 으로, 상수는 lazy 로 지연초기화 함.
  • 저사양으로 제한된 환경에서 메모리를 더욱 효율적으로 사용 가능.
// 1-1. lateinit 기본 사용
lateinit var 변수명:String

// 1-2. lateinit 고급 사용
// isInitialized 를 활용하여 값의 초기화 확인 가능(true / false)
// 사용 시 값이 아니라 참조형태이기 때문에 this:: 또는 :: 를 붙임
(this::변수명.isInitialized)

// 2. lazy 사용
val 상수명: String by lazy

 

널 세이프티

널 세이프티란? : Null 예외로부터 안전한 설계를 위해 제공되는 키워드.

 

  • Null 예외는 프로그램의 가용성을 저하시키는 치명적인 오류.
  • 코틀린은 안전한 설계를 위해 자료형에 Null 여부 명시 가능.
  • 종류로는 ? / !! / ?. / ?: 가 있음. 단 강제로 null 이 아님을 보장하는 !!는 사용을 최대한 지양하길 권장.
// ? : null 을 저장할 수 있음을 선언
var 변수명:String? = null

// !! : 리턴값이 null 이 아님을 보증
var inputData = readLine()!!

// ?. : null 인지 아닌지 확인 후 null 이 아닐때만 참조
//     이를 안전 호출 연산자(safe - calls)라고 함
var 변수명:String? = null
println("${변수명?.length}")

// ?: : null 대신 다른 문자열을 출력 가능
//     이를 엘비스 연산자라고 함.
var 변수명:String? = null
println("${변수명?.length ?: "초기화하세요"}")

 

배열

  • 일반적으로 변수 선언 시, 위치정보가 연속적이지 않기 때문에 순서가 없음.
  • 배열을 통해 변수에 순서를 매겨 연속적으로 활용 가능.
  • 코틀린은 배열을 사용하기 위해 arrayOf메소드(키워드) 를 제공.
// arrayOf메소드를 호출하면 배열을 리턴해줌
// 1,2,3,4,5 각각을 저장한 변수 5개를 배열형태로 arr에 저장함
var arr = arrayOf(1,2,3,4,5)

// 배열요소를 모두 출력함
println(Arrays.toString(arr))

// 배열의 첫번째 요소에 저장된 값을 출력함
// var num1 = 1의 num1과 arr[0]은 동일함
// arr[0]은 하나의 변수로 취급할 수 있음
// arr은 0~4번방(인덱스)까지 접근할 수 있음
println(arr[0])

 

배열은 어디에 사용하는지? 

  • 배열이 없다면 변수를 각각 선언해야 해 반복접근이 어렵고, 여러 변수를 만들어야 함. (예 : 변수1, 변수2 …)
  • 배열을 사용하면 변수들을 묶어 효율적으로 코드 작성 가능.

 

컬렉션

컬렉션이란? : 개발에 유용한 자료도구, 코틀린에서는 리스트, 맵, 집합 자료구조를 지원

 

List : 리스트는 읽기 전용 / 수정 가능으로 구분. 배열과 달리 크기가 정해져 있지 않아 동적 값 추가 가능.

// 1. 읽기 전용 List
var 변수명 = listOf(값1, 값2, 값3)

// 2-1. 수정 가능 List
var 변수명 = mutableListOf(값1, 값2, 값3)
변수명.set(인덱스, 값)

// 2-2. 수정 가능 List
// array 로 데이터들을 저장하는 arrayList도 mutableListOf와 동일하게 사용 가능
// 저장할 데이터의 자료형을 < > 안에 지정해야 사용 가능
var 변수명 = arrayListOf<자료형>(값1, 값2, 값3)
변수명.set(인덱스, 값)

 

Map : 키와 값이 쌍이 되어 이루어진 자료형. 읽기 전용 / 수정 가능으로 구분.

// 1. 읽기 전용 Map
var 변수명 = mapOf("값1" to 1, "값2" to 2, "값3" to 3)
println(변수명["값1"])

// 2. 수정 가능 Map
var 변수명 = mutableMapOf("값1" to 1, "값2" to 2)
변수명["값1"] = 3
println(변수명["값1"]) // 결과 : 3

// Map의 키와 값을 동시에 추출해서 사용 가능
for((k, v) in 변수명) {
	println("${k}의 값은 ${v}입니다.")
}

 

Set : 순서가 존재하지 않고 중복없이 데이터를 관리하는 집합 자료형

         다른 컬렉션은 요소를 찾는데에 집중하지만, Set은 요소의 존재여부에 집중.

// 1. 읽기 전용 set
var 변수명 = setOf("값1", "값2", "값3")

// 2. 수정 가능 set
var 변수명 = mutableSerOf("값1", "값2", "값3")
변수명.add("값4")
변수명.remove("값1")
println("집합의 크기는 ${변수명.size}입니다.") // 4추가 > 1삭제로 3출력

// 3. 고급 활용 : 교집합, 차집합, 합집합으로 간편하게 요소 추출 가능
var 변수1 = setOf("값1", "값2", "값a", "값b")
var 변수2 = setOf("값a", "값b", "값c")

// 합집합 : 모든 변수 출력
var union변수 = 변수1.union(변수2) //값1, 값2, 값a, 값b, 값c 출력

// 교집합 : 변수 1 안에서 2와 일치하는 경우 출력
var intersect변수 = 변수1.intersect(변수2) // 값a, 값b 출력

// 차집합 : 변수 1 안에서 2와 일치하지 않는 경우 출력
var subtract변수 = 변수1.subtract(변수2) // 값1, 값2 출력

 

제네릭(Generic) 이란? 

  • 코드 작성중 여러 타입에 동일한 로직을 적용하는 경우가 많음.
  • 그럴 때 매번 Any 타입으로 받는것은 타입 안정성 저하.
  • 클래스 내부에서 사용할 자료형을 인스턴스 생성 시 고정.
  • 컴파일 시간에 자료형을 검색해 적당한 자료형을 선택할수 있게 함.
  • 객체 자료형의 안전성을 높이고, 형 변환의 번거로움이 줄어듬.

+) 보완이 필요한 부분이라 생각해 나중에 따로 공부할 예정

 

Single-expression function

  • 람다식을 이용해서 메소드를 간결하게 정의할 수 있음.
  • Java8 과 동일하게 코틀린도 람다식을 지원.

 

싱글턴

  • 메모리 전역에서 유일한 객체임을 보장하며 위치정보가 고정됨.
  • 보통 객체는 자원이 가능한 만큼 생성 가능하며 상이한 위치정보를 가지고 있어서 저장하는 값도 객체마다 고유함.
  • 프로그램이 실행되는 시점에 메모리에 바로 로드하여 위치를 잡음.

 

싱글턴을 어디에 사용하는가?

  • 전역적으로 활용 가능해서 다른 클래스들에 쉽게 접근 가능.
  • 공통적으로 사용하는 정보라면 메모리를 더욱 효율적으로 활용 가능.
  • 객체 자원간의 충돌 방지.

+) 추가공부가 필요할것같음

'Kotlin' 카테고리의 다른 글

Kotlin 3주차  (0) 2023.12.19
Kotlin 2주차  (0) 2023.12.12
Kotlin 1주차  (0) 2023.12.11