본문 바로가기

공부 자료/코틀린[Kotlin]

(43)
[Atomic 46] 컬렉션에 대한 연산 객체 컬렉션에 대한 연산을 한꺼번에 수행할 수 있는 능력 이전 아톰들에서 map(), filter(), any(), forEach() 등 다양한 함수들을 보았는데, 오늘의 아톰에서는 List와 그 외의 컬렉션에서 사용할 수 있는 다른 연산을 학습할 예정이다. 어떤 연산들이 있는지 알아보자. [ List 만들기 ] import atomictest.eq fun main() { // 람다는 인자로 추가할 원소의 인덱스를 받는다 val listl = List(10) { it } listl eq "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]" // 한 값으로만 이뤄진 리스트 val list2 = List(10) { 0 } list? eq "[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]" // ..
[Atomic 45] 람다의 중요성 프로그래밍에 중요한 능력을 부여해주는 람다 람다는 문법 설탕처럼 보일 수 있는데, 사실상 중요한 능력을 부여해 준다고 한다. 람다가 어떤 능력을 부여해 주는지 이번 아톰에서 학습할 예정이다. [ filter() ] filter() 함수 : 표준 라이브러리 함수 : 보존하고 싶은 원소를 선택하는 술어를 인자로 받아 술어를 람다로 지정 : 컬렉션에서 원소를 선택하는 코드를 작성하면 직접 처리해야 하는 이터레이션을 처리해줌 import atomictest.eq // 2의 배수 출력 fun filterEven(nums: List): List { val result = mutableListOf() for (i in nums) { if (i % 2 = 0) { result += i } } return result ..
[Atomic 44] 람다 이해하기 쉬운 간결한 코드 작성을 위한 람다 오늘은 람다에 대한 학습을 다루는 아톰이다. 람다는 자바에서도 잠깐 다뤄보기는 했지만 많이 사용하지는 않았었는데, 코틀린에서는 어떻게 쓰이는지 알아보자 [ 람다 ] 람다 : 부가적인 장식이 덜 들어간 함수로, 함수 리터럴이라고 불리기도 함 : 이름이 없고, 함수 생성에 필요한 최소한의 코드만 필요 : 다른 코드에 람다를 직접 삽입할 수 있음 : 중괄호({}) 사이에 작성하며, 파라미터 목록과 함수 본문 사이에 -> 가 들어감 : 타입 추론도 가능 : 람다에 파라미터가 없는 경우가 존재하며, 이 경우 화살표를 남겨두는 것이 아닌 화살표 사용을 하지 않는 것을 권장 import atomictest.eq fun main(){ val list = listOf(1, 2..
[Atomic 43] break와 continue 루프 안에서 점프 가능한 break와 continue  오늘의 아톰은 break와 continue로 자바에서 학습했을 때 반복 루프에서 많이 사용했다.코틀린에서는 과연 어떻게 쓰이고 어떻게 다른지 알아보자 [ break & continue ] : 코틀린에서 break와 continue를 사용해 제한적인 점프를 제공: for / while / do-while 루프 요소 안에서만 사용 가능: break는 루프의 끝으로만, continue는 루프의 시작 위치로만 점프 가능: 실전에서는 자주 사용하지 않음: 루프 전체나 루프 본문을 별도의 함수로 추출하면 break나 continue를 리턴으로 대체 가능 (따라서 많이 사용하지 않음)  [ for 루프 ]import atomictest.eqfun main() {..
[Atomic 42] 확장 프로퍼티 확장 함수 정의처럼 확장 프로퍼티도 정의할 수 있다? 확장 함수를 정의했던 것처럼 확장 프로퍼티의 수신 객체 타입을 지정하는 것도 가능한데, 이는 확장 함수를 정의하는 방법과 비슷하다. 오늘은 확장 프로퍼티를 정의하는 방법에 대해 학습하는 아톰이다. [ 확장 프로퍼티 ] 확장 프로퍼티 : 확장 대상 타입을 함수나 프로퍼티 이름 바로 앞에 작성 : 커스텀 게터가 필요하며, 프로퍼티에 접근할 때마다 프로퍼티 값이 계산됨 : 파라미터가 없는 확장 함수는 항상 확장 프로퍼티로 변환이 가능하지만 변환 이전에 생각하는 것을 권장 : 기능이 단순하고 가독성을 향상시키는 경우에만 프로퍼티를 권장 fun ReceiverType.extensionFunction() { ... } val ReceiverType.extensi..
[Atomic 41] 제네릭스 소개 여러 타입에 대해 작동할 수 있는 컴포넌트인 파라미터화한 타입을 만드는 제네릭스 오늘은 여러 가지 클래스에 적합한/관계있는 제네릭스에 대해 학습하는 아톰이다. [ 제네릭스 ] 제네릭스 : 클래스나 함수를 작성할 때 타입 제약을 느슨하게 해 표현력을 최대로 제공 : 제네릭 타입 정의를 위해 클래스 이름 뒤에, 내부에 하나 이상의 제네릭 플레이스 홀더가 들어있는 부등호()를 추가 import atomictest.eq class GenericHolder (private val value: T){ // T 타입의 객체를 저장 및 반환 fun getValue(): T = value } fun main() { val hi = GenericHolder(Automobile("Ford")) val a: Automobil..
[Atomic 40] 확장 함수와 널이 될 수 있는 타입(라이브러리 함수) 보이는 것과 실체가 다를 수 있다? 오늘의 아톰은 코틀린 표준 라이브러리에서 제공하는 널과 관련된 함수에 대해서 알아볼 예정이다. isNullOrEmpty() : 수신 String이 null이거나 빈 문자열인지 검사 isNullOrBlank() : isNullOrEmpty()와 같은 검사를 수행 : 온전히 공백 문자(공백 뿐 아니라 탭(/t)과 새줄 문자(/n)도 포함)로만 구성되어 있는지 검사 import atomictest.eq fun main(){ val s1:String? = null s1.isNullOrEmpty() eq true s1.isNullOrBlank() eq vtrue val s2 = "" s2.isNullOrEmpty() eq true s2.isNullOrBlank() eq true..
[Atomic 39] 널 아님 단언 어떤 참조가 null이 될 수 없다는 사실을 특별히 알 수 있는 경우가 있다? 오늘의 아톰은 널이 될 수 있는 타입을 처리할 수 있는 두번째 접근 방법 중 하나로, 지난 아톰에서 잠시 언급했던 !!를 이야기 하는 아톰이다. [ 널 아님 단언 ] 널 아님 단언 : null이 될 수 없다고 주장하기 위해 느낌표 두 개(!!)를 사용 : x!! - x가 null이 아니라는 것을 보장하며, null이 아니라면 x를, null이라면 오류 발생 : 일반적으로는 !!를 그냥 쓰는 것이 아닌 역참조와 함께 사용 (.!!로 사용) : 널 아님 단언을 사용하지 않고 안전한 호출이나 명시적인 null 검사를 활용하는 것을 권장 : 널 아님 단언을 자주 사용하는 경우 언급하는 적절한 단언과 함께 함수를 분리하는 것이 좋음 i..