목록Kotlin (12)
Jisoo’s devlog
DSL을 사용하면 반복되는 코드의 효율적인 재사용이 가능하다? 메서드를 반복해서 호출하지 않고도 메서드를 호출할 수 있다. → Dsl은 메서드 호출 조합에 대한 인테페이스를 제공하기 때문에 일련의 과정을 반복하지 않고도 원하는 메서드를 불러올 수 있다. 그래서, 잘 설계된 dsl로 구현한 코드는 쉽게 유지 보수할 수 있다. → 이는 가장 빈번히 바뀌는 애플리케이션 부분에 특히 중요하다. 또한, 프로그래머가 특정 코드에 집중할 수 있어서 결과적으로 생산성이 좋아진다. 내부 DSL 내부 DSL이란 ‘독립적인 문법 구조를 가진 SQL과 같은 위부 DSL과는 달리 DSL의 핵심 장점을 유지하면서 범용언어(코틀린)를 동일한 문법으로 사용하는 것’ -> 추가로 안드로이드의 내부 DSL인 Anko 라이브러리에 대한 ..
제네릭 클래스를 인자로 사용하는 애노테이션 KClass → 클래스를 인자로 받을 때의 형식 KClass → 제네릭 클래스를 인자로 받을 때의 형식 ⇒ 애노테이션이 어떤 인자로 쓰일지 알 수 없기 때문에 스타 프로젝션을 사용한다. 리플렉션 → 객체에 접근 객체 + ::(더블콜론) + class ⇒ 객체에 접근가능하다. (자바에서는 객체 + . + class 형식으로 주어진다.) → JSON 직렬화 라이브러리는 실행 시점에 정보를 알 수 있도록 리플렉션은 객체에 접근할 수 있어야 하기 때문에 사용. 메타데이터란? → 다른 데이터를 설명하기 위한 데이터 → 애노테이션도 메타데이터의 종류이다. ⇒ 정보를 통제하고 접근할 수 있게 하는 정보유형을 정리한 2차 데이터 유형 : 메타데이터
스타 프로젝션과 Any 스타 프로젝션(*)는 어떤 타입이 들어올지 알 수 없어도 안전하게 사용할 수 있다. 하지만 구체적인 타입이 정해지면 해당 타입만 받을 수 있다. *는 구체적인 타입이 정해지기 전까지는 Any?로 취급된다. Any는 언제든지 모든 타입을 받을 수 있다. 모든 타입이 상속받는 최상위 타입. (자바로 디컴파일하면 Object 타입으로 변환됨.) reified ‘구체화’ reified type parameter 와 함께 inline 함수를 만들면 Class를 파라미터로 넘겨주지 않아도 런타임에 타입 T에 접근할 수 있다. → reified는 inline 함수와 조합해서 사용한다. → 인라인을 하고싶지 않으면 noinline 키워드를 붙여준다. ⇒ reified type과 인라인 함수가 호..
invoke 메서드를 구현하는 인터페이스란? 자바에서 invoke 메서드를 구현하려면 코드를 일일이 다 써야 한다. 하지만 코틀린에서는 함수 타입이 invoke 메서드를 구현하는 인터페이스이기 때문에 굳이 코드를 적지 않아도 invoke 메서드를 구현할 수 있다. 전략 패턴이란? → 4-2기에 알 수 있다.. ⇒ “어떤 행위를 처리할때 로직의 일부 전략을 캡슐화하여 이용하는 패턴” • 로직이나 알고리즘 변경시 해당 코드를 직접 변경하지 않고 이미 정의된 알고리즘을 교체하여 사용할 수 있다. ㄴ 객체가 할 수 있는 각각의 행위를 전략으로 만들고 행위를 수정해야 할 때 전략을 바꾸어 행위의 수정을 가능하도록 한다. 인라인 함수 : 람다의 경우 파라미터 개수에 따라 컴파일 단계에서 FunctioN 인터페이스로..
코틀린 동등성 연산자(equals,==,===) 자바(==) : 원시 타입일 때는 값을 비교, 참조 타입일 때는 주소 값을 비교 코틀린(===) : 자바 == 의 주소 값 비교할 때와 동일 구조 분해 선언 (데이터클래스, 일반클래스) q. 구조 분해 선언과 관련해서 operator? ⇒ 일반 클래스일 때는 componentN으로 operator 키워드를 붙여 구조 분해 선언을 한다. 반면, 데이터 클래스일 때는 구조분해 선언을 지원하기 때문에 (동등성을 보장) = 왼쪽에 ()로 묶어서 나타낸다. += 연산이 원래 객체의 내부 상태를 변경하게 만들고 싶을 때 그냥 a+=1 의 예시를 생각. ⇒ 되도록 원서로 읽자..^^ 도우미 프로퍼티 부분 (Delegate 패턴) ⇒ 복습: 위임을 하는 이유 어떤 인터페..
let 함수란? let 함수는 타입 T의 확장함수이다. 모든 타입의 객체에 대해 .으로 이어나가는 방식으로 사용할 수 있다. null일 수 있는 어떤 변수가 null이 아닐 경우에만 코드를 실행하고 싶은 경우 사용한다. 특징 let함수는 람다식으로 중괄호를 채워서 이용한다. let함수는 스스로의 객체를 인자로 받아 사용한다. 또한 중괄호 내부에서 해당 객체를 it 키워드로 호출 가능하다. 왜 사용하는가 코드의 길이가 길어지거나 중복 호출될 때 let메서드를 사용하여 코드를 간결하게 할 수 있다. 플랫폼 타입이란? 플랫폼 타입이란 코틀린이 null 관련 정보를 알 수 없는 타입을 말한다. → 이 경우 모든 연산에 대한 책임은 개발자에게 있다. 코틀린에 반해 자바는 null-safety 메커니즘이 없다. 자..
현재 영역에 있는 변수에 접근 람다를 함수 안에서 정의하면 함수의 매개변수와 람다 정의 앞에 정의된 로컬 변수까지 람다에서 모두 사용 가능하다. 파이널 변수를 포회한 경우 : 람다 코드를 변수값과 함께 저장 파이널이 아닌 변수를 포획한 경우: 변수를 특별한 래퍼로 감싸서 래퍼에 대한 참조를 람다 코드와 함께 저장한다. wrapper? wrapper는 기본형 값들을 객체로 취급한다. 핸들러 핸들러를 사용하는 이유는 비동기적(asynchronous)으로 어떤 일을 처리하기 위해서이다. 그래서 함수가 순차적으로 실행되지 않는다. 비동기 호출이란 요청에 대한 결과가 동시에 일어나지 않으 상태에서 요청을 한 번에 다 받고 응답을 나중에 하는 호출이다. 멤버 참조 멤버 참조 시 : : 를 사용한다. 메소드, 생성자..
중첩 클래스와 내부 클래스 자바에서는 A클래스 안에 B클래스를 선언하면 내부 클래스이지만 코틀린에서는 A클래스 안에 B클래스를 선언하면 중첩 클래스이다. A클래스 안의 B클래스 앞에 Inner. 키워드를 붙이면 내부 클래스가 된다. 내부 클래스에서는 B클래스가 A클래스의 인스턴스에 대해 접근할 수 있는 권한이 생기고, 중첩 클래스는 바깥 클래스에 대해 접근할 수 없다. Inner 키워드를 붙여 내부 클래스를 사용하는 것이 더 편리해 보이긴 하지만 간혹 누수가 생길 수 있기 때문에 중첩 클래스를 사용하는 것을 지향해야 한다. ✨ 그렇다면 중첩 클래스를 왜 사용해야 하는가? 중첩 클래스는 바깥 클래스와 그 안의 클래스 간의 높은 연계성을 보여주기 위해 사용한다. 주 생성자와 부 생성자 주 생성자는 초기화 블..
확장 함수란? 확장 함수: 어떤 클래스의 멤버 메서드인 것처럼 호출할 수 있지만 그 클래스의 밖에서 선언된 함수 선언 : 수신 객체 타입+추가하려는 함수 이름():타입 = ~ 수신 객체 타입: 확장되는 클래스 수신 객체: 확장 함수가 호출되는 대상이 되는 값 String: 확장되는 클래스 lastChar(): 불러오려는 함수 확장 프로퍼티란? 확장 프로퍼티도 일반 프로퍼티와 같지만 수신 객체 타입(확장되는 클래스)만 추가된다. 사용 방법도 일반 프로퍼티와 동일하게 사용된다. 필드(멤버 변수)가 없어서 게터를 꼭 정의해야 한다. 기존 클래스 객체에 프로퍼티 형식의 구문으로 API를 추가해서 추가적인 기능을 사용할 수 있게 한다. API를 추가한다는 것 : 실제로 컬렉션에 추가되는 것은 아니지만 기존의 컬렉..
코틀린의 확장(Extension) 지원에 대해 알아보았다. Extension이란 -상속이나 디자인 패턴 없이 클래스를 간단하게 확장할 수 있는 방법이다. 자바는 확장 기능 대신, AOP 같은 관점 지향 프레임워크를 사용한다. 하지만 코틀린은 open키워드를 달아주지 않으면 상속을 받지 못해서 확장 기능을 지원한다. 코틀린의 확장 함수 클래스로 대변되는 타입에 함수를 상속관계 없이 추가하는 것이다. 함수를 마치 이 타입의 멤버 함수인 것처럼 호출 가능하다. 단, 호출이 가능한 함수들은 패키지의 멤버 함수이다. 확장 함수는 새로운 클래스를 만들지 않아도 되어서 간편하게 사용 가능하다. 확장 함수를 선언하는 방법: 클래스 이름 .(온점) 함수 이름 확장 함수는 클래스 안에 들어가지 않는다. 실제로 메소드를 클..