본문 바로가기

Language17

[Kotlin] zip(), mapIndexed(), filterNotNull() Leetcode 알고리즘 문제를 풀다가 자주 쓰지 않았던 함수를 사용하게 되어 정리를 하게 됐다. Leetcode - Find the Town Judge / https://leetcode.com/problems/find-the-town-judge/description/ Find the Town Judge - LeetCode Can you solve this real interview question? Find the Town Judge - In a town, there are n people labeled from 1 to n. There is a rumor that one of these people is secretly the town judge. If the town judge exists, the.. 2023. 7. 9.
[Kotlin IN ACTION] - 코틀린 생성자(2) 부 생성자 생성자가 여럿 필요한 경우가 가끔 있다. 가장 일반적인 상황은 프레임워크 클래스를 확장해야 하는데 여러 가지 방법으로 인스턴스를 초기화 할 수 있게 다양한 생성자를 지원해야 하는 경우다. 예시 View 클래스가 있다. 그 클래스를 코틀린으로 코드를 작성하면 open class View { constructor(ctx : Context) { ... } construcotr(ctx : Context, attr : AttributeSet) { .... } } 위 코드로 작성할 수 있다. 해당 클래스는 주 새성자를 선언하지 않고 부 생성자만 2개 선언했다. 부 생성자는 constructor 키워드로 시작한다. 위 클래스를 확장하면서 똑같이 부 생성자를 정의할 수 있다. class MyButton : .. 2022. 7. 29.
[Kotlin IN ACTION] - Kotlin 클래스 선언(주 생성자, 프로퍼티) 클래스 초기화 아래의 코드를 보고 설명하겠다. class User(val nickname : String) 보통 클래스의 모든 선언은 중괄화 '{ }' 사이에 들어간다. 하지만, 이 클래스 선언에는 중괄호가 없고 괄호 사이에 val 선언만 존재한다. 그 이유는 무엇일까? 이렇게 클래스 이름 뒤에 오는 괄호로 둘러 싸인 코드를 주 생성자 (primary constructor)라고 부른다. 주 생성자는 두 가지 목적에 쓰인다. 생성자 파라미터를 지정한다 그 생성자 파라미터에 의해 초기화되는 프로퍼티를 정의한다. 위 코드처럼 간단한 클래스 선언이 아닌, 같은 목적을 달성할 수 있는 가장 명시적인 선언으로 푼 코드를 확인해보자. class User constructor(_nickname : String) { /.. 2022. 7. 25.
[Kotlin IN ACTION] - Kotlin sealed 클래스 봉인된 클래스 : 클래스 계층 정의시 계층 확장 제한 예제 코드를 보고 설명을 하겠다. interface Expr class Num (val value : Int) : Expr class Sum (val left : Expr, val right : Expr) : Expr fun eval (e : Expr) : Int = when(e) { is Num -> e.value is Sum -> eval(e.right) + eval(e.left) else -> throw IllegalArgumentException("Unknown expression") } 위 코드를 확인해보면, 우리가 eval 함수 내에서 작성한 when 식에서 else 라는 분기를 반드시 넣어주어야 한다는 사실을 알 것이다. 코틀린 컴파일러는.. 2022. 7. 25.
[Kotlin IN ACTION] - Kotlin 접근 제어자(가시성 변경자) / 내부 클래스 / 중첩 클래스 가시성 변경자 (접근 제어자) 코드 기반에 있는 선언에 대한 클래스 외부 접근을 제어한다. 어떤 클래스의 구현에 대한 접근을 제한함으로써 그 클래스에 의존하는 외부 코드를 깨지 않고도 클래스 내부 구현이 변경 가능하다. Kotlin 접근 제어자 종류 public(기본 가시성) internal protected private 아무 변경자가 없는 경우는 public 이다. 변경자 클래스 멤버 최상위 선언 public 모든 곳에서 볼 수 있다. 모든 곳에서 볼 수 있다. internal 같은 모듈 안에서만 볼 수 있다. 같은 모듈 안에서만 볼 수 있다. protected 하위 클래스 안에서만 볼 수 있다. (최상위 선언에 적용할 수 없음) private 같은 클래스 안에서만 볼 수 있다. 같은 파일 안에서만 .. 2022. 7. 25.
[Kotlin IN ACTION] - Kotlin open / final / abstract 상속 제어(접근) 변경자 open 변경자 자바에서는 final 을 사용한 클래스는 상속이 안된다는 걸 알고 있을 것이다. 반대로 말을하자면, final 을 안 쓴 클래스는 모든 클래스가 상속 받을 수가 있다. 하지만 이렇게 기본적으로 상속이 가능하면 편리한 경우도 많지만, 문제가 생기는 경우가 많다. 취약 기반 클래스(fragile base class) 라는 문제가 있다. 그게 무엇이냐면, 하위클래스가 기반 클래스에 대해 가졌던 가정이 기반 클래스를 변경함으로써 깨져버린 경우에 생긴다. 어떤 클래스가 자신을 상속하는 방법에 대해 정확한 규칙(어떤 메서드를 어떻게 오버라이드해야 하는지 등)을 제공하지 않는다면 그 클래스의 클라이언트는 기반 클래스를 작성한 사람의 의도와 다른 방식으로 메서드를 오버라이드할 위험이 있다. 모든 하위 .. 2022. 7. 22.
[Kotlin IN ACTION] - Kotlin Interface(인터페이스) 코틀린 인터페이스 코틀린 인터페이스는 자바 8 인터페이스와 비슷하다. 코틀린 인터페이스는 안에는 추상 메서드뿐 아니라 구현이 있는 메서드도 정의할 수 있다. 다만, 인터페이스에는 아무런 상태(field)도 들어갈 수 없다. // click 이라는 추상 메서드가 있는 인터페이스 정의 interface Clickable { fun click() } 이 인터페이스를 구현하는 모든 비추상 클래스(또는 구체적 클래스)는 click 에 대한 구현을 제공해야 한다. // 인터페이스 file interface Clickable { fun click() } // 구체적 클래스 file class Button : Clickable { override fun click() = println("I was clicked") }.. 2022. 7. 22.
[Kotlin IN ACTION] - Kotlin 로컬 함수와 확장 많은 개발자들이 좋은 코드의 중요한 특징 중 하나가 중복이 없는 것이라고 믿는다. 그래서 많은 경우 메소드 추출 리팩토링을 적용해서 긴 메소드를 부분부분 나눠서 각 부분을 재활용 한다 하지만 그렇게 코드를 리팩토링하면 클래스 안에 작은 메소드가 많아지고, 각 메소드 사이의 관계를 파악하기 힘들어서 코드를 이해하기가 더 어려워질 수 있다. 또한 이 부분을 해결하고자, 추출한 메소드를 별도의 내부 클래스 안에 넣으면 코드가 깔끔하게 조직할 수는 있지만, 그에 따른 불필요한 준비 코드가 늘어난다. 코틀린에서는 더 깔끔한 해법이 존재한다. 코틀린에서는 함수에서 추출한 함수를 원 함수 내부에 중첩 시킬 수 있다. 코드 중복을 보여주는 예제 class User(val id : Int, val name : Strin.. 2022. 7. 21.