분류 전체보기 (212) 썸네일형 리스트형 디자인 패턴 - 옵저버 패턴 옵저버 패턴은 객체의 상태가 바뀌면 객체를 구독하고 있는 다른 객체들한테 연락이 자동으로 갱신되는 패턴을 말한다. 일대 다 객체 의존 관계를 구성하는 패턴이다. 옵저버 패턴은 결합도를 낮추는게 중요하다. 결합도를 낮춰서 - 옵저버를 언제든지 추가 할 수 있게 만들고 - 새로운 옵저버를 추가할때도 주제(subject)를 변경 할 필요가 없고 - 주제와 옵저버가 서로 독립적으로 재사용될 수 있다. 코드로 살펴보자 옵저버 패턴이 없이 구독을 하면 알람을 보내는 시스템이 있다고 해보자 단순하게 구독을 하면 이메일과 sms 를 보내는 시스템이 있다고 치자. 만약에 여기에 추가로 카카오톡 을 보낸다고 한다면? 생성자가 바뀌게 되고 sendNotification 메소드도 변경이 발생한다. 벌써부터 OCP 법칙에 위반.. 디자인 패턴 - Strategy 패턴 행위를 캡슐화 해 자유롭게 변경 할 수 있게 만든 패턴 전략 을 쉽게 바꿀 수 있게 만들어 준다. 코드로 이해를 해보자 여기 추상 클래스 Bird가 있다. 새는 기본적으로 말하기 기능과 이동 기능이 있다고 하자 그리고 Bird 를 상속받는 Pigeon 과 Chicken 클래스가 있다고 하자. 이 코드에 문제점이 어떤게 있을까? 첫번째로 새로운 객체가 생겼을때 move 메소드 로직이 Chicken 로직과 동일하다고 한다면 중복된 코드가 발생 한다는 문제가 생기고 두번째로 기획이 변경돼서 Chicken 클래스의 move 기능이 변경된다면 기존 move 메소드의 로직을 변경해야 하는데 이건 확장엔 열고 수정엔 닫는 OCP 설계 규칙에 위반되게 된다. 그럼 이제 이 코드를 전략 패턴을 사용해 변경해보자 먼저 전.. 객체지향 설계 - 개방 폐쇄 원칙 엔티티는 확장을 위해 열려 있어야 하지만 수정을 위해 닫혀 있어야 한다. 기존 코드를 변경하지 않고도 새 기능을 추가 할 수있도록 코드를 작성 하라는 메시지다. 클래스 중 하나를 변경하면 모든 종속 클래스가 변경되야 하는 상황을 방지 할 수 있다. 인터페이스를 사용해 사용하는 코드를 변경하지 않고 쉽게 대체 할 수 있게 구현을 허용한다. 수정을 하지 않고도 계속적인 코드 확장이 가능해진다. 예제를 보면서 확인해보자 여기 일반적인 커피머신이 있다. brewCoffee 로 커피를 추출하는 메소드를 가지고 있다. 이 커피 앱에서 자동으로 커피머신에서 커피를 추출할 수 있게 구현을 했다. 근데 만약 여기서 일반적인 커피 머신이 아니라 새로운 기능들이 추가된 새로운 커피머신을 사용해야 한다면? 이제 여기서 개방 .. 객체지향 설계 - 단일 책임 원칙 클래스는 변경해야할 이유가 하나만 있어야 한다. 책임이란 해야 하는것 객체에 책임을 할당해 작업을 시키는데 단 하나의 책임만 가지는게 좋다. 단일 책임 원칙의 이점? 소프트웨어를 구현하기 쉽게 만들고, 향후 변경될때 부작용을 방지 할 수 있다. 요구사항은 시간이 지나면서 변경을 하게 되는데 이런 요구사항이 클래스의 책임을 변경할수있다. 이렇게 책임을 변경하게 되면 클래스를 다시 책임이 하나가 되도록 변경해줘야한다. 변경하지 않으면 더 복잡하고 부작용이 많아질수 있어 더 많은 작업이 필요하게 된다. 또한, 클래스의 책임이 하나라면 이해하기도 쉬워진다. 변경 사례 하나의 책임이 여러 클래스에 분산되어있는 경우 부가 기능을 별개의 클래스로 분리해 책임을 담당하게 한다. 공통 책임을 한 곳으로 모아준다. 이 공.. 객체지향 특징 - 다형성 다형성이란 어떤 것이 다른 형태로 발생하는 상황을 설명한다. 동일한 인터페이스로 서로 다른 유형의 객체에 접근 할 수 있는 개념을 설명한다. 다형성 종류 정적 또는 컴파일 다형성 동적 다형성 정적 다형성 Java 를 사용하면 동일한 이름을 사용하지만 매개 변수가 다른 메서드를 여러개 구현할수있다. 이걸 메서드 오버로딩이라 하고 정적 형태의 다형성을 나타낸다. 동적 다형성 동적 다형성은 컴파일러가 실행 된 메서드를 결정 짓게 하지 않는다. JVM 런타임에 결정이 된다. 하위 클래스는 상위 클래스의 메소드를 오버라이딩 할 수 있는데 동일한 이름과 매개변수를 공유하지만 다른 기능을 제공 할 수 있다. 이게 다형성의 한 형태라 볼 수 있다. late binding 하위 클래스가 상위클래스 타입으로 생성된 경우를.. 객체지향 특징 - 상속 객체지향 상속이란 속성 및 메서드 집합을 공유하는 클래스 계층 구조를 위해 클래스에서 파생할 수 있는 이론이다 상속 계층 선언 자바에서 클래스는 하나의 다른 클래스에서만 파생될수있다 이 클래스를 수퍼 클래스 또는 상위 클래스라고 한다. 이걸 상속 받은 클래스를 하위 클래스 또는 자식 클래스라고 한다. extends 사용해서 하위 클래스를 확장시킨다. 상속 접근자 상속 받은 하위 클래스는 상위 클래스의 public 또는 protected 접근자만 사용할 수 있다. 만약 서브 클래스와 수퍼 클래스가 같은 패키지 내부에 있다면 패키지 전용 접근자도 사용할 수 있다. super 키워드를 사용해 수퍼 클래스의 메서드를 호출하는데 사용할수있다. 메서드 재정의 상속은 슈퍼클래스의 모든 public, protected.. 객체지향 특징 - 캡슐화 캡슐화란 하나의 유닛(class)에 데이터와 메소드를 함꼐 번들링 해둔 걸 뜻한다. 이 개념은 내부 state를 밖에 숨기는 정보은닉 개념으로도 쓰인다. 객체 외부에서 볼 수 없는 state 를 두고 여기에 접근 할 수 있는 메소드를 제공한다 내부 상태에 대한 접근을 제어 할 수 있다. 접근 수정자 캡슐화를 가능하게 자바에서는 private no modifier protected public 을 제공한다. 표로 설명을 대신한다. 객체지향의 특징 - 추상화 추상화 추상화의 주 목적은 불필요한 디테일 정보들을 사용자로부터 숨기는 것이다. 사용자는 복잡한 로직을 이해할 필요 없이 사용할 수 있다. 예를들어보자 커피가 먹고 싶어서 커피머신에서 스위치를 눌러서 커피를 만들었다고 쳐보자 여기서 커피머신으로 커피를 만든것은 좋은 추상화 예이다. 커피머신의 사용법만 알면 되고 커피머신이 어떻게 커피를 추출하는지는 알필요가 없다. 이걸 자바에서 똑같이 구현해보자 OOP 추상화 커피머신은 어떤 커피를 선택하냐에 따라서 어떻게 커피 빈을 그라인드 할지 결정을 한다 커피 셀렉션은 enum 형태로 각 종류의 커피가 들어있고 우린 단순히 커피머신을 만들때 커피빈과 어떤 커피를 만들지 생성자에서 만들기만 하면된다. 그럼 brewCoffee 를 통해 우리가 선택한 커피가 return.. 이전 1 ··· 6 7 8 9 10 11 12 ··· 27 다음 목록 더보기