본문 바로가기
728x90

공부/이펙티브코틀린48

아이템 51 - 성능이 중요한 부분에는 기본 자료형 배열을 사용하라 성능이 중요한 코드 영역에서 기본 자료형 배열(Primitive Arrays)을 사용하는 것이 좋습니다. 기본 자료형 배열은 JVM에서 직접 메모리를 관리하며, 일반적인 컬렉션보다 성능 면에서 많은 이점을 제공합니다. 기본 자료형 배열을 사용하면 다음과 같은 이점이 있다.메모리 효율성: 기본 자료형 배열은 객체를 감싸지 않고 원시 데이터 자체를 저장하므로, 메모리 오버헤드가 적습니다. 예를 들어, IntArray는 정수값을 직접 저장하므로, List와 달리 각각의 정수가 별도의 객체로 관리되지 않습니다.성능 최적화: 기본 자료형 배열은 JVM이 직접 관리하므로, 연산 속도가 빠르고 캐시 효율성이 높습니다. 이로 인해, 대규모 데이터 처리를 할 때 성능이 크게 개선됩니다.간단한 데이터 구조: 기본 자료형 .. 2024. 8. 18.
아이템 50 - 컬렉션 처리 단계 수를 제한하라 컬렉션 처리 메서드는 비용이 많이 든다.적절한 메서드를 활용해서, 컬렉션 처리 단계 수를 적절하게 제한하는 것이 좋다// 비효율적인 코드val result = listOf(1, 2, 3, 4, 5) .map { it * 2 } .filter { it > 3 } .map { it + 1 } .filter { it 3 && it    .filter { it != null }.map { it!! }.filterNotNull().map { }.filterNotNull().mapNotNull { }.map { }.joinToString().joinToString { }.filter { }.filter { }.filter { && }.filter { it is Type }.ma.. 2024. 8. 18.
아이템 49 - 하나 이상의 처리 단계를 가진 경우네는 시퀀스를 사용하라 코틀린에서 컬렉션을 처리할 때, 다음과 같은 코드가 자주 사용됩니다:val numbers = listOf(1, 2, 3, 4, 5)val result = numbers .map { it * 2 } .filter { it > 5 } .map { it + 1 }println(result) // [7, 9, 11] 해당 코드는 map, filter 가 연속적으로 호출된다. 이런 방식은 각 단계마다 새로운 리스트를 생성하므로, 처리 단계가 많아질수록 불필요한 리스트 생성이 발생하고 성능이 저하될 수 있다. 이러한 문제를 해결하기 위해 코틀린은 시퀀스를 제공한다.시퀀스는 중간 처리 단계를 거칠 때마다 새로운컬렉션을 생성하지 않고, 필요할 때마다 요소를 하나씩 처리하는 lazy 방식을 사용한다.va.. 2024. 8. 18.
아이템 46 - 함수 타입 파라미터를 갖는 함수에 inline 한정자를 붙여라 inline 한정자의 역할은 컴파일 시점에 '함수를 호출하는 부분'을 '함수의 본문' 으로 대체하는 것koltin 에서는 고차함수(함수를 인자로 받거나 반환하는 함수)를 사용할 수 있다.고차 함수는 성능에 영향을 미칠 수 있는데, 이는 함수 타입 파라미터를 갖는 함수를 호출할 때마다 새로운 함수 객체가 생성되고 이러한 함수 객체는 런타임 시점에 인라인되지 않기 때문에 오버헫가 발생할 수 있다.  일반적인 함수를 호출하면 함수 본문으로 점프하고, 본문의 모든 문장을 호출한 뒤에 함수를 호출했던 위치로 다시 점프 하는 과정을 거친다.하지만 함수를 호출하는 부분을 함수의 본문으로 대체하면 이러한 점프가 일어나지 않는다. inline 한정자를 사용하면 다음과 같은 장점이 있다.타입 아규먼트에 refied 한정자.. 2024. 8. 16.
아이템 44 - 멤버 확장 함수의 사용을 피하라 어떤 클래스에 대한 확장 함수를 정의할 때 이를 멤버로 추가하는 것은 좋지 않습니다.확장 함수는 첫 번째 아규먼트로 리시버를 받는 단순한 일반 함수로 컴파일됩니다. 왜 멤버 확장 함수를 피해야 하는가?혼란스러운 함수 스코프:멤버 확장 함수는 해당 함수가 어디서 사용 가능한지, 또는 어떤 클래스에 속하는지 혼동을 일으킬 수 있습니다. 예를 들어, 함수가 멤버 함수인지 확장 함수인지 명확하지 않으며, 사용 범위가 제한되기 때문에 코드의 가독성을 해치게 됩니다.예상치 못한 동작:멤버 확장 함수는 일반적인 확장 함수와 다르게 동작할 수 있습니다. 특정 클래스 내부에서만 접근 가능한 확장 함수는 그 클래스의 외부에서는 전혀 보이지 않으며, 이는 코드의 일관성을 깨트리고 예상치 못한 동작을 초래할 수 있습니다.코드.. 2024. 8. 10.
아이템 43 - API 의 필수적이지 않는 부분을 확장 함수로 추출하라 클래스의 메서드를 정의할 때는 메서드를 멤버로 정의할 것인지 아니면 확장 함수로 정의할 것인지 결정해야 합니다. 멤버 함수로 정의한 경우class Circle(val radius: Double) { // 멤버 함수로 정의된 메서드 fun area(): Double { return Math.PI * radius * radius }}fun main() { val circle = Circle(5.0) println("Area: ${circle.area()}") // 멤버 함수 호출} 확장 함수로 정의한 경우class Circle(val radius: Double)// 확장 함수로 정의된 메서드fun Circle.area(): Double { return Math... 2024. 8. 10.
아이템 42 - compareTo 의 규약을 지켜라 compareTo 메서드는 Any 클래스에 있는 메서드가 아닙니다.이는 수학적인 부등식으로 변환되는 연산자 입니다.  compareTo는 객체의 자연 순서를 정의하는 메서드로, 코틀린에서는 Comparable 인터페이스를 구현할 때 반드시 준수해야 할 중요한 규약을 가진다. 이 규약을 올바르게 준수하지 않으면, 정렬이나 이진 탐색 같은 알고리즘에서 예기치 못한 결과가 발생할 수 있다. compareTo 규약반사성 (Reflexive): a.compareTo(a) == 0은 항상 true여야 한다.대칭성 (Symmetric): a.compareTo(b) == 0이면 b.compareTo(a) == 0도 성립해야 한다.추이성 (Transitive): a.compareTo(b) > 0이고 b.compareTo.. 2024. 8. 10.
아이템 41 - hashCode 의 규약을 지켜라 hashCode 함수는 해시 테이블을 구축할 때 사용된다.임의의 길이를 가진 데이터를 고정된 길이의 데이터로 변환(매핑)하는 것이러한 과정을 해싱 한다고 하며, 해시함수에 얻어진 값을 보통 다이제스트(digest)라고 한다.키 값의 무한성과 해시 함수 출력 값의 유한성 때문에 충돌이 일어날 수 있다. 가변성과 관련된 문제:요소가 추가될 때만 해시 코드를 계산합니다.요소가 변경되어도 해시 코드는 계산되지 않으며, 버킷 재배치도 이루어지지 않습니다.그래서 기본적인 LinkedHashSet 와 LinkedHashMap 의 키 는 한번 추가한 요소를 변경할 수 없습니다.=> 해시 기반 컬렉션에서는 키로 사용되는 객체가 불변이어야 한다. 키 객체가 변경 가능한 속성을 가진다면, 객체를 해시 테이블에 추가한 후에 .. 2024. 8. 1.
아이템 40 - equals 의 규약을 지켜라 Any 에는 다음과 같이 잘 설정된 규약들을 가진 메서드들이 있다- equals- hashCode- toString 동등성코틀린에는 두 가지 종류의 동등성이 있습니다.구조적 동등성: equals 메서드와 이를 기반으로 만들어진 == 연산자(!= 포함)로 확인하는 동등성a 가 nullable 이 아니라면 a == b 는 a.equals(b)로 변환되고 a 가 nullalbe 이라면 a?.equals(b) ?: (b === null) 로 변환레퍼런스적 동등성: ===, !==  연산자로 확인하는 동등성두 피연산자가 같은 객체를 가리키면, true 를 리턴합니다.data class Person(val name: String, val age: Int) { override fun equals(other: A.. 2024. 8. 1.
728x90