Java 15

[Kotlin] data class: toString, equals, hashCode, copy, componentN

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 어떤 클래스가 데이터를 저장하는 역할만을 수행한다면 `toStirng`, `equals`, `hashCode` 를 반드시 오버라이드 해야 한다. 다행히, 여러 IDE 에서는 자동으로 그런 메서드를 정의해주는 기능이 있다. 그런데 코틀린에서는 더 편하다. data class(데이터 클래스) `data` 라는 변경자를 클래스 앞에 붙이면 필요한 메서드를 컴파일러가 자동으로 만들어준다. `data` 변경자가 붙은 클래스를 데이터 클래스라고 한다. `Client` 를 데이터 클래스로 data class Client(val name: String, val postalCode: Int) 이제 `Cli..

Kotlin 2024.01.10

[Kotlin] inner class & nested class 자바와 비교해서 (feat. 직렬화)

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 자바처럼 코틀린에서도 클래스 안에 다른 클래스를 선언할 수 있다. 이것으로 `helper 클래스`를 캡슐화하거나, 코드 정의를 그 코드를 사용하는 곳 가까이에 두고 싶을 때 유용하다. 클래스 A 안에 다른 클래스 B 를 정의할 때 B 는 두 가지 유형으로 나뉜다. `nested class` 바깥쪽 클래스에 대해 참조를 저장하지 않는다. `inner class` 바깥쪽 클래스에 대한 참조를 저장한다. 자바와 달리 코틀린에서는, 안쪽에 있는 클래스는 디폴트로 바깥쪽 클래스 인스턴스에 대한 접근 권한이 없는 `nested class` 이다. 직렬화를 통해 inner / nested class 테..

Kotlin 2024.01.06

[Kotlin] 문자열 & 정규식

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 코틀린 문자열은 자바 문자열과 같다. 모든 코틀린 문자열을 자바 메서드에 넘겨도, 자바 문자열을 코틀린 메서드에 넘겨도 괜찮다. 특별한 변환도 필요없고 별도의 `Wrapper`(래퍼)도 필요 없다. 코틀린의 다양한 확장 함수 덕분에 표준 자바 문자열을 더 쉽게 다룰 수 있다. 문자열 나누기 코틀린에서의 문자열을 구분 문자열에 따라 나누는 작업을 알아보자 먼저 자바의 `split` 메서드를 간단히 사용해보자. public void splitString() { String str = "12.345-6.A"; String[] strings = str.split("."); for (String s..

Kotlin 2024.01.04

[Kotlin] 중위 호출 & 구조 분해 선언

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. infix call(중위 호출) 우리는 맵을 만들 때 `mapOf` 함수를 사용해서 아래처럼 만들어 왔다. val map = mapOf(1 to "one", 7 to "seven", 53 to "fifty-three") 그런데 여기서 `to` 는 코틀린의 특별한 키워드가 아닌 일반 함수라고 했다. 이 코드는 infix call(중위 호출)이라는 특별한 방식으로 to 라는 일반 메서드를 호출한 것이다. 중위 호출 시에는 수신 객체와 유일한 메서드 인자 사이에 메서드 이름을 넣는다. (`[수신 객체] [메서드 이름] [유일한 메서드 인자]`) 이 중위 호출이 가능한 메서드는 일반 호출로도 사용..

Kotlin 2024.01.03

[Kotlin] 컬렉션 처리 API 확장 & 가변 인자(vararg) 함수

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 자바 컬렉션 API 확장 이전에 코틀린 컬렉션은 자바와 같은 클래스를 사용하지만 더 확장된 API 를 제공한다고 했다. @Test fun collectionExtension() { val strings: List = listOf("first", "second", "fourteenth") println(strings.last()) // fourteenth printed val numbers: Collection = setOf(1, 14, 2) println(numbers.max()) // 14 printed } 이런 코드가 어떻게 작동할까? 어떻게 자바 라이브러리의 컬렉션에 대해 코틀린에서 ..

Kotlin 2024.01.03

[Kotlin] 확장 함수 & 확장 프로퍼티

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 확장함수 - 메서드를 다른 클래스에 추가하기 저번 글에서 코틀린 컬렉션은 자바 컬렉션과 똑같은 클래스이지만, 코틀린에서는 아래 코드에서처럼 자바보다 더 많은 기능을 쓸 수 있다고 했다. 우리는 extension function(확장 함수)를 사용하여 기존 JVM 언어 API 를 재작성하지 않고도 코틀린이 제공하는 여러 편리한 기능을 사용할 수 있다. 확장함수는 어떤 클래스의 멤버 메서드인 것처럼 호출할 수 있지만 그 클래스의 밖에 선언된 함수이다. `StringUtil` 이라는 파일을 만들어서 어떤 문자열의 마지막 문자를 돌려주는 메서드를 추가해보자. fun String.lastChar()..

Kotlin 2024.01.01

[Kotlin] 컬렉션에서의 함수 정의와 호출

Kotlin in Action 을 공부하고 Effective kotlin 의 내용을 조금 참조하여 정리한 글입니다. 코틀린 컬렉션, 문자열, 정규식에서의 함수 정의와 호출 기능을 알아봅니다. 코틀린 컬렉션 만들기 아래와 같이 set 과 리스트, 맵을 만들 수 있다. private val set = hashSetOf(1, 7, 53) private val list = arrayListOf(1, 7, 53) private val map = hashMapOf(1 to "one", 7 to "seven", 53 to "fifty-three") 여기서 `to` 는 코틀린의 키워드가 아닌 일반 함수이다. (나중에 조금 더 자세히 다룬다.) @Test fun printObjectType() { println(set...

Kotlin 2024.01.01

디자인 패턴 - 프록시 패턴(Proxy pattern) 자바 코드 예시로 보기

먼저 프록시(proxy)의 뜻을 살펴봅시다. 위처럼 proxy 는 대리, 대리인, 대용물 이라는 뜻을 가집니다. 그렇다면 프록시 패턴이라 하면, 누군가가 어떠한 일(역할)을 대신 해주는 모습의 디자인 패턴임을 예상할 수 있겠네요. Proxy pattern(프록시 패턴) 프록시 패턴은 클라이언트가 실제 서비스 객체를 대신하는 객체를 제공해주는 구조 디자인 패턴입니다. 클라이언트의 요청을 수신하고 일부 작업들을 수행한 다음 요청을 서비스 객체에 전달하는 형태이지요. 여기서 일부 작업들에는 흔히 접근 제어, 캐싱 등이 있습니다. 프록시 객체는 서비스 객체와 같은 인터페이스를 가지기 때문에 클라이언트에 전달되면 실제 객체와 상호적으로 교환이 가능합니다. 우리가 코드를 변경할 수 없는 클래스에 몇가지의 행동들을 ..

[JAVA] 이진 트리 백준 BOJ 1991 전위 순회, 중위 순회, 후위 순회

이진 트리(binary tree) 는 각 노드의 자식 노드(차수)의 개수가 2 이하로 구성되어 있는 트리입니다. 트리 영역에서 가장 많이 사용됩니다. 이진 트리 핵심 이진 트리 종류 이진 트리는 크게 아래 세 개로 나뉩니다. 그림만으로도 각각의 특징을 대충 느낌을 잡을 수 있을 텐데요. 편향 이진 트리(Skewed Binary Tree) 같은 높이의 이진 트리 중에서 최소 개수의 노드 개수를 가짐. 왼쪽 혹은 오른쪽 서브트리만을 가지는 이진트리. 포화 이진 트리(Full Binary Tree) 모든 레벨의 노드가 꽉 차있는 이진 트리. N = 2ᴴ - 1 을 만족한다. (N: 노드의 개수, H: 트리의 높이) 완전 이진 트리(Complete Binary Tree) 트리의 높이가 H 일 때 레벨 1 부터 ..

[JAVA] 트리 자바 백준 BOJ 11725, 1068

트리(Tree) 는 노드와 에지로 연결된 그래프의 특수한 형태입니다. 순한 구조(cycle) 이 없고, 1개의 루트 노드가 존재. 루트 노드를 제외한 노드는 단, 1개의 부모 노드를 가짐. 트리의 부분 트리(subtree) 역시 트리의 모든 특징을 따름. 리프노드는 트리에서 가장 하위에 존재하는 노드(자식 노드가 없는 노드) 입니다. 백준 11725 트리의 부모 찾기 https://www.acmicpc.net/problem/11725 11725번: 트리의 부모 찾기 루트 없는 트리가 주어진다. 이때, 트리의 루트를 1이라고 정했을 때, 각 노드의 부모를 구하는 프로그램을 작성하시오. www.acmicpc.net 1. 문제 분석 주어지는 데이터가 단순히 연결되어 있는 두 노드를 알려 주는 것이므로 데이터 ..