분류 전체보기 1341

Ch12. 스레드 풀과 Executor 프레임워크 - ExecutorService(작업 컬렉션 처리)

ExecutorService는 작업을 한 번에 편리하게 처리하는 invokeAll() , invokeAny() 기능을 제공한다.작업 컬렉션 처리invokeAll() List> invokeAll(Collection> tasks) throws InterruptedException모든 Callable 작업을 제출하고, 모든 작업이 완료될 때까지 기다린다.  List> invokeAll(Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException지정된 시간 내에 모든 Callable 작업을 제출하고 완료될 때까지 기다린다.invokeAny() T invokeAny(Collection> tasks) throws InterruptedExce..

Ch05. 변경과 설계 - 중복 할인 정책 추가하기

절차지향 설계에서의 중복할인 정책 추가 시, 문제점하나의 DiscountPolicy를 조회하던 로직을 여러 개의 DiscountPolicy를 조회하도록 수정해야 한다.calculationDiscountPolicy를 호출 시, 여러 개의 DiscountPolicy를 전달하도록 코드 수정이 필요하다.루프를 돌면서, 할인 정책 타입에 따른 금액을 계산한 뒤, 이 값을 더해 반환해야 한다.기능을 확장하기 위해 이미 존재하는 코드를 수정해야 한다. 이러한 코드는 여러 개의 문제점을 가진다.수정할 코드를 찾기도 어려우며, 수정할 부분과 상관없는 코드로 변경의 영역이 전파되어, 버그가 발생할 위험이 있다. 테스 하기 용이하지 않다.(응집도가 낮아 현재 수정과 상관없는 코드까지 함께 테스트해야 한다)수정한 코드에 대한..

오브젝트 2024.10.13

Ch05. 변경과 설계 - 설계 평가하기

상속을 이용한 클래스 계층 구조 구성서로 다른 이유로 변경되는 코드를 분리할 때 사용할 수 있는 가장 간단한 방법은 상속이다. 상속에서는 변경의 이유에 따라 코드를 자식/부모 클래스로 분리한다.상속에서는 부모 클래스에 중복을 제거하기 위해 공통 로직을 위치시킨다.상속 계층을 구성하기 위해 상속받아 사용되어야 하는 메서드는 추상 메서드로, 이를 사용하는 클래스는 추상 클래스로 구현한다.EX) Movie의 상속을 이용한 클래스  계층 구조 구성공통 로직을 Movie에 두고, 자식 클래스(AmountDiscount, PercentDiscount)에서 이를 상속받는다.오버 라이딩 되어 사용될 메서드(calculateDiscount)를 추상 메서드로, 이를 사용하는 클래스를 추상 클래스로 구현한다.오버 라이딩된 ..

오브젝트 2024.10.12

Ch05. 변경과 설계 - 캡슐화

변경 관점에서의 캡슐화변경 관점에서의 캡슐화는 변하는 부분을 내부로 숨기는 추상화 기법을 의미한다. 즉, 캡슐화는 변하는 부분과 변하지 않는 부분을 식별한 후에 변하는 부분을 안정적인 부분 뒤로 감추는 기법이다. 캡슐화는 낮은 결합도의 기반이다.인터페이스 뒤로 구현을 감춤으로써, 변하는 부분을 캡슐화타입 캡슐화타입의 변경을 외부에 감추는 기법이다. 객체지향에서는 타입 캡슐화를 지키는 것이 가장 중요하다. 타입 캡슐화는 그래들의 다형성 패턴과 변경 보호 패턴의 관점에서 떠올리면 쉽게 이해가 가능하다.다형성 패턴을 적용해서 영화가 동일한 메시지를 전송하도록 협력을 통합하고, 변경 보호 패턴을 적용해서 추상화를 이용해 변하는 타입을 숨겼다. 의존성 역전 원칙상위 모듈과 하위 모듈 모두 추상화에 의존하도록 코드..

오브젝트 2024.10.12

Ch05. 변경과 설계 - 결합도

변경 관점에서의 결합도변경 관점에서 결합도는 외부의 모듈이 변경될 때 함께 변경되는 정도를 의미한다.높은 결합도: 외부의 모듈이 변경될 때 함께 변경되는 빈도가 높을 경우낮은 결합도: 외부의 모듈이 변경될 때 함께 변경되는 빈도가 낮을 경우결합도는 의존성이 존재한다는 전제하에서 변경에 의한 영향의 정도를 표현한다. 의존성이 변경 가능성의 존재 유무를 의미한다면, 결합도는 변경이 얼마나 자주 발생하는지를 의미하므로, 상대적이다.의존성 제어 원칙(결합도 낮추기)자주 변하는 것과 변하지 않는 것을 분리하라, 그리고 자주 변하지 않는 것에 의존하도록 해야 한다.A -> B에 의존한다면 B에서 자주 변하지 않는 안정적인 부분을 자주 변하는 불안정한 부분으로부터 코드 안에서 명확히 분리한다.A가 B의 안정적인 부분..

오브젝트 2024.10.12

Ch05. 변경과 설계 - 응집도

변경 관점에서의 응집도변경 관점에서의 응집도는 모듈 내부의 요소들이 함께 변경되는 정도를 의미한다.높은 응집도 - 모듈 전체의 코드가 동일한 시점에 동일한 속도록 변경된다.낮은 응집도 - 모듈 요소들이 서로 다른 시점에 서로 다른 속도로 변경된다..EX) 절차지향 설계와 객체지향 설계에서의 응집도 차이절차지향 설계에서는 할인 정책의 종류나 할인 금액을 계산하는 방법이 변경할 때/ 할인 조건의 종류나 할인 여부를 판단하는 방법이 변경될 때, 변경이 된다. 즉, 서로 다른 시점에 서로 다른 속도로 변경되는 2개의 메서드를 포함하고 있다. 객체지향 설계에서는 각 클래스는 단 하나의 이유 때문에 변경이된다.  응집도는 단일 책임 원칙(SRP)와도 연관이 있는데, 단일 책임 원칙은 응집도가 높은 클래스를 만들기 ..

오브젝트 2024.10.12

Ch05. 변경과 설계 - 변경과 설계

설계란? 코드를 배치하는 방식이다. 동일한 기능을 구현하는 코드를 서로 다른 방식으로 배치하면, 서로 다른 설계가 된다.훌룡한 설계를 하기 위해서는 응집도가 높고, 결합도가 낮고, 캡슐화를 지키도록 코드를 배치하면 된다.응집도모듈 내부의 특성으로 어떤 모듈 내부에 함께 포함된 요소들의 기능적인 집중도 또는 데이터와 메서드 사이에 관련된 정도를 의미한다.응집도가 높다: 모듈러에 포함된 요소들이 하나의 기능에 집중하거나, 데이터와 메서드가 밀접하게 연관되어 있다.응집도가 낮다: 여러 기능에 집중한 요소들이 함께 모여 있거나, 데이터와 메서드가 밀접하게 연관되어 있지 않다.훌룡한 설계는 응집도가 높아야 한다.결합도모듈 외부의 특성으로 모듈이 외부의 다른 모듈에 의존하는 정도 또는 다른 모듈에 대해 알고 있는 ..

오브젝트 2024.10.12

Ch03. L3 수준에서 외울 것들 - 캡슐화와 패킷

IPV4 주소의 기본 구조IPv4 -> 32Bit로 구성되어 있으며, 8Bit * 4로 되어있다.(최대 0~255를 2진법으로 나타낸 수가 4개)ipconfig를 통해, 현재 내 IP 주소를 알 수 있다.8Bit씩, (.)도트 값을 통해 구분한다.IP 주소는 크게 Network ID(24 Bit), Host ID(8 Bit)로 구분한다.Network ID를 주소, Host ID를 번지로 외우자Network ID를 가지고 주소로 이동시킨 뒤, HostID를 통해 상세 주소로 이동하는 것으로 생각하면 외우기 쉽다.L3 PacketPacket이라는 말은 L3 IP Packet으로 외우자Header와 Payload로 나뉘며, 이는 상대적인 분류이다.최대 크기는 MTU 이다.MTU는 Header + payload..

Ch05. 객체지향 구현 - 애플리케이션 객체 추가하기

간접화 패턴(INDIRECTION)문제 - 직접적인 의존을 피하기 위해 어디에 책임을 할당해야 하는가?해결 방법 - 다른 컴포넌트나 서비스가 직접 의존하지 않도록 중재하는 중간 객체에 책임을 할당하라순수한 가공물 패턴(PURE FABRICATION)문제 - 적당한 책임을 가진 클래스를 찾지 못하는 상황이거나 높은 응집도와 낮은 결합도를 위반하고 싶지 않은 경우에는 누구에게 책임을 할당해야 하는가?해결 방법 - 도메인 개념을 표현하지 않는 인위적으로 만든 클래스에 책임을 할당하라. 이런 클래스는 높은 응집도, 낮은 결합도, 재사용을 지원하기 위해 만들어진다.컨트롤러(CONTROLLER)문제 - UI 계층을 통해 전달되는 시스템의 오퍼레이션을 전달받고 조정(제어할) 최초의 객체는 무엇인가?해결 방법 - 워크..

오브젝트 2024.10.09

Ch05 객체지향 구현 - 유연하고 일관적인 협력

메시지와 메서드 분리의 문제점컴파일 타임 의존성과 런타임 의존성이 다르다.외부객체가 런타임 객체를 생성을 결정해서 이를 사용하는 객체에 전달해야 한다. 컴파일 타임 의존성과 런타임 의존성 사이의 차이를 해결하기 위해 외부의 객체가 의존하는 객체를 전달하는 방식을 의존성 주입이라고 한다. 의존성 주입 방법생성자를 추가런타임에 협력할 수 있는 객체를 선택해서 입력받을 수 있다.새로운 클래스의 인스턴스가 추가되더라도 생성자를 통해 이를 전달받을 수 있기 때문에 이를 사용하는 부분을 코드를 수정 없이 추가가 가능하다.Setter 주입객체 생성 후 Setter를 통한 의존성 주입메서드 주입 메서드 실행 시 인자를 이용한 의존성 해결일관성 있는 설계추상화에 대한 의존성으로 협력관계를 정의하면 상위 수준에서 객체들이..

오브젝트 2024.10.09