목록전체 글 (348)
파게로그
새로운 기능을 추가하여 클래스를 확장한다고 생각해보면, 새로운 클래스를 derive하거나, 특정한 디자인 패턴을 사용해야만 한다. 하지만 Kotlin에서는, 새로운 기능을 추가하여 클래스를 확장하기 위해서 extension function을 사용할 수 있다. 기본적으로 extension function이란, 클래스의 외부에 정의된, member function이다. 예를 들어, 어떤 문자열에 대해서 첫 번째와 마지막 문자가 제거된 새로운 문자열을 반환하는 메서드를 사용해야 하는 상황이라면, 이 메서드는 String 클래스에 미리 존재하는 메서드가 아니다. 이 때 해당 업무 수행을 위해 extension function을 사용할 수 있다. fun String.removeFirstLastChar(): Str..
Object Declarations Singleton은 객체지향 프로그래밍의 패턴 중 하나로서, 어떤 클래스가 하나의 인스턴스만을 가진다는 것이다. 예를 들어, SQL 데이터베이스 백엔드를 가지는 애플리케이션을 만들 때, 모든 고객에 대해 동일한 데이터베이스 연결을 재사용할 수 있도록 하기 위해 connection pool을 만들고 싶을 수 있다. 이를 위해서는 connection을 singleton class로 생성함으로써 모든 고객이 동일한 connection을 획득하도록 할 수 있다. Kotlin은 object declaration 기능을 통해 singletons을 쉽게 사용할 수 있는 방법을 제공한다. 이를 위해 object 키워드가 사용된다. object 선언은 properties, method..
sealed classes, sealed interfaces는 상속보다 강한 통제를 제공하는, 제한된 클래스 위계를 나타낸다. sealed class의 모든 subclass는 컴파일 타임에 알고 있게 된다. sealed class를 가진 모듈이 컴파일된 이후에는 어떤 subclass도 새로이 등장하지 않는다. 예를 들어, third-party clients는, 그들의 코드 속에 포함되었으나 내가 작성한 sealed class를 상속할 수 없다. 따라서, sealed class의 각 인스턴스는 어떤 제한된 집합 속의 유형 중 하나이며 이러한 유형들은 클래스가 컴파일될 때 모두 알려진다. sealed classes에 대한 설명은 sealed interfaces와 그 구현체에 대해서도 동일하게 동작한다. se..
Data Class 오직 데이터를 저장하기 위해서 클래스를 생성하는 경우가 있다. VO나 DTO가 대표적인 예시이다. 이러한 경우에, 데이터 클래스를 생성하기 위해 data 키워드로 data class임을 표현할 수 있다. data class에 대해서 컴파일러는 자동으로 다음과 같은 것들을 생성해준다. ▪ copy() function ▪ equals(), hashCode() pair ▪ toString() form of the primary constructor ▪ componentN() functions Data Class이기 위한 요구사항 ▪ primary constructor는 최소한 한 개의 파라미터를 가진다. ▪ primary constructor의 파라미터들은 val 또는 var이 표시되어야 ..
Java와 같이, Kotlin은 nested class라고 알려진, 한 클래스 내부에 다른 클래스를 정의하는 것이 가능하다. 내부 클래스에의 접근은 다른 멤버들과 같이 .을 통해서 가능하다. 그런데 Java에서는 어떤 클래스 내부에 다른 클래스를 선언하면 이는 기본적으로 inner class가 되지만, Kotlin에서는 inner class를 생성하기 위해서는 inner modifier를 사용해야만 한다. nested class는 outer class에 접근할 수 없다. 예를 들어서 다음 코드는 컴파일 에러가 발생하는데, nested class가 outer class의 property인 foo에 접근을 시도했기 때문이다. class Outer { val foo = "Outer class" class Ne..
Kotlin에서 abstract 키워드는 추상 클래스를 선언하기 위해 사용된다. 추상 클래스는 초기화될 수 없다. 즉 추상 클래스의 객체를 생성하는 것은 불가능하다. 그러나 추상 클래스를 상속받는 것은 가능하다. properties, methods 등, 추상 클래스의 멤버는, abstract 키워드를 사용하지 않는 한 abstract하지 않다. abstract class Person(name: String = "Unknown", age: Int = 0) { var name = name var age = age abstract fun describe() fun introduce() { println("I am $name and $age years old.") } } class Student(name: St..
접근 제한자... 클래스, 객체, 인터페이스, 생성자, 함수, property, setter에 대한 키워드이다. 다만 getter의 visibiltiy는 언제나 property의 그것과 같기 때문에 설정할 수 없다. 그리고 명시되지 않으면 public으로 설정된다. package 내부의 visibility modifiers package는 관련된 함수, properties, 클래스, 객체, 인터페이스의 집합을 구성한다. Modifier Description public declarations are visible everywhere private visible inside the file containing the declaration internal visible inside the same modul..
Inheritance(상속)은 OOP의 핵심적인 기능 중 하나로서, 사용자가 기존에 존재하는 base class로부터 새로운 derived class를 생성할 수 있도록 한다. derived class는 base class로부터 모든 자질을 이어받으며, 자체적인 추가 자질을 가질 수 있다. inheritance를 이용하고자 한다면, derived class가 is a 관계가 맞는지 잘 확인해야만 한다. 기본적으로 Kotlin에서 클래스는 final이기에, open 키워드를 붙여서 이를 통해 derived class를 생성할 수 있도록 해야 한다. open class Person(var name: String, var age: Int) { init { println("Person init: Created ..