본문 바로가기
728x90

카테고리249

아이템 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.
아이템 30 - 요소의 가시성을 최소화하라 작은 인터페이스는 배우기 쉽고 유지하기 쉽다보이는 요소 자체가 적다면, 유지보수하고 테스트할 것이 적다변경을 가할 때는 기존의 것을 숨기는 것보다 새로운 것을 노출하는 것이 쉽다.해당 코드는 delegate 를 사용하여 MutableSet 인터페이스를 구현한 클래스MutableSet 인터페이스의 구현을 내부 MutableSet 인 innerSet 에 위임함elementsAdded 의 setter 를 private 로 설정하여 외부에서 수정할 수 없도록 함 private var _elementsAdded: Int = 0 val elementsAdded: Int get() = _elementsAdded 식으로도 가능하겠지만 아래의 코드가 더 깔끔해보인다.class Coun.. 2024. 7. 2.
데이터 베이스 모델링 데이터 베이스 요구사항 분석데이터 모델링현실 세계에 존재하는 데이터를 컴퓨터 세계의 데이터 베이스로 옮기는 변환 과정데이터 모델링 프로세스 목적사용자의 요구 사항을 수집하고 분석하여 개발할 데이터베이스 용도 파악업무에 필요한 데이터가 무엇인지, 그 데이터에 어떤 처리가 필요한지 등을 고려결과물요구 사항 명세서(요구사항 정의서) -> 업무기술서주요작업데이터베이스를 실제로 사용할 주요 사용자의 범위를 결정사용자가 조직에서 수행하는 업무를 분석면담, 설문조사, 업무 관련 문서 등의 방법을 이용해 요구 사항 수집수집된 요구 사항에 대한 분석 결과를 요구 사항 명세서로 작성 2024. 6. 30.
아이템 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.
728x90