Programming/Kotlin
[Kotlin] 추상클래스와 인터페이스
추상 클래스 추상 클래스 VS 인터페이스 추상 클래스 는 대략적인 설계의 명세와 공통의 기능을 구현한 클래스이다. 즉, 구체적이지 않은 것이다. 추상 클래스 를 상속하는 하위 클래스 는 추상 클래스의 내용을 더 구체화 해야 한다. 엄밀히 말하면 다르다. 인터페이스 역시 대략적인 설계 명세를 구현하고 인터페이스 를 상속하는 하위 클래스에서 이를 구체화하는 것은 동일하다. 하지만 인터페이스에서는 프로퍼티의 상태 정보를 저장할 수 없다. 다시 말하면 인터페이스 에서는 프로퍼티의 초기화 가 불가능하다는 것이다. interface Vehicle { val name : String val color : String val weight : Double } interface Pet { val name : String ..
![[Kotlin] Data Class](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvcvB4%2FbtrR1gLzRtK%2Fz2Wc7Jt05WWPmmm7Irkz51%2Fimg.png)
[Kotlin] Data Class
data class는 일반 class와 달리, 다양한 메소드를 자동으로 생성해주는 클래스이다. Data Class 생성 시 같이 만들어지는 함수들 - hashCode() - copy() - equals() - toString() - componentsN() 또한 아래와 같은 여러 가지 다양한 특징을 갖고 있다. 기본 생성자에 1개 이상의 파라미터가 있어야 함 기본 생성자의 파라미터가 val 또는 var 로 선언해야 함 다른 클래스를 상속받을 수 없음 (슈퍼 클래스를 가질 수 없음)단, sealed 클래스는 상속받을 수 있으며, 인터페이스는 구현할 수 있음 abstract, open, sealed, inner 등 키워드를 붙일 수 없음 자동으로 생성한 메소드를 오버라이딩할 경우, 오버라이드 된 메소드 사용..
[Kotlin] open
상속이란 부모의 자원을 자식이 상속받아 사용하는 것 자바에서 상속 방법 class Child extends + '부모 클래스' class Parent {} class Child extends Parent {} 코틀린에서 상속 방법 class Child : '부모 클래스' 여기서 자바와 다르게 코틀린은 부모 클래스 앞에 open 키워드를 사용한다. open class Parent {} class Child : Parent() {} 만약 open이라는 키워드를 사용하지 않고 코드를 작성할 경우 This type is final, so it cannot be inherited from 이라는 에러 문구가 나온다. 코틀린은 open 키워드가 없을 경우 다른 곳에서 상속 받지못하는 final class로 정의되기..
[Kotlin] 스코프함수
스코프함수는 함수형 언어의 특징을 조금 더 편리하게 사용할 수 있도록 기본 제공하는 함수들이다. 클래스에서 생성한 인스턴스를 스코프함수에 전달하면 인스턴스의 속성이나 함수를 좀 더 깔끔하게 불러 쓸 수 있다. apply 인스턴스를 생성한 후 특정 변수에 할당하기 전에 초기화 작업을 수행할 때 많이 사용 apply함수 내의 모든 명령이 수행되고나면 새로 생성된 인스턴스를 반환한다. fun main(){ val book1 = Book("Kotlin", 10000).apply{ //기존에는 인스턴스 함수를 사용해 속성을 변경해주었다. //book.name = "Kotlin 1" //book.discount() //apply 함수에서는 참조연산자를 통해 프로퍼티에 접근하지 않고 인스턴스 생성과 동시에 바로 초기..
[Kotlin] 빈 문자열 확인(isEmpty, isBlank)
빈 문자열 확인 문자열을 활용하다 보면 이 문자열이 빈 문자열인지 아닌지 확인해야 할 경우가 있다. 빈 문자열을 확인할 때에는 isEmpty() 또는 isBlank()를 사용할 수 있다. someString.isEmpty() someString.isBlank() 두 메소드는 비슷해 보이지만 약간의 차이점이 있다. isEmpty() isEmpty()는 특정 문자열이 ""인지 아닌지를 확인한다. val s1 = "" s1.isEmpty() // true val s2 = " " s2.isEmpty() // false 따라서, 위의 두 문자열 중 s2는 empty하지 않다는 결과를 돌려준다. isBlank() isBlank()는 특정 문자열이 비어 있거나, 또는 공백으로만 이루어져 있는지를 확인한다. val s..
[Kotlin] 늦은초기화 (lateinit, by lazy)
늦은 초기화 클래스 안에서 변수를 선언만 해 놓고, 나중에 값을 사용할 수 있게 되면 그 때 값을 입력해 주고 싶을 때가 있다. 이럴 때 사용 가능한 방법 중에는 아래와 같이 우선 null로 설정해 준 뒤 나중에 바꾸는 방법이 있기는 하다. var x : String? = null 1) x의 값이 변할 수는 있지만, 절대 null이어서는 안 되는 경우 -> 처음에 nullable한 으로 초기화해주는 것이 부적절함 2) x의 값이 처음 한 번만 정해지면 다시는 변하지 않는 경우 -> x가 var일 이유가 없음 애초에 '나중에 쓸 것'이라는 걸 알고 있는데, '왜 처음에 null로 고정을 해 주어야 하냐?' 라는 문제다. 이럴 때를 위해 제공되는 문법이 lateinit, 그리고 by lazy이다. latei..
[Kotlin] invoke
fun main(args: Array): Unit { val person = Person("Kotlin") person() } class Person(var name: String) { operator fun invoke() { println("name : $name") } } 결과 : name : Kotlin person이라는 객체를 선언한뒤, 객체 내의 함수 이름인 invoke를 호출하지 않아도 invoke 내부의 함수가 호출이 된다. 즉, invoke를 이용해 자주 호출해야 하는 함수를, 객체의 이름+()만으로도(물론 invoke 내의 매개변수가 있으면 () 내에 매개변수를 넣어줘야겠지만!) 호출할 수 있게 되는 것이다.
[Kotlin] 생성자
자바에 비해 코틀린에서는 간단하고, 다양하게 생성자를 정의할 수 있다. 코틀린의 생성자는 주생성자와 부생성자로 구분할 수 있다. 보통 주생성자는 클래스를 초기화할 떄 주로 사용하는 간략한 생성자로 클래스 본문 밖에서 정의하며 부생성자는 클래스 본문 안에서 정의한다. 또한 코틀린에서는 초기화 블록(initializer block)을 통해 초기화 로직을 추가할 수 있습니다. 주생성자 (Primary Constructor) 아래와 같이 클래스 이름 옆에 괄호로 둘러싸인 코드를 주 생성자 라고 부릅니다. 주 생성자는 생성자 파라미터를 지정하고 그 생성자 파라미터에 의해 초기화되는 프로퍼티를 정의하는 두 가지 목적에 쓰입니다. 코틀린의 클래스는 하나의 주생성자와 다수의 부생성자를 가질 수 있습니다. class U..