분류 전체보기(81)
-
상속을 자제하고 합성을 이용하자
결론 : 상속을 이용하면 결합도가 높아지기 때문에 합성을 권장하고 있다. 상속은 명확한 is - a 관계에 있는 경우, 그리고상위 클래스가 확장할 목적으로 설게되었고 문서화도 잘되어 있는 경우에 사용하면 좋다. 하지만, 아래와 같은 이유로 현업에서 상속을 지양하고 있다. 1. 결합도가 높아진다. 결합도 : 하나의 모듈이 다른 모듈에 대해 얼마나 많은 지식을 갖고 있는지를 나타내는 의존 정도를 뜻한다. 객체지향 프로그래밍에서는 결합도는 낮을수록, 응집도는 높을수록 좋다. 그래서 추상화에 의존함으로써 다른 객체에 대한 결합도는 최소화하고 응집도를 최대화하여 변경 가능성을 최소화 할 수 있다. 2. 불필요한 기능 상속 부모 클래스에 메소드를 추가했을때, 자식 클래스에는 적합하지 않는 메소드가 상속되는 문제이다..
2024.01.12 -
정적 팩토리 메소드 권장 이유
정적 팩토리 메소드 권장 이유 정적 팩토리 메소드 : of, from 등 메소드 이름을 지정하고, 생성자 호출 방식이 아닌, 메서드 호출 방식으로 객체를 생성하는 것 정적 팩토리 메소드 장점 (5가지) 이름을 가질 수 있다. 호출 될 때마다 인스턴스를 새로 생성하지 않아도 된다. 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다. 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다. 1. 이름을 가질 수 있다. 기름이 없는 자동차, 기름을 가지고 자동차를 만드는 방식 → 명확히 할 수 있음. A. new를 이용한 예 public class Car { private final String name; ..
2024.01.12 -
일급컬렉션 사용 이유와 불변성 보장 방법
결론 : 일급 컬렉션을 사용하면 상태과 로직을 따로 관리할 수 있기 때문에 로직이 사용되는 클래스의 부담을 줄일 수 있고, 중복코드를 줄일 수 있다. 불변성을 보장하기 위해 unmodifiable을 사용한다. 1. 일급컬렉션이란? Collection을 Wrapping하면서, Wrapping한 Collection 외 다른 멤버 변수가 없는 상태를 말한다. 2. 일급컬렉션 사용이유 // GSConvenienceStore.class public class GSConvenienceStore { // 편의점에는 여러 개의 아이스크림을 팔고 있을 것이다. private List iceCreams; public GSConvenienceStore(List iceCreams) { this.iceCreams = iceCr..
2024.01.12 -
전역에러를 처리하는 ControllerAdvice, RestControllerAdvice
전역에러를 처리하는 ControllerAdvice, RestControllerAdvice Spring은 전역적으로 ExceptionHandler를 적용할 수 있는 @ControllerAdvice와 @RestControllerAdvice 어노테이션을 제공하고 있다. @ControllerAdivce는 여러 컨트롤러에 대해 전역적으로 ExceptionHandler를 적용해준다. 다음과 같이 에러를 핸들링하는 클래스를 만들어 어노테이션을 붙여주면 에러 처리를 위임할 수 있다. @RestControllAdvice와 @ControllAdvice의 차이는? 차이는 크게 없다. @Controller와 @RestController 와 동일하게 @ResponseBody의 유무 차이만 있을 뿐이다. 그러므로 결과 타입을 J..
2024.01.11 -
HashSet 중복여부 판별 재정의
HashSet 중복여부 판별 재정의 위 두 객체는 주솟값이 다르기때문에 중복여부에서 판별되지 않고있다. Name의 n필드가 서로 같다면 중복이 되도록 해주고 싶다! 그러기 위해서는 equals()와 hashCode()를 재정의한다. 아래는 실제로 자동차 이름이 같은 경우 중복여부를 판별하도록 하기 위해 재정의한 코드이다. (자동차 경주[2차] 때 적용함.) public class Cars { private final List cars; private void validateDuplicateCarName() { int uniqueCarCount = new HashSet(cars).size(); if (cars.size() != uniqueCarCount) { throw new DuplicateExcepti..
2024.01.11 -
getter를 지양해야하는 이유 및 지양 방법, 또 무조건 지양해야해?
결론 : getter를 사용하면 캡슐화가 깨진다. 따라서, getter를 지양해야하며 getter를 지양하기 위해서는 객체에 메시지를 전달하여 원하는 결과를 얻도록 한다. 또, 객체의 값을 외부로 표현해줘야하는 경우에는 getter 사용을 피할 수 없다. 캡슐화 : 객체지향 프로그래밍의 핵심원칙으로, 외부에서 객체 내부 상태에 직접 접근해서는 안된다고 명시한다. 이를 위해 접근제어자를 private으로 두고, getter/setter를 사용하라. 1. getter지양 이유 getter를 사용함으로써 캡슐화가 깨진다고 한다. 캡슐화는 외부에서 객체 내부에 어떤 속성이 있는지 완벽하게 알지 못하게 해야한다는 것인데, getter를 통해 객체의 특정필드가 있다는 사실을 외부에 노골적으로 공개하게 되기 때문이다..
2024.01.11