본문 바로가기

분류 전체보기274

[Design Pattern] Strategy Pattern [Design Pattern] Strategy Pattern Strategy Pattern이란? 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고 유사한 행위들을 캡슐화하는 인터페이스를 정의합니다. 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법을 말합니다. 즉 , 객체가 할 수 있는 행위들을 각각의 전략으로 정의, 수정이 필요한 경우 전략을 바꾸는 것만으로도 수정이 가능하도록 만드는 패턴입니다. 전략 패턴을 사용해야하는 이유 전략패턴을 적용하지 않은 예를 보도록 하겠습니다. 위와 같은 관계의 클래스 구조가 있습니다. Strategy Pattern with Java public interface Movable { p.. 2019. 10. 11.
[Design Pattern] Flyweight pattern [Design Pattern] Flyweight pattern Flyweight pattern이란? Flyweight pattern은 비용이 큰 자원을 공통으로 사용할 수 있도록 만드는 패턴입니다. 비용이 크다는 것은 두 가지로 나누어 생각할 수 있습니다. 1. 중복 생성될 가능성이 높은 경우 동일한 자원이 자주 사용될 가능성이 높은 경우입니다. 이런 자원은 공통 자원 형태로 관리하고 요청이 있을 때 제공해주는 것이 좋습니다. 2. 자원 생성 비용은 큰데 사용빈도가 낮은 경우 자주 생성하지 않는 데 사용빈도가 낮은 자원을 항상 생성하는 것은 낭비겠죠. 즉 , 생성된 객체를 생성한 후 저장하여 재활용하는 팩토리를 기반으로 합니다. 객체가 요청될 때마다 팩토리는 객체가 이미 생성되었는지 확인하기 위해 객체를.. 2019. 10. 10.
[Design Pattern] Composition Pattern [Design Pattern] Composition Pattern Composition Pattern이란? 컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 하는 패턴입니다. component 컴포지션의 모든 개체에 대한 기본 인터페이스입니다. 하위 컴포지트를 관리하는 공통 메서드가 있는 인터페이스 또는 추상 클래스 여야 합니다. 즉, Leaf 클래스와 전체에 해당하는 Composite클래스의 공통 인터페이스를 작성합니다, leaf 기본 구성 요소의 기본 동작을 구현합니다. 다른 객체에 대한 참조는 포함되어 있지 않습니다. 구체적인 부분 클래스 Composite 객체의 부품.. 2019. 10. 10.
[Design Pattern] Bridge Pattern [Design Pattern] Bridge Pattern Bridge Pattern이란? 추상화를 구현하여 두 개가 독립적으로 변할 수 있도록 브리지 디자인 패턴의 구현은 Composition 보다 Inheritance을 선호한다는 개념을 따릅니다. 브리지 패턴(Bridge pattern)이란 구현부에서 추상층을 분리하여 각자 독립적으로 변형할 수 있게 하는 패턴이다. Bridge Pattern의 구조 Abstraction 기능 계층의 최상위 클래스. 구현 부분에 해당하는 클래스를 인스턴스를 가지고 해당 인스턴스를 통해 구현 부분의 메서드를 호출합니다. RefindAbstraction 기능 계층에서 새로운 부분을 확장한 클래스 Implementor Abstraction의 기능을 구현하기 위한 인터페이스 .. 2019. 10. 10.
[Design Pattern] Proxy Pattern [Design Pattern] Proxy Pattern Proxy Pattern이란? Proxy는 우리말로 대리자, 대변자라는 뜻입니다. Proxy Pattern이란 프락시에게 어떤 일을 대신시키는 것입니다. 실제 기능을 수행하는 객체 Real Object 대신 가상의 객체 Proxy Object를 사용해 로직의 흐름을 제어하는 디자인 패턴입니다. 구체적으로 인터페이스를 사용하고 실행시킬 클래스에 대한 객체가 들어갈 자리에 `대리자`객체를 대신 투입하여 실제 실행시킬 클래스에 대한 객체를 통해 메서드를 호출하고 반환 값을 받는지. 대리자 객체를 통해 메소드를 호출하고 반환값을 받는지 전혀 모르게 처리하는 것입니다. 여기서 중요한 것은 , 흐름 제어만 할 뿐 결괏값을 조작하거나 변경시키면 안 된다는 점입니.. 2019. 10. 8.
[Design Pattern] Decorator Pattern [Design Pattern] Decorator Pattern Decorator Pattern Decorator란 뜻 그대로 장식 자라는 뜻을 가지고 있습니다. 즉 Decorator pattern은, 원본에 무언가를 더 입혀 새로운 것을 만드는 것입니다. 바로 예시를 보도록 하겠습니다. 케이크(Decorate Pattern with Java) public class Cake { public String getCake() { return "cake"; } } public class CreamDecorator extends Cake{ private Cake cake; public CreamDecorator(Cake cake) { this.cake = cake; } @Override public String .. 2019. 10. 8.
[Design Pattern] Facade Pattern [Design Pattern] Facade Pattern Facade Pattern이란? Facade는 '건물의 정면'을 의미합니다. Facade는 클래스 라이브러리 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 간략화된 인터페이스를 제공하는 객체입니다. 말이 어려운데 예를 보는 것이 더 빠를 것 같습니다. 영화 시청하기(Java Facade Pattern) 어떤 사람이 영화를 시청하기 위해 아래와 같은 과정을 거친다 합시다. 팝콘 준비-> TV 켜기 -> 영화 검색 -> 영화 결제 -> 영화 재생 Snack snack = new Snack("popcon); RemoteControl remote= new RemoteControl(); Movie movie = new Movie("joker"); s.. 2019. 10. 8.
[Design Pattern] Adapter Pattern [Design Pattern] Adapter Pattern Adapter Pattern이란? 어댑터 패턴은 이름대로 어댑터 같은 역할을 합니다. 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환하는 패턴입니다. 어댑터 패턴을 사용하면 다른 인터페이스와 호환성 문제를 해결할 수 있습니다. 실생활의 예로 해외여행을 갈 때 외국에서는 한국과 다른 전기 규격의 플러그를 사용하는 곳이 있습니다. 그럴 때 보통 돼지코라 불리는 플러그 변환 어댑터를 사용하곤 합니다. 위와 같은 돼지코가 특정 규격을 다른 규격으로 호환 가능하도록 바꿔주듯이 어댑터 패턴도 같은 역할을 한다고 보면 됩니다. Client 써드파티 라이브러리나 외부 시스템을 사용합니다. Adaptee 써드파티 라이브러리나 외부시.. 2019. 10. 7.
Kotlin Property , Custom Getter & Setter Kotlin Property , Custom Getter & Setter 코틀린 프로퍼티에대하여 알아보기전에 먼저 프로퍼티와 필드에 대하여 알아보도록 하겠습니다. Java의 프로퍼티와 필드 객체지향에서 객체는 고유한 속성(==특징)을 가지는 데, 그 속성을 칭하는 단어를 property 라고 합니다. 그리고 이 속성의 실체가 담기는 곳이 필드(멤버 변수)입니다. public class Dog { private String name; private int old; public Dog(String name, int old) { this.name = name; this.old = old; } public String getName() { return name; } public void setName(Strin.. 2019. 10. 7.
TDD알아보기 TDD알아보기 TDD의 란? (Test Driven Development) 테스트 주도 개발: 테스트가 개발을 이끌어 나가는 개발방법론 구체적인 행동 레벨에서의 TDD의 개념은? 테스트를 먼저 만들고 테스트를 통과하기 위한 것을 짜는 것 즉, 만드는 과정에서 우선 테스트를 작성하고 그걸 통과하는 코드를 만들고를 반복하면서 제대로 동작하는지에 대한 피드백을 적극적으로 받는 것입니다. TDD가 어려운이유는뭘까 ?? 개발 시간이 증가합니다. 많은 기업들이 단기적인 성과에 집중해 있습니다. 전체 개발 시간을 줄이는 것보다 오늘 일을 끝내는 것을 강조하기 때문에 TDD 도입이 어렵습니다. 단기적인 것에 집중되어 있으니.. 그때까서 또 고치면 되니까.. 고객이 화내면 안되니까.. 급한 불을 끄면서 허덕이면서 살기 .. 2019. 10. 4.
assertThat assertThat알아보기 JUnit을 활용한 테스트에서는 assertThat 구문을 활용하여 코드의 길이를 줄이면서도 읽혀지는 코드를 작성할 수 있도록 도와줍니다. 즉 assertThat을 잘 사용하면 개발자의 의도를 보다 명확하게 드러낼 수 있는 큰 장점을 얻어갈 수 있을 것입니다. assertThat사용법 assertThat은 assertThat(T actual, Matcher 2019. 10. 4.
View가 그려지는 과정 알아보기 View가 그려지는 과정 알아보기 view는 포커스를 얻으면 레이아웃을 그리도록 요청합니다. 이때 레이아웃의 계층 구조중에 rootView를 제공해야합니다. 따라서 그리기는 루트 노드에서 시작되어 전위 순회방식으로 그려집니다. 부모뷰는 자식뷰가 그려지기전에 그려지고, 형제뷰는 전위방식에 따라 순서대로 그려지게 됩니다. 레이아웃을 그리는 과정은 measure단계와 layout 단계를 통해 그려지게 됩니다. LifeCycle 알아보기 addView 함수를 호출했을때 위 그림과 같은 순서로 콜백함수가 실행되게 됩니다. 1. Constructor 모든 뷰는 생성자에서 출발하게됩니다. 생성자에서 초기화하고 ,default값을 설정합니다. 뷰는 초기설정을 쉽게 세팅하기 위해서 AttributeSet 이라는 인터페이.. 2019. 10. 2.
equals,hashCode 알아보기 equals,hashCode 알아보기 equals메소드와 hashcode메소드는 Object 클래스의 메소드입니다. Object는 상속 관계상 가장 위에 있기 때문에 (모든 클래스가 Object를 상속) 어떤 객체라도 Object의 메소드인 equals와 hashcode를 사용할 수 있게 됩니다. ex) equals ,hashcode 출력해보기 Object object1 = new Object(); Object object2 = new Object(); Object object3 = new Object(); Object object4 = new Object(); println("object1.equals(object2) result is " + object1.equals(object2)); println.. 2019. 10. 1.
[Design Pattern] Prototype pattern [Design Pattern] Prototype pattern Prototype패턴이란 ? 보통은 new키워드를 사용하여 인스턴스를 생성합니다. 하지만 인스턴스를 다시 생성해야 하는것이 아니라 기존 생성되어있는 인스턴스를 복사 하여 새로운것을 만들어야하는경우가 있습니다. 아래와 같습니다. 종류가 너무 많이 클래스로 정리되지 않는 경우 취급하는 오브젝트의 종류가 너무 많아, 각각을 별도의 클래스로 만들어 다수의 소스 파일을 작성해야 함 클래스로부터 인스턴스 생성이 어려운 경우 생성하고 싶은 인스턴스가 복잡한 작업을 거쳐 만들어지기 때문에, 클래스로부터 만들기가 매우 어려운 경우 framework와 생성할 인스턴스를 분리하고 싶은 경우 프레임워크를 특정 클래스에 의존하지 않고 만들고 싶은 경우. 클래스 이름.. 2019. 9. 27.
factory method pattern vs abstract factory pattern 차이 알아보기 factory method pattern vs abstract factory pattern 차이 알아보기 두 패턴은 공통점이 많지만 확연히 다른 차이점이 존재합니다. 펙토리 메서드 패턴과 추상 메서드 패턴의 차이에 대하여 알아보도록 하겠습니다. 팩토리 메서드 패턴과 추상 팩토리 패턴의 공통점 Template Method Pattern을 사용 Factory 클래스를 사용하여 생성 Factory Method Pattern을 사용 둘 다 추상 클래스와 Factory를 통해 실제 구현 대상인 Concrete(구상 클래스, 구체 클래스)와 Client 간 결합도를 낮춥니다 인자에 따라 생성되는 객체가 결정됩니다. 추상 팩토리 패턴은 Factory Method Pattern을 사용합니다. 그리고 팩토리 메서드 패턴.. 2019. 9. 18.
[Design Pattern] template method pattern [Design Pattern] template method pattern template method pattern 이란?? 템플릿 메서드 패턴은 추상 클래스와 구현 클래스로 작성할 수 있으며 메인이 되는 로직 부분은 추상 클래스의 일반 메서드로 선언해서 사용됩니다. 즉 구현 별로 달라질 수 있는 행동(메서드)들은 구현 클래스에서 선언 후 호출하는 방식으로 사용합니다. 아래와 같은 장단점이 있습니다. 장점 코드 중복 감소 자식 클래스의 역할을 감소시키면서 핵심 로직 관리 용이 객체 추가 및 확장 쉽게 가능 단점 추상 메서드가 너무 많아지면 클래스 관리 복잡 추상 클래스와 구현 클래스 간 복잡성 증대 예 알아보기 1. Template public abstract class HouseTemplate { pu.. 2019. 9. 18.
[Design Pattern] Factory Method Pattern [Design Pattern] Factory Method Pattern Factory Method Pattern이란? 팩토리 메서드 패턴(Factory Method Pattern)의 Factory method pattern은 부모(상위) 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴이며. 자식(하위) 클래스가 어떤 객체를 생성할지를 결정하도록 하는 패턴이기도 하다. 팩토리 메서드 패턴은 아래와 같은 특징, 장단점이 존재합니다. 특징 Templeate Method Pattern을 사용 Factory 클래스를 이용하여 객체 생성 추상적인 클래스( interface, abstract )를 통해 실제 구현 대상인 Concrete(구상 클래스, 구체 클래스)와 Client 간의 결합도를 낮춥니다. 단 하나의.. 2019. 9. 18.
[Design Pattern] abstract factory pattern [Design Pattern] abstract factory pattern abstract factory pattern(추상팩토리패턴) 추상팩토리 패턴은 많은 수의 연관된 서브 클래스를 특정 그룹으로 묶어 한번에 교체할 수 있도록 만든 디자인패턴입니다. 추상화(Abstact) + 팩토리(Factory)를 합친 단어입니다. 추상화란 구체화의 반대말로 생각하면 편할것입니다. 실제 코드 부분이 작성되지 않고 어떻게 사용할지 명세(인터페이스라고 한다)만 정의하는 것입니다. 추상팩토리 패턴은 다양한 구성 요소 별로 "객체의 집합"을 생성해야 할 때 유용한 패턴입니다. 다시 말해서, 서로의 다른 객체들을 하나의 팩토리에서 생성과 관리를 한다고 보면됩니다. 하나의 인터페이스에서 객체의 생성을 처리하고, 다양한 성격의.. 2019. 9. 17.
Lombok 알아보기 Lombok 알아보기 Lombok이란?? - Java의 전형적인 Boilerplate code들을 없애주는 Annotation기반 라이브러리입니다. - @Getter와 @Setter, @ToString 만으로도 강력합니다. Lombok프로젝트에 추가하기 1. build.gradle(app)의 dependencies에 아래와 같이 추가 compileOnly 'org.projectlombok:lombok:1.18.10' annotationProcessor "org.projectlombok:lombok:1.18.10" //require for anotation compileOnly 'org.glassfish:javax.annotation:10.0-b28' // package javax.annotation do.. 2019. 9. 15.
boilerplate boilerplate code란? github에 오픈소스를 검색하다보면 boilerplate라는 용어를 많이 접할 수 있습니다. boilerplate란 표준 문안이라는 뜻의 단어로 프로그래밍에서의 boilerplate code는 위키피디아의 설명을 보면 - 최소한의 변경으로 재사용할 수 있는 것 - 적은 수정만으로 여러 곳에 활용 가능한 코드, 문구 - 각종 문서에서 반복적으로 인용되는 문서의 한 부분 라고 설명되어있습니다. javaScript나 html에서의 보일러플레이트라고 하면 보통 크로스 브라우징과 호환성을 위한 Modernizr, polyfill, Normalize 등이 적용되어 있는 템플릿 같은 형태로 많이 사용됩니다.(어떻게보면 seed project와 비슷하다.) 반복되지만 자주쓰이는 형태.. 2019. 9. 15.
[Design Pattern] Builder Pattern [Design Pattern] Builder Pattern Builder Pattern에 대하여 알아보도록 하겠습니다. 빌더 패턴이란?? 인스턴스를 생성할 때, 생성자(Constructor)만을 통해서 생성하는 데는 어려움이 있습니다. 빌더 패턴은 이 문제를 기반으로 고안된 패턴 중 하나입니다. 예를 들면, 생성자 인자로 너무 많은 인자가 넘겨지는 경우 어떠한 인자가 어떠한 값을 나타내는지 확인하기 힘듭니다. 또 어떠한 인스턴스의 경우에는 특정 인자만으로 생성해야 하는 경우가 발생합니다. 이럴 경우, 특정 인자에 해당하는 값을 null로 전달해줘야 하는데, 이는 코드의 가독성 측면에서 매우 좋지 않다는 것을 직감적으로 알 수 있습니다. 코드를 통해 봐 보겠습니다. id, pw, name, address,.. 2019. 9. 15.
[Design Pattern] Singleton Pattern [Design Pattern] Singleton Pattern singleton pattern에 대하여 알아보도록 하겠습니다. 싱글톤이란?? 싱글톤은 단 하나의 인스턴스만 생성하도록 제약을 둔 디자인 패턴입니다. 싱글톤 (Singleton) 은 애플리케이션의 시작부터 종료될 때까지 한 번의 생성(new)으로 고정된 메모리 영역을 가지기 때문에 메모리를 효율적으로 사용할 수 있습니다. 또한 싱글톤의 인스턴스는 전역적으로 사용되기 때문에 다른 클래스의 인스턴스들이 데이터를 공유 변경이 가능하다는 장점이 있습니다. JAVA에서 구현하기 1. Eager Initialization (이른 초기화) 싱글톤 객체를 instance라는 변수로 미리 생성해 놓고 사용하는 방식입니다. 장점 : static으로 생성된 변수.. 2019. 9. 10.
디자인패턴(DesignPattern)에 대하여 디자인패턴(DesignPattern)에 대하여 디자인 패턴이란? 클래스 구조를 갖는 프로그래밍을 하다보면 클래스간에 구조가 짜여지고 다양한 방법으로 객체가 생성되며 관계에 따라 여러가지 형태의 행동들이 나타납니다. 그런데 기초 설계가 제대로 되어있지 않은 상태로 프로그래밍이 시작된다면 얼마 못가 클래스 관계가 꼬일대로 꼬여 누더기 진흙탕 코드덩어리로 변하게될것입니다. 엄청나게 뛰어난 사람이어서 초기 요구에 맞춰 잘 짜여진 클래스관계를 만든다 해도 요구 사항이 바뀌게되면 쉽게 대응하지 못합니다. 위 같은 상황은 OOP(Object Oriented Programming)의 특성을 잃어버리는 것입니다. 많은 사람들이 OOP에 대하여 고민했고 프로그램의 목적이 어떻든간에 프로그램안에 클래스들이 갖는 구조에는 일.. 2019. 9. 10.
OOM Killer ,LMK OOM Killer ,Low Memory Killer OOM Killer와 LOM Killer에 대하여 알아보고 , 어떤것이 더 안드로이드 환경에 적합한지도 알아보도록 하겠습니다. OOM Killer - linux kernel의 메모리 부족시 메모리 확보를 하는 process - src 위치 : mm/oom_kill.c 시스템 구동중 메모리가 부족하면 운영체제 내부의 우선순위 알고리즘에 의해 프로세스를 죽입니다. 리눅스 커널은 프로세스의 메모리 할당시 남은 메모리가 없는 상황을 처리하기 위해 OOM(Out of Memory) Killer 를 가지고 있습니다. 그 것은 모든 프로세스를 어떤 제약으로 점수를 매겨 init을 제외한 최고 점수의 프로세스는 죽여 메모리를 확보한다. 따라서 일반적으로 서버를 운영.. 2019. 9. 10.