본문 바로가기
728x90

카테고리249

아이템 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.
아이템39 - 태그 클래스보다는 클래스 계층을 사용하라 태그 클래스(tagged class): 상수 모드를 태그라고 부르고, 태그를 포함한 클래스-> 객체 타입을 나타내기 위해 필드를 사용하고, 해당 필드에 따라 동작이 달라지는 클래스를 의미.  태그 클래스의 문제점:복잡성 증가: 하나의 클래스에 여러 유형의 객체를 처리하기 위한 코드가 포함되어 복잡성이 증가합니다.유지보수 어려움: 새로운 유형이 추가될 때마다 기존 코드를 수정해야 하므로 유지보수가 어렵습니다.가독성 저하: 태그를 기반으로 분기하는 코드가 많아지면 코드의 가독성이 떨어집니다.클래스 계층의 장점:명확한 구분: 각 클래스가 자신의 책임을 가지므로 코드가 명확해집니다.확장성: 새로운 유형을 쉽게 추가할 수 있습니다.유지보수 용이: 각 클래스가 독립적이기 때문에 수정이 용이합니다. 태그 클래스 사용.. 2024. 8. 1.
아이템 38 - 연산 또는 액션을 전달할 때는 인터페이스 대신 함수 타입을 사용하라 SAM: Single-Abstract Method인터페이스의 단점:불필요한 복잡성: 인터페이스를 정의하고 이를 구현하는 클래스가 필요합니다.코드 가독성 저하: 인터페이스와 이를 구현하는 클래스를 찾기 위해 코드 베이스를 여기저기 탐색해야 합니다.함수 타입의 장점:간결함: 함수 타입을 사용하면 코드가 더 간결하고 직관적입니다.가독성 향상: 람다 표현식을 사용하여 코드를 읽기 쉽고 유지보수하기 쉽게 만들 수 있습니다.유연성: 함수 타입을 사용하면 필요에 따라 더 유연하게 코드를 작성할 수 있습니다.예시:인터페이스를 사용한 코드:interface ButtonClickListener { fun onClick()}class MyButton : ButtonClickListener { override fu.. 2024. 8. 1.
아이템 37 - 데이터 집합 표현에 data 한정자를 사용하라 Kotlin에서는 데이터 집합을 표현할 때 data 클래스를 사용하면 여러 가지 편리한 기능을 자동으로 제공받을 수 있습니다. data 클래스를 사용하면 코드가 간결해지고, 데이터 객체의 비교, 복사, 문자열 표현 등을 쉽게 처리할 수 있습니다.equals: 객체의 내용을 비교합니다.hashCode: 객체의 해시 코드를 생성합니다.toString: 객체의 문자열 표현을 제공합니다.copy: 객체를 복사할 수 있습니다.(얕은 복사)componentN: 객체의 각 속성에 접근할 수 있습니다.// 얕은복사data class Address(var street: String, var city: String)data class Person(var name: String, var address: Address)fun.. 2024. 7. 14.
아이템 36 - 상속보다는 컴포지션을 사용하라 컴포지션:다른 객체의 인스턴스를 자신의 인스턴스 변수로 포함해서 메서드를 호출하는 기법객체 지향 프로그래밍에서 클래스 간의 관계를 정의하는 방법 중 하나로, 객체가 다른 객체를 포함하여 기능을 구현하는 방식입니다. 컴포지션은 "has-a" 관계를 나타내며, 한 객체가 다른 객체의 구성 요소로 포함되는 구조를 의미합니다.- 컴포지션은 더 안전하고, 유연하고 명시적이다. - (컴포지션이란? 다른객체의 인스턴스를 자신의 인스턴스 변수로 포함해서 메서드를 호출하는 기법이다)- 상속을 사용할때? - 명확한 is-a 관계일때 - 슈퍼클래스를 상속받은 모든 서브클래스는 슈퍼클래스로도 동작할 수 있어야한다. - 슈퍼클래스의 단위테스트는 서브클래스로도 통과할 수 있어야 한다는 의미(LSP)- 오버라이딩 제한 .. 2024. 7. 14.
아이템35 - 복잡한 객체를 생성하기 위한 DSL을 정의하라 DSL (Domain-Specific Language):특정 도메인에 특화된 간결하고 표현력 있는 언어를 의미합니다.코틀린 DSL은 코틀린 언어를 활용하여 특정 도메인에 특화된 구문과 API를 정의하는 것입니다.DSL의 장점:가독성: DSL을 사용하면 코드가 마치 자연어처럼 읽히게 되어 가독성이 크게 향상됩니다.간결성: 복잡한 객체 생성 로직을 간결하게 표현할 수 있습니다.유지보수성: 특정 도메인에 특화된 구문을 사용하여 코드의 유지보수성을 높일 수 있습니다. DSL 의 길은 멀고 험하구나.. 2024. 7. 11.
아이템 34 - 기본 생성자에 이름 있는 옵션 아규먼트를 사용하라 이름 있는 아규먼트(named arguments):함수나 생성자를 호출할 때, 각 파라미터의 이름을 명시하여 값을 전달하는 방법입니다.이 방법을 사용하면 코드의 가독성이 높아지고, 어떤 값이 어떤 파라미터에 전달되는지 명확해집니다.기본 값(default values):함수나 생성자의 파라미터에 기본 값을 제공하여, 호출 시 해당 값을 생략할 수 있게 합니다.이를 통해 불필요한 오버로드(overload)를 줄이고, 코드의 간결성을 유지할 수 있습니다.//이름 있는 아규먼트fun createUser(name: String, age: Int, email: String) { println("Name: $name, Age: $age, Email: $email")}fun main() { // 이름 있는 .. 2024. 7. 11.
728x90