일일 회고
어제 Kotlin 기본 강의를 들은 이후 심화 강의를 들었다.
객체지향 프로그래밍 및 동시성 프로그래밍 (Thread & Coroutine) 과정이었는데, 이것도 이전에 공부는 해봤지만 꽤 어려운 개념들이다. 아직도 잘 모르는 부분이 많아서 다시 자세하게 복습한다는 마인드로 공부를 하였다.
강의를 진행하신 튜터님이 Thread, Coroutine 같은 경우는 안드로이드 프로그래밍을 할 때도 중요하게 작용한다고 하였으니 강의 외적으로 추가적인 자료를 찾아 공부를 해봐야겠다.
오늘의 주요 키워드
- 객체지향 프로그래밍
- Kotlin Collection
객체지향 프로그래밍 with Kotlin (이어서)
오버라이딩, 오버로딩 (차이 주의!)
오버라이딩
상속받은 부모클래스의 프로퍼티나 메소드를 재설계(재작성)한다. 즉, 기존의 메소드를 다시 작성하는 것이다.
장점 - 자식클래스가 부모클래스의 메소드를 상속받아도 다른 기능을 사용할 수 있음
단점 - 프로그램에 문제가 생기지는 않지만 재사용성이 떨어져 유지보수가 어려워짐
오버로딩
동일한 이름의 메소드를 여러 가지 형태(매개변수의 개수를 다르게)로 만드는 것 - 상속과 큰 관련 없음!
장점 - 동일한 기능을 하는 메서드를 하나의 이름으로 처리할 수 있음
인터페이스 (vs 추상클래스)
추상클래스 - 대락적인 설계와 공통의 기능들의 껍데기만 (구체화 x) 구현한 클래스
-> 추상클래스를 상속하는 클래스들은 추상클래스의 내용을 구체화해야 한다.
인터페이스 - 대락적인 설계와 공통의 기능들의 껍데기만 (구체화 x) 구현한 클래스이지만
추상클래스와 다르게 프로퍼티의 초기화가 불가능하다.
장점 - 틀만 만들어 놓고 후에 구현해서 사용하기 때문에 코드의 재사용성이 올라간다.
- 클래스 간의 의존성을 제거할 수 있다.
- 다중 상속이 가능하다. (클래스는 다중 상속 불가능)
접근제한자
말 그대로 변수나 메소드에 키워드를 붙여서 어느 정도에서까지 접근을 할 수 있는 지를 결정하는 것이다.
kotlin에서는 public, private, internal, protected가 있다.
제한 범위 | 동일 클래스 내 | 동일 모듈 내 | 다른 모듈 | 제한 x |
public | O | O | O | O |
private | O | |||
internal | O | O | ||
protected | O | (상속 받았을 때 O) | (상속 받았을 때 O) |
O가 되어있는 조건에만 해당 변수, 메소드에 접근이 가능하다.
+ 접근 제한을 이해하기 위해서 해당 용어를 알아야 한다.
- project: 최상위 개념이고 module, package, class를 포함한다.
- module: project의 하위 개념이고 package, class를 포함한다.
- package: module의 하위 개념이고 class를 포함한다.
- class: 최하위 개념으로 property, method를 가질 수 있다.
지연 초기화 (lazy initialization)
- 변수 선언할 때에 바로 초기화를 하는 것이 아니라 추후에 초기화를 해야 할 때가 있다.
- 이때, 지연초기화 키워드로 초기화를 진행한다.
// 변수의 지연 초기화
// 초기에 정의하기 어려울 때 lateinit을 사용한다
// lateinit은 val로는 선언을 못하고 var만 가능하다.
lateinit var a: String
// isInitialized로 초기화가 되었는 지 검사하여 안전성을 높인다.
// 사용할 때는 값자체가 아니라 참조형태로 사용해야 하기에 ::을 붙여 사용한다.
if(::a.isInintialized){
...
}
// 상수의 지연 초기화
// 상수가 불리는 시점에서 초기화된다.
val a by lazy {
1
}
장점 - 저사양으로 제한되어 있는 환경에서는 메모리를 더욱 효율적으로 사용할 수 있다.
Null Safety
Kotlin의 null 안정성을 도모한다.
NPE(NullPointerException)은 프로그램에 중대한 오류를 일으키기에 null에 관련된 처리가 굉장히 중요하다.
Java와 다르게 Kotlin은 기본적으로 변수에 null을 허용하지 않는다.
대신, 다양한 키워드( ?, !!, ?., ?: )로 null을 관리할 수 있다.
단, 강제로 null이 아니라고 하는!! 는 최대한 사용을 지양해야 한다.
(확실하게 null이 아닐 때만 사용하도록 한다. 그렇지 않으면 NullPointerException을 뿜어낼 것이다..)
// ? 키워드
// 변수에 null을 지정할 수 있도록 함
var nullableString: String? = null
// !! 키워드 - 사용 주의
// 해당 값이 null이 아님을 보장함
var data = input()!!
// ?. 키워드
// 해당 값이 null인지 확인하고 null이 아닐 때만 정상 실행 됨
// 그래서 안전 호출 연산자라고도 함
println(nullableString?.length)
nullableString?.map{ ~ }
// ?: 키워드
// ?. 키워드를 썼을 때 다른 방법으로 동작시키고 싶을 때 사용
// 엘비스 연산자라고도 함
println("${nullableString?.length ?: "길이가 0이에요"})
컬렉션
다양한 자료구조(List, Set, Map)을 제공한다.
Kotlin은 mutable한 컬렉션을 구분한다.(읽기 전용인지, 쓰기도 되는지)
- List: 배열과 달리 크기가 정해져 있지 않아 동적으로 값을 추가할 수 있음
- Set: 순서가 존재하지 않고 중복 없이 데이터를 관리하는 집합 자료형, 수학의 집합으로 생각하면 편함
- Map: 키(Key)와 값(Value)의 쌍으로 이루어진 자료형
ex) List
// 읽기 전용 리스트
val list1 = listOf(1,2,3)
// 읽기, 쓰기 둘 다 가능한 리스트
val list2 = mutableListOf(1,2,3)
val list3 = ArrayList<Int>(1,2,3)
list1[0] = 1 // 오류!!
list2[0] = 2 // 가능!!
list3[0] = 2 // 가능!!
Set
// 읽기 전용 Set
val set = setOf(1,2,3,4,4) // 같은 것이 여러개이면 1개로 취급된다.
// 수정 가능 Set
val mutableSet = mutableSetOf(1,2,3,4,4)
// Set은 요소가 존재하는 지에 대해 집중한다.
if(1 in set)
println("YES!!")
else
println("No..")
// union, subtract, intersact 메소드로
// 합집합, 차집합, 교집합을 실행 할 수 있다.
set.union(mutableSet)
..
Map
// 읽기 전용 Map
val map = mapOf("a" to 1, "b" to 2, "c" to 3, Pair("d",1))
// 수정 가능 Map
val mutableMap = mutableMapOf("a" to 1, "b" to 2, "c" to 3, Pair("d",1))
// 접근은 배열 접근처럼 하되 인덱스 대신 키 값으로 접근한다.
val value = map["a"]
Single-expression function
Kotlin은 람다식을 사용하여 간결한 메소드를 생성할 수 있다.
익명 메소드라고도 한다. 다른 언어에서도 지원하곤 한다.
메소드 중괄호 없이 대입연산자로도 줄여 쓸 수 있다.
사용하다 보면 코드도 간결해지고 작성하기 편해지니 알아두면 굉장히 좋다고 생각한다.
ex)
// 중괄호 생략
fun getInfo(): Student = student.getName()
// 익명 메소드
var add = {a: Int, b:Int -> a * b}
println("${add(1,2)}")
싱글턴(Singleton Object)
보통 객체는 자원이 가능한 만큼 생성할 수 있는데, 이때 각각의 객체는 각자의 위치정보를 갖고 있어 모두 고유하다.
이런 방식이 아닌 고정된 위치에 유일하게 보장된 객체를 만드는 것을 싱글턴이라고 한다.
추가적으로 소프트웨어 디자인 패턴(Design Pattern) 중 싱글턴 패턴에 대해 알아보는 것도 좋다.
Kotlin은 object, companion object 키워드를 통하여 싱글턴을 간단하게 구현할 수 있다.
'내일배움캠프 7기 > TIL' 카테고리의 다른 글
내일배움캠프 7기 Android TIL 6일차 (2023.07.21) (1) | 2023.07.21 |
---|---|
내일배움캠프 7기 Android TIL 5일차 (2023.07.20) (0) | 2023.07.20 |
내일배움캠프 7기 Android TIL 4일차 (2023.07.19) (0) | 2023.07.19 |
내일배움캠프 7기 Android TIL 2일차 (2023.07.17) (0) | 2023.07.17 |
내일배움캠프 7기 Android TIL 1일차 (2023.07.14) (0) | 2023.07.14 |