OOP (13) 썸네일형 리스트형 composite 패턴 1. composite 패턴이란? 한마디로 정의하면 포함하는 것과 포함되는 것들을 같은 방식으로 다루고 싶을 때 사용한다. 이를 가장 잘 나타낼 예시가 파일 시스템이다. 우리는 폴더 내에 또 다른 폴더 및 파일을 넣을 수 있다. 폴더나 파일은 크기 구하기, 삭제 등 같은 방식으로 다뤄야하는 것들이 있다. 이처럼 포함하는 것(폴더)와 포함되는 것(파일)을 같은 방식(크기 구하기, 삭제 등)으로 다루고 싶을 때 composite 패턴을 사용한다. 2. 예시 코드 2-1) 파일 및 폴더 만들기 interface FileSystem{ fun getSize():Int fun remove() } class File(private val name : String, private val size : Int) : Fil.. Mediator 패턴 1. Mediator 패턴의 필요성 예를 들어 네비게이션 버튼에 따라 목록/사진첩을 보여줘야 한다고 가정하자. 이 경우에 목록을 클릭 했을 때는 사진첩을 가리고 목록에 보여줄 데이터를 받아와서 보여준다 사진첩의 경우엔 목록을 가리고 사진을 서버에서 가져와 보여주게 된다.. 코드로 보게 되면 아래와 같다. class ModeSwitch { var mode : Mode = Mode.LIST var listView = ListView() val galleryView = GalleryView() val dataDownloader = DataDownloader() fun toggleMode(){ mode = if(mode==Mode.LIST){ Mode.GALLERY }else{ Mode.LIST } listVi.. DI (Dependency Injection/의존성 주입) 1. 의존성이란? class CarFactory{ fun makeCar(){} } class OrderManager(_carFactory : CarFactory){ val carFactory = _carFactory fun orderCar(){ carFactory.makeCar() } } val orderManager = OrderManager(CarFactory()) orderManager.orderCar() 위의 예제를 참고해보자. Dealer 클래스 내부에서는 OrderManager 클래스의 객체를 생성하여 사용한다. 이 경우 Dealer 클래스는 OrderManager 클래스가 없으면 내부 코드를 실행할 수 없음을 뜻하고 컴파일이 안된다는 것을 의미한다. 이는 곧 Dealer - OrderMana.. abstract-factory method 패턴 1. 필요성 추상 팩토리 패턴은 팩토리 패턴에서 팩토리를 추상화한 패턴이다. Factory 패턴 1. 필요성 이처럼 Component를 상속받은 자식들이 많은 곳에서 생성된다고 가정하자. 객체 생성이 많이 이루어지지 않는다면 큰 문제가 없지만 많이 이뤄지는 상황에서 자식 클래스의 생성자가 변 leehochang.tistory.com 예를 들어 라이트 모드와 다크 모드에서 생성되는 컴포넌트들이 다를 수 있다. 라이트 모드에선 라이트 버튼, 스위치, 드롭다운/ 다크 모드에선 다크 버튼, 스위치, 드롭다운 등을 생성해야 한다고 가정하자. 이러한 경우에 추상 팩토리 패턴을 적용할 수 있다. 이를 구조로 그려보면 이처럼 추상 클래스나 인터페이스를 만들어서 팩토리를 추상화하는 방식이다. 2. 추상 클래스 및 팩토리.. Factory 패턴 1. 필요성 자식 클래스가 많은 곳에서 생성되거나 자식 클래스들에 대해 드러내지 않고 숨기고 싶을 경우 팩토리 패턴을 사용한다. 대표적으론 라이브러리나 프레임워크에서 팩토리에 상수값을 넘겨줘 객체를 리턴받는 등의 예를 들 수 있다. 즉, 라이브러리나 프레임워크를 사용할 때 개발자들이 해당 객체에 대해 깊이 알 필요가 없이 간편하게 생성해 사용할 수 있도록하는 장점이 있다. 2. 컴포넌트 class 생성 abstract class Component { init { Log.e("component","name : ${getName()}") } protected abstract fun getName() : String } class Button : Component(){ override fun getName().. Decorator 패턴 1. 필요성 객체에 기능들을 필요에 따라 장착할 수 있도록 할 때 사용한다. 예를 들어 종스크롤 슈팅 게임을 보면 전투기가 아이템을 먹거나 레벨업을 할 때마다 공격시에 무기들이 추가되는 경우에 사용할 수 있다. 2. 전투기들 만들기 interface Fighter { fun attack() } class XWingFighter : Fighter { override fun attack() { Log.e("XWingFighter", "탄환 발사") } } 3. 각 decorator를 만들기 위해 decorator 추상 클래스 생성 abstract class FighterDecorator(_fighter : Fighter) : Fighter { private var fighter : Fighter = _fig.. Template 패턴 1. 필요성 부모 클래스에서 수행에 필요한 단계들을 미리 정의해두고 이를 자식 클래스에서 구현한 뒤 부모 클래스에서 실행하는 방식이다. 하나의 작업 수행에 필요한 단계가 동일한 객체를 여럿 만들어야 할 경우 사용하기 좋은 패턴이다. 2. abstract class public abstract class MapView { protected abstract void connectMapServer(); protected abstract void showMapOnScreen(); protected abstract void moveToCurrentLocation(); public void initMap(){ connectMapServer(); showMapOnScreen(); moveToCurrentLocatio.. Facade 패턴 1. 필요성 하나의 작업 단위를 처리하기 위해 여러 객체를 생성해서 처리해야한다고 가정하자. 이러한 상황에서 해당 코드를 프로젝트 내 반복적으로 사용한다면 facade 패턴을 사용하기에 적절하다. 서로 연관은 없지만 묶어줌으로써 추후에 수정시에 용이한 이점을 가져갈 수 있다. facade는 프랑스어로 외벽을 뜻한다. 반복적으로 사용될 것들을 울타리, 외벽을 쳐서 하나의 묶음으로 만든다고 생각하면 쉬울 것 같다. 2. 여러 객체 class StringConverter{ fun convertToUrl(str : String): String { val url ="http://$str" Log.e("convertToUrl",url) return url } } class InternetConnection{ fun.. Proxy 패턴 1. 필요성 proxy는 대리인이라는 뜻이다. proxy가 사용될 때는 서버에서 영상을 가져오거나, 메모리를 많이 차지 하는 등 무거운 작업시 적절히 사용될 수 있다. 가벼운 처리는 proxy에게 맡기고 무거운 처리는 객체를 생성해 처리하는 방식이다. 유튜브를 예로 들어보자) 이처럼 마우스 호버시에 썸네일이 재생되고 아닐 경우에는 제목만 보여주는 기능을 구현하다고 생각해보자. 이때 프록시는 제목만 보여주는 가벼운 처리를하고 실제로 마우스가 호버되었을 때 썸네일 영상을 받아와 처리하도록 해준다. 그러면 불필요한 객체 생성을 방지할 수 있다. 2. thumnail interface / class interface Thumbnail { fun showTitle() fun showPreview() } class.. Adapter 패턴 1. 필요성 어댑터는 형식이 다른 둘 사이에 연결되어 호환될 수 있도록 도와주는 도구를 말한다. 객체 지향 프로그래밍에서 어댑터란, 서로 다른 인터페이스를 가진 객체들을 같은 형식으로 동작할 수 있도록 하는 것을 말한다. Strategy 패턴 예제를 예로 들어보면 서비스가 다른 서비스와 연동되며 동영상 모드도 추가할 수 있게 되었다. 그러나 각 서비스가 서로 다른 인터페이스를 통해서 구현했기 때문에 이를 해결하기 위해 기존의 검색 인터페이스를 다 바꾸는 것은 비용이 너무 많이 발생한다. 이러한 경우 Adapter를 사용해 서로 호환을 시켜줄 수 있다. 2. Adapter interface SearchStrategy { fun search() } class SearchAll : SearchStrategy{.. 이전 1 2 다음