본문 바로가기

전체 글

(144)
Retrofit2 @Multipart @Streaming retrofit2에서 업로드, 다운로드 기능을 구현하며 업로드에서 처음으로 @Multipart를 사용해보았다. 그런데 검색한 결과로만 적용하니 기능을 구현했지만 이게 뭐하는 동작인지 정확히 모르겠다. 대용량 파일을 보낼 때 좋다고만 알고 있음...! 그래서 조금이라도 알고쓰려고 찾아보려고 한다. 일단 서버 api문서에 content disposition이라고 쓰여진 부분이 있었다. 갑자기 영단어 공부같지만! disposition이란 구성, 기질이라는 뜻이고 즉, Http 응답 컨텐츠의 기질을 의미한다. 이 곳에 files[] 라는 폼 이름과 업로드하기 위한 피일 이름을 넣어서 전달해야 하는 것 같았다. 그렇다면 @Multipart 란 무엇인가? 요청을 보낼 때 Http 바디부분을 나눠서 보내는 것이다. ..
Kotlin 클래스 위임 코틀린에서 클래스는 기본적으로 final이다. (상속할 수 없다는 뜻) 따라서 상속하고 싶은 클래스는 명시적으로 open 키워드를 써줘야 한다. 하지만 상속할 수 없는 클래스에 기능을 추가하거나 수정, 활용하고 싶은 경우 위임을 사용하면 좋다. "decorate pattern" 기반 클래스를 property로 가지고 변경이나 추가를 원하는 기능을 재정의한다. "by" 신규, 변경되는 값 외의 나머지를 기반 객체로 연결하는 작업을 컴파일러가 해준다.
Kotlin 스코프 함수 object itself call chain에 속할 수 있다. / return문에도 속할 수 있다. .also{ } .apply{ } .also{ } lambda value의 값을 지정하는 데에 쓸 수 있다. 그 안에서 chain operation으로 쓸 수 있다. val numbers = mutableListOf("one", "two", "three") val countEndsWithE = numbers.run { add("four") add("five") count { it.endsWith("e") } } apply context object : this return : object itself 리턴이 필요없고 수신 객체 자신을 반환하는 경우 사용한다. ex) 객체 초기화 val adam = Pers..
Kotlin Delegated Property 프로퍼티 필드에 접근하는 로직을 다른 객체에게 맡기는 것. 즉, setter와 getter를 가진 객체를 만드는 것
Kotlin field 뜬금없이 field라는 키워드가 등장해서 뭐지? 했다. 원래 자바에서는,, 필드 = 클래스 내 멤버 변수 프로퍼티(속성) = field + getter + setter 하지만 코틀린에서는,, 필드(멤버 변수) = 프로퍼티 왜냐하면 클래스를 생성하면 getter와 setter가 자동으로 생성되기 때문이다. 즉, field는 프로퍼티의 실제 값을 저장하는 변수를 칭하는 키워드 setter 와 getter 코드이다. 아마 이 부분이 코틀린에서는 자동으로 생성되는 듯 set(value){ field = value } get() = field
Kotlin 지연 초기화 lateinit / by lazy 늦은 초기화를 하는 이유 : 변수를 꼭 사용하지 않을 경우 메모리 낭비 lateinit과 by lazy의 차이 lateinit var getter/setter 정의 x 초기화 꼭 하고 사용해야함 직접적 프로퍼티 by lazy val (생성 후 값을 변경 할 수 없다.) 선언시 초기화 코드 선언된 프로퍼티를 위임하는 것 필드에 최초 접근했을 때만 값을 초기화 "지연 초기화" by lazy처럼 위임하지 않지 않는 방법도 있다. class LazyProperty(val initializer: () -> Int) { var age:Int ?= null val lazy: Int get() { if(age == null){ age = initializer() } return age!! } }
Kotlin map flatmap .flatMap() 각 요소에 대해 map을 수행한 후 결과를 새로운 배열로 평평하게 펴준다. 즉, iterable을 평평하게 펴준다는 뜻 map처럼 결국은 배열을 리턴한다. 대상 배열의 요소가 3개라면 flatMap은 내부적으로 3번 호출된다. map은 무조건 1대1 매핑이지만 flatMap은 1대1 뿐만 아니라 1대다 매핑이 가능하다. flatmap에 넣어주는 값은 iterable한(반복 가능한) 값이어야 한다.
Kotlin fold reduce Collection내의 데이터를 모두 모으는(accumulate) 역할 reduce는 초기값이 없이 첫번째 요소부터 시작하고, fold는 초기값을 지정할 수 있다. 빈 Collection에서는 fold는 정상출력이 되지만 reduce는 에러가 발생한다. (초기값이 없어서일듯)