반응형 SMALL 그룹 스터디 공부(IT 서적)52 12 다형성 이번 장에서는 상속의 관점에서 다형성이 구현되는 기술적인 매커니즘을 살펴본다., 상속의 오해와 진실 코드 재사용을 목적으로 상속을 사용하면 변경하기 어렵고 유연하지 못한 설계에 이를 확률이 높아진다. 상속의 목적은 코드 재사용이 아니다. 상속은 타입 계층을 구조화하기 위해 사용해야 한다. 타입 계층은 객체지향 프로그래밍의 중요한 특성 중의 하나인 다형성의 기반을 제공한다. 객체지향 패러다임이 주목받기 시작하던 초기에 상속은 타입 계층과 다형성을 구현할 수 있는 거의 유일한 방법이었다. 하지만 최근의 언어들은 상속 이외에도 다형성을 구현할 수 있는 다양한 방법들을 제공하고 있다. 따라서 상속의 중요성이 이전에 비해 많이 낮아졌다. 다형성 다형성(Polymorphism) 이라는 단어는 ploy(많은) + m.. 2023. 10. 1. chapter 11 합성과 유연한 설계 상속 관계는 is-a 관계라고 부르고 합성 관계는 has-a 관계라고 부른다. 상속을 제대로 활용하기 위해서는 부모 클래스의 내부 구현에 대해 상세하게 알아야 하기 때문에 자식 클래스와 부모 클래스 사이의 결합도가 높아질 수밖에 없다. 결과적으로 상속은 코드를 재사용할 수 있는 쉽고 간단한 방법일지는 몰라도 우아한 방법은 아니다. 합성은 구현에 의존하지 않는다는 점에서 상속과 다르다. 합성은 내부에 포함되는 객체의 구현이 아닌 퍼블릭 인터페이스에 의존한다. 상속 관계는 클래스 사이의 정적인 관계인 데 비해 합성 관계는 객체 사이의 동적인 관계다. 이 차이점은 생각보다 중요한데, 코드 작성 시점에 결정한 상속 관계는 변경이 불가능하지만 합성 관계는 실행 시점에 동적으로 변경할 수 있기 때문이다. 01. 상.. 2023. 9. 18. chapter 16 CompletableFuture: 안정적 비동기 프로그래밍 16.1 Future의 단순 활용 미래의 어느 시점에 결과를 얻는 모델을 활용할 수 있도록 Future 인터페이스를 제공하고 있다. 비동기 계산을 모델링하는 데 Future를 이용할 수 있으며, Future은 계산이 끝났을 때 결과에 접근할 수 있는 참조를 제공한다. ExecutorService executor = Executors.newCachedThreadPool(); //스레드 풀에 테스크를 제출하려면 ExecutorService를 만들어야한다. Future future = executor.submit(new Callable() { //Callable을 ExecutorService로 제출한다. @Override public Double call() throws Exception { // 시간이 오래.. 2023. 9. 13. chapter 10 상속과 코드 재사용 객체지향에서는 코드를 재사용하기 위해 '새로운'코드를 추가한다. 객체지향에서 코드는 일반적으로 클래스 안에 작성되기 때문에 객체지향에서 클래스를 재사용하는 전통적인 방법은 새로운 클래스를 추가하는 것이다. 클래스를 재사용하기 위해 새로운 클래스를 추가하는 가장 대표적인 기법인 상속에 관해 살펴보기로 한다. 객체지향에서는 상속 외에도 코드를 효과적으로 재사용할 수 있는 방법이 한 가지 더 있다. 새로운 클래스의 인스턴스 안에 기본 클래스의 인스턴스를 포함시키는 방법으로 흔히 합성이라고 부른다. 01 상속과 중복 코드 DRY 원칙 중복 코드는 변경을 방해한다. 이것이 중복 코드를 제거해아 하는 가장 큰 이유다. 중복 코드가 가지는 가장 큰 문제는 코드를 수정하는 데 필요한 노력을 몇 배로 증가시킨다는 것이다.. 2023. 9. 12. chapter 15 CompletableFuture와 리액티브 프로그래밍 컨셉의 기초 이 장의 내용 Thread, Future, 자바가 풍부한 동시성 API를 제공하도록 강요하는 진화의 힘 비동기 API 동시 컴퓨팅의 박스와 채널 뷰 CompletableFuture 콤비네이터로 박스를 동적으로 연결 리액티브 프로그래밍용 자바 9 플로 API의 기초를 이루는 발행 구독 프로토콜 리액티브 프로그래밍과 리액티브 시스템 15.1 동시성을 구현하는 자바 지원의 진화 Runnable, Thread → ExecutorService, Callable, Future, 제네릭 → RecursiveTask → 람다 → 분산 비동기 프로그래밍 15.1.1 스레드와 높은 수준의 추상화 프로세스는 다시 운영체제에 한 개 이상의 스레드 즉, 본인이 가진 프로세스와 같은 주소 공간을 공유하는 프로세스를 요청함으로 태.. 2023. 9. 6. 09 유연한 설계 01 개방-폐쇄 원칙 개방-폐쇄 원칙은 다음과 같은 문장으로 요약할 수 있다. 소프트웨어 개체(클래스,모듈,함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다. 여기서 키워드는 '확장'과 '수정'이다. 이 둘은 순서대로 애플리케이션의 '동작'과 '코드'의 관점을 반영한다. * 확장에 대해 열려 있다. 애플리케이션의 요구사항이 변경될 때 이 변경에 맞게 새로운 '동작'을 추가해서 애플리케이션의 기능을 확장할 수 있다. * 수정에 대해 닫혀 있다. 기존의 '코드'를 수정하지 않고도 애플리케이션의 동작을 추가하거나 변경할 수 있다. 개방-폐쇄 원칙은 유연한 설계란 기존의 코드를 수정하지 않고도 애플리케이션의 동작을 확장할 수 있는 설계라고 이야기한다. 컴파일타임 의존성을 고정시키고.. 2023. 9. 4. 이전 1 2 3 4 5 6 ··· 9 다음 반응형 LIST