본문 바로가기

전체 글

(86)
[Kotlin] object & companion object ObjectObject 키워드를 다양한 상황에서 사용할 수 있다. 그 상황들의 공통점은, 클래스를 정의하면서 동시에 인스턴스(객체)를 생성한다는 점이다.코틀린에서 object키워드는 다음 두가지 형태로 사용 가능하다.object declarations(선언식)object expressions(표현식) 1. Object declaration(선언식): Singleton 만들기object를 선언식으로 사용하게 된다면, 무엇보다도 Singleton패턴 형태로 사용하는 것이다.객체지향 프로그램을 설계하다 보면, 인스턴스가 하나만 필요한 클래스가 유용한 경우가 많아진다.JAVA에서는 아래와 같이 보통 클래스의 생성자를 private로 선언하고, static 변수에 클래스 객체를 저장하는 방식으로 싱글턴 패턴을 구..
[Android: Jetpack] LiveData & Observer Pattern 💬인프런 ‘냉동코더의 알기 쉬운 Modern Android Development 입문’을 수강하며 정리한 핵심내용과 별도로 공부를 진행하며 작성한 내용입니다.LiveData값의 변경을 감지할 수 있는 데이터 홀더이다.ViewModel과 결합할 때 시너지 효과[기존]UI에 표시할 데이터를 ViewModel에 저장한다.값이 변경되면 ViewModel의 데이터를 변경한다.Activity에서 ViewModel에 접근해서 변견된 값을 다시 화면에 표시한다.→ 별도의 생명주기를 가진 ViewModel을 사용해 액티비티 재생성 시에도 ui 값 유지 가능[LiveData사용 시]데이터 홀더로 LiveData를 사용값의 변경을 감지해서 UI에 자동으로 반영 가능해진다.→ 이것이 MVVM에서 구현해야 하는 ViewMode..
[Kotlin] lateinit와 lazy의 차이점 lateinit와 lazy 모두 변수를 늦게 초기화하는 방법들이다.늦게 초기화 한다는 것이 무엇일까? 늦은 초기화클래스 안에 ‘이 변수를 사용할 것이다’라고 선언만 해두고 나중에 변수를 실제로 사용하는 시점에 값을 입력해주어 사용하는 것을 말한다.물론 처음부터 null값을 넣어두고 나중에 제대로 된 값을 할당하는 것도 가능하다. 하지만 이럴 경우 2가지 고려해볼 요소가 있다.var a : String? = nulla의 값이 변할 수 있지만, 절대 null이면 안되는 경우 ⇒ 처음에 nullable한 으로 초기화해주는 것이 부적절하다.a의 값이 처음 한 번 정해지고 나면, 다시는 변하지 않는 경우⇒ a가 var일 필요가 없다.이런 걱정을 없에주는 것이 lateinit과 lazy이다. lateinit특징va..
[Python] 시간 초과 나는 경우에 적용해볼 수 있는 팁 파이썬으로 코딩 테스트 문제를 풀다보면 생각보다 시간초과가 자주 발생한다.해결할 수 있는 몇가지 팁을 작성한다. 1. sys.stdin.readlind()로 입력받기입력 값을 받아 저장해야하는 경우, input()으로 구현하는 경우가 많다. sys 파이썬 표준 라이브러리를 사용하면 훨씬 빠른 시간에 적은 메모리를 사용하여 입력을 받을 수 있다.import sys # 방법1 var = sys.stdin.readline() # 방법2 input = sys.stdin.readlin var = input()🗣️ 저는 2번째 방법을 더 자주 사용하는 편입니다. 2. 배열 & 리스트에 원소를 추가할 때 인덱스로 접근하기배열이나 리스트에 원소를 추가하는 경우, 보통 빈 collection을 만들고 append로 추가..
[Android: Jetpack] Architecture Pattern과 Android App Architecture 구글에서는 개발자들이 더욱 안전한 앱 개발을 할 수 있도록, 구글 아키텍쳐 앱 가이드를 제시한다.가이드에 따라서 만들어진 앱은 더 견고하고 고품질의 앱이 된다는데, 왜 그럴까? MVC 패턴이 1970년대 트리그베(Trygve Reenskaug)에 의해 최초로 도입된 후, 패턴에 대한 많은 변용과 발전이 있었다.이후 1990년대 Taligent가 MVC의 개선모델인 MVP 패턴을 도입하고, 비교적 최근, 2005년에는 John Gossman이 MVVM 패턴을 도입하게 된다. 이 패턴들을 도입하는 핵심적인 목적은 관심사를 분리함으로써, 프로그램을 더 안전하면서도 확장하기 쉽게 만드는 것이다.각 패턴은 위와 같은 구조를 가진다.그렇다면, 어떤 방식으로 관심사를 분리하고, 어떻게 프로그램이 안전해진다는 것일까?..
[Kotlin] 내부(Inner class)와 중첩 클래스(Nested class) 자바에서는 A클래스 안에 B 클래스를 정의하면 B클래스는 자동으로 내부 클래스가 된다.하지만 코틀린에서는 반대이다. 한 클래스 안에 다른 클래스를 정의하면 기본적으로는 중첩 클래스가 되고, 내부 클래스로 만들고 싶다면 inner 키워드로 클래스는 선언해야 한다.내부 클래스는 기본적으로 외부 클래스를 참조하게 되지만, 중첩 클래스는 그렇지 않다. 다음의 코드들을 보자.class Outer{ private val bar:Int = 1 class Nested{ fun foo()=bar // error! bar가 아닌 다른 값으로 변경해 줘야한다. } } fun main(){ print(Outer.Nested().foo()) }먼저 중첩(Nested) 클래스다.중첩 클래스는 외부 클래스(위 코드에서는 Outer..
[Kotlin] 더블콜론(::) 참조 더블 콜론(::)더블콜론(::)은 코틀린에서 메서드 참조, 프로퍼티 참조, 클래스 리터럴(Literal)과 같은 메타 프로그래밍에 관련된 것으로, 리플렉션을 위해 사용한다.리플렉션이란 런타입에 프로그램의 클래스를 조사하기 위해서 사용되는 기술이다. 즉, 프로그램이 실행 중일 때 인스턴스 등을 통해 객체의 내부 구조 등을 파악할 수 있다.코틀린에서 변수나 클래스명 앞에 더블콜론(::)을 명시하면, 변수나 클래스에 대한 참조를 할 수 있다. 더블콜론을 명시하면 변수가 아닌 객체(Object)로 접근할 수 있기 때문이다. (Object::class)그럼 자바와 코틀린에서의 리플렉션 차이를 보자.SomeClass.class // 클래스 그 자체를 리플렉션 someInstance.getClass() // 인스턴스..
[Kotlin] 지연 계산(lazy) 컬렉션 연산: Sequence 컬렉션 API 중, map이나 filter같은 함수는 결과 컬렉션을 즉시 생성한다.이는, 컬렉션 함수를 연쇄하면 매 단계마다 중간 계산 결과를 새로운 컬렉션에 임시로 저장하고 있다는 것이다.반면에, 시퀀스(Sequence)를 사용하면, 중간 임시 컬렉션을 사용하지 않고도 컬렉션 연산을 연쇄할 수 있다. 간단한 예로, 성이 ‘김’씨인 사람만 추려내는 예제를 살펴보도록 하겠다./* 김씨인 사람만 추리기 */ people.map(Person::name).filter {it.startsWith("김")}코틀린 레퍼런스 문서에는 filter와 map이 List를 반환한다고 명시되어있다.이 말은 이 연쇄 호출이 List를 총 2개 만든다는 것을 알 수 있다.한 리스트는 map의 결과를 담고, 다른 하나는 filte..