본문 바로가기
728x90

공부/이펙티브코틀린48

아이템 30 - 요소의 가시성을 최소화하라 작은 인터페이스는 배우기 쉽고 유지하기 쉽다보이는 요소 자체가 적다면, 유지보수하고 테스트할 것이 적다변경을 가할 때는 기존의 것을 숨기는 것보다 새로운 것을 노출하는 것이 쉽다.해당 코드는 delegate 를 사용하여 MutableSet 인터페이스를 구현한 클래스MutableSet 인터페이스의 구현을 내부 MutableSet 인 innerSet 에 위임함elementsAdded 의 setter 를 private 로 설정하여 외부에서 수정할 수 없도록 함 private var _elementsAdded: Int = 0 val elementsAdded: Int get() = _elementsAdded 식으로도 가능하겠지만 아래의 코드가 더 깔끔해보인다.class Coun.. 2024. 7. 2.
아이템 29 - 외부 API 를 랩(warp)해서 사용하라 불안한 API를 로직과 직접 결합시키지 않는 것이 좋다/** * 외부 API를 랩핑하지 않은 코드 * WeatherService 클래스에서 직접 외부 API를 호출합니다. * API 응답을 받아 바로 처리합니다. */class WeatherServiceNotWrapped { fun getWeather(location: String): String { val response = ExternalWeatherApi.getWeather(location) return response ?: throw RuntimeException("Failed to fetch weather") }}/** * 외부 API 클라이언트를 랩핑한 클래스 * WeatherApiWrapper 클래스를 만들.. 2024. 6. 23.
아이템 28 - API 안정성을 확인하 API 안정성을 확인하는 것은 소프트웨어의 일관성과 신뢰성을 보장하기 위해 매우 중요합니다. 안정적인 API는 사용자와 개발자에게 신뢰를 주고, 소프트웨어 유지보수를 용이하게 합니다.Versioning SystemVersioning System 은 API 의 안정성을 유지하고, 변경 사항을 명확히 전달하기 위해 사용하는 체계적인 버전 관리 방법Semantic Versioning (SemVer)Semantic Versioning 은 가장 널리 사용되는 버전 관리 시스템 중 하나로, 세가지 숫자로 구성MAJOR.MINOR.PATCH. 각 숫자는 특정한 의미를 가지고 있음MAJOR: 하위 호환성이 깨지는 변경이 있을 때 증가합니다.MINOR: 하위 호환성을 유지하면서 새로운 기능을 추가할 때 증가합니다.PAT.. 2024. 6. 23.
아이템 27 - 변화로부터 코드를 보호하려면 추상화를 사용하라 소프트웨어는 시간이 지남에 따라 요구 사항, 기술 스택, 외부 라이브러리 등 다양한 이유로 변경될 수 있다. 이러한 변화는 코드의 유지보수에 큰 부담을 줄 수 있다.추상화로 실질적인 코드를 숨기면, 사용자가 세부 사항을 알지 못해도 괜찮다는 장점이 있다.ex) 자동차가 작동만 한다면 내부를 변경하더라도 사용자는 무엇이 바뀐지 모를것이다.상수하드코딩된 값을 상수로 추출하여 코드의 가독성을 높이고, 변경 시 코드 전체를 수정할 필요 없이 상수만 수정하면 되게 한다.두 번 이상 사용되는 값은 이렇게 상수로 추출하는 것이 좋다.상수로 추출하면이름을 붙일 수 있고난중에 해당 값을 쉽게 변경할 수 있습니다.// 하드코딩된 값fun calculateDiscount(price: Double): Double { r.. 2024. 6. 21.
아이템 26 - 함수 내부의 추상화 레벨을 통일하라. 추상화 레벨높은 레벨로 갈수록 물리 장치로부터 점점 멀어집니다.높은 레벨일 수록 프로세서로부터 멀어진다고 표현함높은 레벨일수룍 단숨함을 얻지만, 제어력을 잃습니다.ex) C 언어는 메모리 관리를 직접 할 수 있지만, 자바는 가비지 컬렉터가 자동으로 메모리를 관리해 줍니다.(따라서 메모리 사용을 최적화하는 것이 힘듭니다.)코드도 추상화를 계층처럼 만들어서 사용할 수 있습니다. 이를 위한 기본적인 도구가 "함수"이다.함수도 높은 레벨과 낮은 레벨을 구분해서 사용해야 한다는 원칙이 있다.이를 추상화 레벨 통일(Single Level of Abstraction(SLA))원칙이라 부른다.//추상화 레벨이 통일 되지 않은 케이스class CoffeeMachine { fun makeCoffee() { // 수.. 2024. 6. 21.
아이템 24 - 제네릭 타입과 variance 한정자를 활용하라 기본 - 제네릭 클래스 => 무공변성 -> 즉 공변이 없다out -> 공변성 => 자기자신과 자식 객체 허용 -> 생산만 -> 꺼낼수만 있다.in -> 반공변성 => 자기자신과 부모 객체 허용 -> 소비만 -> 넣을수만 있다.*변성 -> 제네릭 클래스 타입 파라미터에 따라 제네릭 클래스 간의 상속 관계가 어떻게 되는지를 나타내는 용어 선언 지점 변성 -> 클래스 자ㅔ를 공변하거나 반공변하게 만드는 방법사용 지점 변셩 -> 특정 함수 또는 특정 변수에 대해 공변/반공변을 만드는 방법제네릭 제약: class Cage 처럼 제네릭 클래스의 타입 파라미터의 제약을 걸 수 있다. 그외로는 where 로 여러 제약을 줄 수 있다.타입소거: JDK 의 호환성을 위해 런타임 때 제네릭 클래스의 타입 파라미터 정보가 지.. 2024. 6. 13.
아이템 23 - 타입 파라미터의 섀도잉을 피하라 섀도잉프로퍼티와 파라미터가 같은 이름을 가지게 되면, 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가립니다.이름이 같은 순간부터 별로인듯..타입 파라미터 섀도잉을 피해야하고, 타입 파라미터 섀도잉이 발생한 코드는 이해하기 어려울 수 있다.  타입 파라미터 섀도잉을 피하기 위해 명확하고 구체적인 이름을 사용합니다.동일한 이름의 타입 파라미터를 중첩 범위에서 사용하지 않도록 주의합니다.이러한 방법을 통해 코드의 가독성과 유지보수성을 높일 수 있습니다. 2024. 6. 13.
아이템 22 - 일반적인 알고리즘을 구현할 때 제네릭을 사용하라 타입 아규먼트를 사용하는 함수를 제네릭 함수라고 부릅니다.함수에서는 fun 키워드와 함수 이름 사이에 형태의 코드를 입력합니다.클래스와 인터페이스는 이름 뒤에 형태의 코드를 입력합니다.타입 파라미터를 사용하면 개발자는 여러 가지 이득을 얻지만, 프로그램은 실질적인 이득이 없습니다.JVM 바이트 코드의 제한으로 인해, 컴파일 시점에 제네릭과 관련된 정보는 사라집니다.따라서 런타임 때 어떤 이득도 얻을 수 없습니다.제네릭 제한타입 파라미터의 중요한 기능 중 하나는 구체적인 타입의 서브타입만 사용하게 타입을 제한하는 것기본 사용// T는 Number 또는 Number의 하위 타입이어야 함fun processNumber(value: T) { println(value.toDouble())}fun mai.. 2024. 6. 13.
아이템 21 - 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라 프로퍼티 위임을 사용하여, 다양한 조건에서 적용해보자.코틀린에서는 디자인 패턴 Delegate Pattern 을 쉽게 구현할 수 있다.by lazy {}보일러플레이트 코드를 줄일 수 있다. /** * 아래 코드를 보시면 인터페이스 IWindow, 클래스 TransparentWindow, UI가 있습니다. * 클래스들은 모두 IWindow 인터페이스를 상속받았습니다. * UI는 TransparentWindow 를 상속받지 않고, mWindow 를 클래스 내부에 갖고 있습니다. * 그리고 UI는 mWindow.getWidth()처럼 mWindow 의 함수를 호출해주고 있습니다. * 이 구조에서, UI 클래스는 TransparentWindow 의 기능을 내부 변수 mWindow 에 위임하였습니다. * 이 구조.. 2024. 6. 6.
728x90