Apple is Apple
article thumbnail

일일 회고

 

어제 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) 중 싱글턴 패턴에 대해 알아보는 것도 좋다.

https://ko.wikipedia.org/wiki/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4_%EB%94%94%EC%9E%90%EC%9D%B8_%ED%8C%A8%ED%84%B4

 

Kotlin은 object, companion object 키워드를 통하여 싱글턴을 간단하게 구현할 수 있다.

profile

Apple is Apple

@mjjjjjj