![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/em0PuR/btsmyYU2BFw/FfgE7ZWiHkLXqnQxOx08bk/img.jpg)
Singleton Pattern 클래스 인스턴스를 하나만 만드는 패턴 생성자를 private으로 두고, 하나뿐인 인스턴스의 전역 접근을 제공한다. 인스턴스가 필요할 때 클래스에 요청하고, 요청이 들어오면 하나뿐인 인스턴스를 반환한다. → lazy instantiation 싱글톤 패턴이 필요한 경우 인스턴스가 하나만 존재해야 하는 경우 사용한다. (스레드 풀, 캐시, 로그 등) 이런 경우 인스턴스가 여러개라면, 자원을 불필요하게 사용하거나 결과가 일관되지 않을 수 있다. 전역 변수를 사용해서 인스턴스를 생성하면, 필요하지 않은 경우에도 인스턴스가 생성되어 자원을 잡아먹을 수 있다. 여러 곳에서 같은 데이터를 공유할 수 있다. 구조 구현 방식 1) 기존 싱글톤 패턴 방식 public class Singlet..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/PxZ0v/btsmwXolgIo/oaof5sJ5bU0P4zzRCzLEQk/img.png)
Observer Pattern 어떤 객체의 상태가 바뀌면 그 객체를 구독하는 다른 객체(옵저버)에게 알림을 보내는 패턴 Subject Observer에게 데이터가 변경될 때마다 알려주는 역할 새로운 값을 Observer에게 전달한다. 옵저버 패턴의 대상이 되는 데이터를 관리한다. Observer Subject를 구독하고, Subject의 데이터가 바뀌면 그 데이터를 전달받는다. 특징 일대다 의존성 하나의 Subject에 여러 Observer가 연관된다. Observer는 데이터를 가질 필요가 없고, Subject가 알림을 보내길 기다린다. → Subject에 의존 여러 객체가 동일한 데이터를 관리하지 않고, 하나의 객체(Subject)만 가지고 있기 때문에 깔끔한 코드. 느슨한 결합 (Loose Coup..
객체 선언 object Application { val name = "My Application" override fun toString() = name } fun describe(app: Application) = app.name // Application을 타입으로 사용 fun main() { println(describe(Application)) // Application을 값으로 사용 println(Application) } 객체를 통해 클래스의 인스턴스가 하나만 존재하는 싱글톤 패턴을 사용할 수 있다. object 키워드를 사용하여 선언한다. 객체의 인스턴스가 하나뿐이므로 객체를 타입으로도 사용할 수 있다. 실제 객체 인스턴스에 접근할 때까지 초기화가 지연된다. 생성자가 존재하지 않는다. (암시..
늦은 초기화 (lateinit) 인스턴스를 생성할 때 프로퍼티를 초기화하지 않고, 필요시 초기화하기 위해 사용한다. 값을 읽을 때 프로퍼티가 초기화되지 않으면 UninitializedPropertyAccessException 예외를 던진다. lateinit 프로퍼티의 조건 가변 프로퍼티로 정의해야 한다. 참조 타입, non-nullable type이어야 한다. (내부에서는 초기화되지 않은 상태를 표현하기 위해 널을 사용하기 때문) 선언과 동시에 초기화할 수 없다. 최상위 프로퍼티와 지역 변수에서도 사용할 수 있다. 2. 커스텀 접근자 프로퍼티는 커스텀 접근자를 통해 변수와 함수의 동작을 하나의 선언에 조합할 수 있다. 커스텀 접근자는 프로퍼티 값을 읽거나 쓸 때 호출되는 함수다. 커스텀 게터 class ..
널이 될 수 있는 타입과 널이 될 수 없는 타입을 구분한다. → 널 발생 여부를 컴파일 시점으로 옮겨주기 때문에 NullPointerException 예외를 방지할 수 있다. 기본적으로 코틀린의 모든 타입은 널이 될 수 없는 타입이다. → 널에 대한 검사를 추가로 수행할 필요가 없다. 널이 될 수 있는 타입(nullable type) 타입 뒤에 ?를 붙여 지정할 수 있다. ex) val s: String? = "abc" 널이 될 수 없는 타입(non-nullable type)의 상위 타입이므로, nullable type에 non-nullable type의 값을 대입할 수 있다. fun isLetterString(s: String?): Boolean { if(s.isEmpty()) return false ..
클래스 구조 class Person { var firstName: String = "" var familyName: String = "" var age: Int = 0 fun fullName() = "$firstName $familyName" fun showMe() { println("${fullName()}: $age") } } 위 클래스의 인스턴스마다 firstName, familyName. age라는 프로퍼티와 fullName(), showMe()라는 함수가 포함된다. cf) 파일명을 public 클래스의 이름과 동일하게 만들지 않아도 된다. 한 파일에 여러 public 클래스가 존재할 수 있다. 2. 생성자 주생성자 class Person(firstName: String, familyName: S..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/lECfe/btskZspHXos/C2Uikyhx5HR3Dr1KHBE1UK/img.png)
문자열 문자열 템플릿 import java.util.Date fun main() { val name = readLine() println("Hello, $name!\n, Today is ${Date()}") } ${}의 중괄호 사이에 코틀린 식을 넣으면 문자열에 식을 넣을 수 있다. 간단한 변수 참조인 경우 중괄호의 생략이 가능하다. 2. 로우 문자열 val message = """ Hello, &name! Today is ${Date()} """.trimIndent() 큰따옴표 세 개로 둘러싸여 있는 로우 문자열을 사용하면 이스케이프 시퀀스를 사용하지 않고 문자열을 작성할 수 있다. 3. 문자열 비교 자바 코틀린 ==와 != 연산자는 참조 동등성을 비교한다. 실제 문자열 내용을 비교하려면 equals(..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/S3iQR/btsk2eQ33sv/k0VxL6vQPENcpqrR0lMfW0/img.png)
변수 val timeInSeconds = 15 val 키워드 한번 초기화하면 다시는 값을 대입할 수 없는 불변 변수를 정의하는 키워드. 자바의 final 변수와 비슷하다. 2. var 키워드 val과 반대로 가변 변수를 정의할 때 사용하는 키워드. 3. 타입 추론 변수 타입을 지정하지 않아도 컴파일러가 코드의 문맥에서 타입을 도출해주는 기능. 4. 변수 타입을 명시하는 경우 val text: String text = "Hello!" 초깃값을 생략하고 다른 문장에서 변수를 초기화하는 경우 변수 타입을 명시해야 한다. 기본 타입 1. 타입 정수 타입: Byte, Short, Int, Long 실수 타입: Float, Double 문자 타입: Char 논리 타입: Boolean 2. 원시 타입, 참조 타입 원..