목록Java & Kotlin (15)
DOing
코틀린의 프로퍼티 위임(Delegation)을 이용하면 일반적인 프로퍼티 패턴들을 간단하게 사용할 수 있다. 대표적인 예시로 표준 라이브러리의 lazy(처음 사용하는 요청이 들어올 때 초기화하는 패턴), observable(변화가 있을 때 감지하는 패턴)와 의존성 주입, 데이터 바인딩 등에 활용될 수 있다. 일반적으로 이런 패턴들을 사용할 때 자바에서는 어노테이션들을 많이 활용해야 한다. 하지만 코틀린에서는 프로퍼티 위임을 사용해서 간단하고 type-safe하게 구현할 수 있다. 우선 프로퍼티 위임에 대해서 간단히 알아보고, 동작 원리, 어떻게 활용될 수 있는지에 대해서 차례대로 알아보자. ✏️ 프로퍼티 위임(Delegation) 프로퍼티 위임은 프로퍼티의 접근자(getter, setter) 구현을 다른..
자바에서는 자주 사용하지 않았던 용어 같은데, 코틀린에 오니 갑자기 많이 쓰이게 되는 용어들이 있다. 대충 느낌은 오니까 대수롭지 않게 넘겼는데, 찾아보니 분명한 차이가 있었고 이 차이들에서 코틀린의 특징을 담고 있다라고 느껴졌다. 이런 용어들 중에 대표적으로 함수와 메서드, 프로퍼티와 필드가 있었는데 이번 기회에 이런 용어들에 대해 분명하게 알고 가면 좋을 것 같아서 포스팅을 하게 되었다. ✏️ 함수 vs 메서드 코틀린의 기본적인 함수(function)은 fun 키워드로 시작한다. 이를 활용해서 톱레벨 함수, 클래스의 멤버함수, 함수 내부의 지역함수를 만들 수 있다. 또한 추가적으로 함수 리터럴을 활용해서 익명함수를 정의할 수도 있다. 메서드(method)는 클래스와 연결된 함수를 의미한다. 멤버 함수..
코틀린에서 중첩 클래스(Nested Class)와 내부 클래스(Inner Class)를 혼용해서 사용하고 있는 것같다는 느낌을 받게되었고 차이를 명확하게 알아보고자 포스팅하게 되었다. ✏️ 중첩 클래스(Nested Class) 주의해서 볼 것은 클래스 타입이 "바깥 클래스.중첩 클래스"라는 점과 생성자를 호출할때도 "바깥 클래스.중첩 클래스()"라는 점이다. Nested 클래스는 Nested라는 식별자만 Outer 클래스에 속해있을 뿐, 실제로는(물리적으로는) 완전히 분리된 장소에 있다. 따라서 Nested 클래스의 멤버함수는 Outer 클래스의 프로퍼티나 멤버 함수에 접근할 수 없다. ✏️ 내부 클래스 (Inner Class) 중첩 클래스의 경우 바깥 클래스의 인스턴스와 중첩 클래스의 인스턴스는 서로 ..
코틀린을 다루며 자주 등장하는 함수 리터럴에 대한 개념을 제대로 잡기 위해서, 상수와 리터럴을 비교하며 리터럴이란 무엇인지, 코틀린에서의 함수 리터럴이란 무엇인지에 대해서 포스팅하고자 한다. 🌱 상수(Constant) 상수와 리터럴 둘다 변하지않는 값(데이터)을 의미한다. 더 구체적으로 말하면, 상수는 변하지 않는 변수를 의미한다. 상수에 데이터는 숫자가 올 수 있지만, 클래스나 구조체와 같이 기본형에서 파생된 객체를 넣을 수 있다. 상수의 데이터가 변하면 안된다고 해서, 참조변수를 상수로 지정할 때, 참조변수에 넣은 인스턴스 안의 데이터까지도 않는다고 착각할 수 있다. 하지만 참조변수가 상수, 즉 참조변수 메모리의 주소값이 변하지않는다는 의미이지 그 주소가 가리키는 데이터들까지 상수라는 의미가 아니다...
자바에는 없지만, 코틀린에서는 자주 사용되는 함수들로 let, also, apply, run, with이 있다. 이들은 모두 범위 지정함수들이다. 서로 유사한 점이 많아서 무엇을 골라 사용해야하는 것인지 헷갈릴때가 많았다. 이번 포스팅에서는 이들의 차이를 알아보고자 한다. 수신 객체 지정 람다 (Lamdas with Receivers) vs 일반 람다 Scope functions 을 분석하기 전에 다시 짚고 넘어가야하는 개념이다. 확장함수에서 수신객체를 사용하여 블록내로 객체를 넘겼듯이 수신객체 지정 람다도 수신객체를 사용하여 객체를 전달한다. 따라서 수신객체 지정람다에서는 수신객체를 this로 대신할 수 있으며, this를 생략할수도 있다. 하지만 this를 생략하게되면 수신객체인지 외부의 객체 혹은 ..
현대 프로그래밍 언어에서 보편적으로 사용되는 람다는 메서드로 전달할 수 있는 익명 함수를 의미한다. 이번 포스팅에서는 코틀린에서 이러한 람다를 어떻게 사용하고 있는지 알아보려고 한다. 람다를 제대로 이해하기 위해 우선 코틀린에서 사용하는 함수의 반환타입과 연산자에 대해서 먼저 설명하고, 람다에 대해 본격적으로 알아보겠다. Unit 자바의 void와 같은 기능을 한다. Unit은 의미 있는 값을 반환하지 않는 함수의 반환타입으로 사용할 수 있다. 코틀린에서 void를 안쓰고 Unit을 사용하는 이유는 다음과 같다. Unit은 모든 기능을 갖는 일반적인 타입 Unit은 타입 인자로 사용 가능. Unit은 단 하나의 인스턴스를 갖는 타입을 의미한다. unit 타입에 속한 값은 Unit 단 하나이다. 반환 타입..
제네릭 제네릭은 프로그램의 안정성을 도와주는 도구 중 하나로, 컴파일 단계에서 자료형을 체크해주는 도구이다. 제네릭을 왜 사용해야 하는 지, 어떻게 프로그램의 안정성을 제공해준다는 것 인지 예시를 통해 알아보자. chicken만을 넣는 chickenBox가 있다. class Chicken{ } class ChickenBox{ private Chicken[] box = new Chicken[10]; int cursor = 0; void putData(Chicken chicken){ box[cursor++] = chicken; } Chicken getData(){ Chicken chicken = box[cursor - 1] box[cursor - 1] = null; cursor--; return chicke..
하드 코딩을 상수로 고치는 과정 중에서 static과 final에 대한 의문이 생겼습니다. 이번 포스팅을 통해 static과 final에 대한 개념을 잡고가려고 합니다. 🖐 잠깐! 하드 코딩이란? 프로그램의 소스 코드에 데이터를 직접 입력해서 저장하는 것을 의미합니다. // 테마 내 색깔 개수 확인 if(3>=colorSet.size() || colorSet.size()>6){ throw new ApiRequestException(" 테마 내 색은 최소 3개, 최대 6개입니다"); } 하드 코딩을 상수화 하자! // 테마 내 색깔 개수 확인 if(COLOR_SIZE_MIN>=colorSet.size() || colorSet.size()>COLOR_SIZE_MAX){ throw new ApiRequestE..