TIL
2022.05.03 기록장
Gisungcu
2022. 5. 3. 13:21
ToDo
- 코틀린 공부
- 리액트 튜토리얼
Done
- 코틀린 공부
Weekly goal
- 코틀린 공부
- 리액트 공부
- 피드백 정리
let 함수
- 널이 될 수있는 값을 널이 아닌 값만 인자로 받는 함수에 넘길때 사용
- 원하는 식을 평가해서 결과가 널인지 검사한 다음 사용
- let을 통과하면 수신 객체는 널이 될 수 없는 타입의 값으로 바뀐다
- 여러번 검사를 할 경우가 있는데 그때는 if를 사용해 한번에 검사하는 것이 더 가독성이 좋다
nullable type에 대한 확장 함수
- null이 될 수 있는 타입에 확장 함수는 ?.나 !!를 사용하지 않는다
let도 nuable에 쓸 수 있다
- nullable한 곳에 쓸 수 있지만 괄호안에서 그것의 type도 nuable하게 관리된다
- ?.일 경우는 if로 null 검사와 같다
타입 파라미터는 nullable이다
- 타입 추론을 통한 파라미터는 nullble이다
- t?.toString()등인데 이를 막기위해서는 타입 상한을 지정해야한다 <T : Any> 와 같이
코틀린은 오토 박싱 지원 x
- 오토 박싱이 지원되지 않기 때문에 에러 발생
- 코틀리은 자바와 달리 직접 변환해 줘야함
- 단 숫자 리터럴을 사용할 때는 변환하지 않아도 됨. 이미 산술연산자는 적당한 타입의 값을 받아들일 수 있게 오버로드되어 있음
any,unit, nothing 타입
- any는 자바의 Object와 동일. object와 달리 wait,notify 사용 불가능
- unit은 void와 동일. void와 달리 모든 기능을 갖는 일반적인 타입이며 타입 인자로 쓸 수 있음
- unit은 제네릭 파라미터를 반환하는 함수를 오버라이드 할 때 유용함
- nothing 타입은 정상적으로 함수가 끝나지 않을 경우 사용 가능
mutableCollection과 Collection
- 수정 전용과 읽기 전용이다
- 이 둘을 나눈 이유는 봤을 때 파악이 쉬워서 이며
- 변경 가능한 컬렉션을 넘길 때 원본의 피해를 줄일려면 복사본을 넘겨야 할 수도 있다
- 읽기 전용도 항상 스레드 세잎하진 않다. 그 이유는 다른 곳에서 뮤터블 컬렉션으로 참조하고 있을 수 있기 때문이다
- setOf,mapOf들은 자바 라이브러리에 속한 클래스 인스턴스를 반환하기에 변경이 가능하지만 뮤터블MapOf,뮤터블SetOf등이 존재한다. 자바의 인스턴스를 사용해 변경이 가능하지만 추후에 불변으로 변경될 수 있기에 여기에 의존하면 안된다
배열
- array를 통해 배열 생성 가능
- typeToArray를 통해 컬렉션을 배열로 변환 가능. 스프레드 연산자를 통해 다 꺼내기 가능
- 배열 타입이 항상 객체로 들어가게된다. 박싱을 원하지 않는다면 팩토리 메소드인 IntArray등을 쓸 수 있다
관례
- 어떤 기능과 미리 정해진 이름의 함수를 연결하는 것을 관례(convention)이라고 함
- 예시는 관례를 사용한 산술 연산자 이때는 operator를 붙여야한다
- operator를 붙임으로서 어느 함수가 관례를 따르는지 알 수 있다
- point의 plus를 오버라이딩 하지 않았다면 컴파일 오류가 날 것이다. 곱하기, 나누기 등에 각각의 이름이 따로 존재한다
단항 연산자
- 단항 연산자도 제공한다
compareTo도 관례로 처리가능
- Comparable를 구현하면 >등 부등호로 처리가 가능하다
- equals나 compareTo에 operator가 없는 이유는 최상위에 붙어있기 때문이다
get, in 도 관례에 사용 가능하다, 구조 분해 선언
- get과 in은 관례에 따라 오버라이딩으로 표현한다
- val (x,y) = point은 구조 분해로 component 함수를 만들어 사용하는데 지금은 data class라 자동 생성되었다
위임프로퍼티
- p는 일반 프로퍼티 처럼 보이지만 get이나 set 요청은 delegate가 위임한다
- 이는 컴파일 시에 코드들이 만들어진다
- 이런 행위는 lazy 로딩 시에 효과가 있다
- by lazy 시 이런 행위를 Foo class에서 띄어서 캡슐화 할 수 있다
고차함수
- custom filter 고차함수
시퀀스와 람다 인라인
- 람다 인라인은 람다가 실행되는 바이트 코드를 실제 코드 사이에 넣는 것이다. 함수 호출로 다른 곳을 가는 것이 아닌.
- 이로 인해 인라인은 성능이 향상된다
- 이전에 봤던 시퀀스는 리스트를 중간에 만들지 않아 성능이 향상된다고 했었는데 이는 인라인을 사용하지 않는다.
- 그래서 매번 시퀀스를 붙이는 것은 성능이 나빠질 수 있다
- 크기가 작은 컬렉션은 오히려 일반 컬렉션 연산이 성능이 나을 수 있다
넌로컬 리턴과 로컬 리턴
- 넌로컬 리턴은 인라인 함수에서만 가능한 것으로 람다 내부에서 return시 함수 자체를 끝내는 것이다
- 로컬 리턴은 함수가 끝나는 것이 아닌 람다가 끝나는 것이다. label을 사용해야한다
GitHub - ChoiGiSung/KotlinInAction
Contribute to ChoiGiSung/KotlinInAction development by creating an account on GitHub.
github.com