728x90 공부/이펙티브코틀린48 아이템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. 아이템 33 - 생성자 대신 팩토리 함수를 사용하라 5장 - 객체 생성코틀린에서는 정적 메서드(static method) 를 사용할 수 없다 자바 static method 와의 비교1. Companion Object- 클래스와 연결된 싱글톤 객체class MyClass { companion object { fun myStaticMethod() { println("This is a static-like method") } }}// 사용 방법MyClass.myStaticMethod() 2. Top-Level Functions- 클래스 외부에 정의된 함수. 정적 메서드처럼 클래스 인스턴스 없이 호출할 수 있다.fun myTopLevelFunction() { println("This is a top-l.. 2024. 7. 11. 아이템 32 - 추상화 규악을 지켜라 추상화 규악(Abstraction Contract)은 코드의 특정 부분(함수, 클래스, 인터페이스 등)이 다른 부분과 상호작용하는 방식에 대한 명확한 약속입니다. 이는 코드의 명확성, 예측 가능성, 유지 보수성을 향상시킵니다.규칙을 지켜야 하는 이유일관성 유지: 예측 가능한 방식으로 작동하도록 하여 다른 개발자들이 이해하고 사용할 수 있게한다유지 보수성 향상: 규악을 지키면 코드를 변경할 때 영향을 받는 부분을 쉽게 예측할 수 있어 유지보수가 용이해 진다.클래스를 상속하거나 다른 라이브러리의 인터페이스를 구현할 때는 규악을 반드시 지켜야 합니다.규약을 지키지않을 경우 아래와 같이 잘못된 값이 나올 수 있다class Item32 { @Test fun p_203_Test() { val.. 2024. 7. 4. 아이템 31 - 문서로 규악을 정의하라 KDoc 스타일로 주석을 남긴다.이해도 향상문서화된 코드는 다른 개발자가 더 쉽게 이해할 수 있다.유지보수성 증가명확한 문서화는 코드의 유지 보수성을 높인다.코드의 사용 방법과 제약 사항을 이해하고, 이를 토대로 수정하거나 개선할 수 있다.사용자 신뢰 증가문서화된 코드는 사용자에게 신뢰감을 준다./** * 요소가 추가된 횟수를 기록하는 세트. * * @param T 세트에 포함된 요소의 타입 * @property elementsAdded 세트에 추가된 요소의 수 */class CounterSetKDoc( private val innerSet: MutableSet = mutableSetOf()) : MutableSet by innerSet { /** * 세트에 추가된 요소의 수. .. 2024. 7. 2. 이전 1 2 3 4 5 6 다음 728x90