확장함수 기존 자바 코드위에 자연스럽게 코틀린 코드를 추가한다는 개념에서 출발 자바로 만들어진 라이브러리를 유지보수 및 확장할 때, 코틀린 코드를 덧붙인다. 따라서 어떤 클래스안에 있는 메서드처럼 호출할 수 있지만, 함수는 밖에 만들 수 있게 한다. 확장함수는 클래스에 있는 private 또는 protected 멤버를 가지고 올 수 없다. 멤버함수와 확장함수의 시그니처가 같으면, 멤버함수가 우선적으로 호출된다. 즉, 확장함수를 만들었지만, 다른 기능을 하는 똑같은 시그니처의 멤버함수가 생기면 오류가 발생할 수 있다. fun String.lastChar(): Char { return this[this.length - 1] } fun: 이건 함수라는 의미 String. : String 클래스를 확장한다는 의..
배열 array.indices는 0부터 마지막 index까지의 range이다. withIndex()를 사용하면, 인덱스와 값을 한번에 가져올 수 있다. array.plus()를 이용하면, 값을 쉽게 넣을 수도 있다. val arr = arrayOf(100, 200) arr.plus(300) // 배열에 새로운 element 추가 // 방법 1 for (i in arr.indices) { println("$i ${arr[i]}") } // 방법 2 for ((idx, value) in arr.withIndex()) { println("$idx $value") } Collection - List, Set, Map 컬렉션을 만들어줄 때, 불변인지 혹은 가변인지를 설정해야 한다. 가변(Mutable) 컬렉션: ..
Enum 열거형. 클래스 내에 상태를 구분하기 위한 객체들을 이름을 붙여 여러개 생성하고 그 중 하나의 상태를 선택해 나타내는 방식이다. 특징 enum class 안에는 상수를 나타내는 대문자로 나타낸다. enum 객체들은 고유한 속성을 가질 수 있다. 일반 클래스처럼 함수 선언도 가능하다. enum class Color (val red: Int, val green: Int, val blue: Int) { RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255);
Data Class DTO 클래스 데이터(필드) 생성자와 getter equals, hashCode toString data 키워드를 붙여주면 아래 메서드 해결 equals, hashCode toString 여기에 named argument 까지 활용하면 builder pattern을 쓰는 것 같은 효과도 있다. 자바에서도 JDK16부터 record class를 도입하긴 했다. data class Person( private val name: String, private val age: Int ) Enum Class 특징 추가적인 클래스를 상속받을 수 없다. 인터페이스는 구현할 수 있으며, 각 코드가 싱글톤이다. enum class Country( val code: String ) { KOREA("KR"..
중첩 클래스의 종류 내부 클래스 외부 클래스를 참조하고 있다. 내부 클래스는 숨겨진 외부 클래스 정보를 가지고있어서 참조를 해지하지 못하는 경우가 발생할 수 있다. 따라서 메모리 누수가 생길 수 있고, 이를 debugging 하기 어렵다. 내부 클래스의 직렬화 형태가 명확하게 정의되지 않아 직렬화에 있어 제한이 있다. public class JavaHouse { private String address; private LivingRoom livingRoom; public JavaHouse(String address) { this.address = address; this.livingRoom = new LivingRoom(10); } public LivingRoom getLivingRoom() { retu..
static 함수와 변수 static: 클래스가 인스턴화 될 때, 새로운 값이 복제되는게 아니라 정적으로 인스턴스끼리의 값을 공유 companion object: 클래스와 동행하는 유일한 오브젝트 class Person private constructor( private val name: String, private val age: Int ){ companion object{ private val MIN_AGE = 1; // 런타임 시에 변수 할당 private const val MIN_AGE = 1; // 컴파일 시에 변수 할당 fun newBaby(name: String): Person { return Person(name, MIN_AGE) } } } 런타임 시에 변수가 할당됨 컴파일 시에 변수가 할..
자바와 코틀린의 가시성 제어 코틀린에서는 패키지를 namespace를 관리하기 위한 용도로만 사용하고, 가시성 제어에는 사용되지 않는다. 모듈: 한 번에 컴파일되는 코틀린 코드 자바의 기본 접근 제시어는 default이고, 코틀린의 기본 접근 제시어는 public이다. public: 모든 곳에서 접근 가능 protected: 선언된 클래스 또는 하위 클래스에서만 접근 가능 internal: 같은 모듈에서만 접근 가능 private: 선언된 클래스 내에서만 접근 가능 코틀린 파일의 접근 제어 코틀린은 .kt 파일에 변수, 함수, 클래스 여러개를 바로 만들 수 있다. public: 기본값 protected: 파일(최상단)에는 사용 불가능 -> 클래스 접근 internal: 같은 모듈에서만 접근 가능 priv..
추상 클래스 Animal이라는 추상클래스를 구현한 Cat, Penguin 클래스 extends 키워드를 사용하지 않고, : 을 사용한다. 상위 클래스의 생성자를 바로 호출한다. override를 필수적으로 붙여 주어야 한다. abstract class Animal ( protected val species: String, protected val legCount: Int ){ abstract fun move() } class Cat ( species: String ) : Animal(species, 4) { override fun move() { println("고양이가 사뿐 사뿐 걸어가~") } } 추상 프로퍼티가 아니라면 상속할 때 open을 꼭 붙여야 한다. protected open val leg..
클래스와 프로퍼티 class KotlinPerson constructor(name: String, age: Int){ val name = name val age = age } 코틀린에서는 필드만 만들면 getter와 setter를 자동으로 만들어준다. property = field + getter + setter constructor는 생략할 수 있다. class KotlinPerson( name: String, age: Int ){ val name = name val age = age } 클래스의 필드 선언과 생성자를 동시에 선언할 수 있다. 생성자: constructor(name: String, age: Int) 필드 val name = name val age = age .필드 를 통해서 getter..
함수 선언 문법 함수 구조 [접근 지시어] [함수를 의미하는 키워드] [함수 이름] [함수의 매개변수] [함수의 반환 타입] 접근 지시어: public은 생략 가능 함수를 의미하는 키워드: fun 함수의 매개변수: [매개변수명: 타입] 함수가 하나의 결과값이면 block 대신 = 사용이 가능하다. 이를 한줄로 변경이 가능하다. = 을 사용하는 경우에는 반환 타입 생략이 가능하다. block { } 을 사용하는 경우에는 반환 타입이 Unit이 아니면, 명시적으로 작성해줘야 한다. // 1. 함수 선언 문법 - 두 정수를 받아서 더 큰 정수를 반환 fun max(a: Int, b: Int) = if (a > b) a else b 함수의 위치 클래스 안 파일 최상단 한 파일 안에 여러 함수들이 있을 수 있음 ..