JAVA 객체 지향 디자인 패턴 - 1
포스트
취소

JAVA 객체 지향 디자인 패턴 - 1

UML 다이어 그램의 종류

연관 관계일 때 매개 변수 타입을 상대 클래스에 맞게 선언하고 내부에서 상대 클래스의 메소드를 작성하고 . 중간에 새로운 클래스를 정의해서 두 클래스 사이에서 상호 교류를 시킬 수도 있다.

-구조 다이어그램- 1.클래스 다이어그램 : 시스템을 구성하는 클래스들 사이의 관계를 표현한다. 2.객체 다이어그램 : 객체 정보를 보여준다. 3.복합체 구조 다이어그램 : 복합 구조의 클래스의 컴포넌트 내부 구조를 표현한다. 4.배치 다이어그램 : 소프트웨어, 하드웨어, 네트워크를 포함한 실행 시스템의 물리 구조를 표현한다. 5.컴포넌트 다이어그램 : 컴포넌트 구조 사이의 관계를 표현한다. 6.패키지 다이어그램 : 클래스나 유즈 케이스 등을 포함한 여러 모델 요소들을 그룹화해 패키지를 구성하고 패키지들 사이의 관계를 표현한다.

-행위 다이어그램- 7.활동 다이어그램 : 업무 처리 과정이나 연산이 수행되는 과정을 표현한다. 8.상태 머신 다이어그램 : 객체의 생명주기를 표현한다. 9.유즈 케이스 다이어그램 : 사용자 관점에서 시스템 행위를 표현한다. 10.행위 다이어그램 - 상호작용 다이어그램

  • 11.순차 다이어그램 : 시간 흐름에 따른 객체 사이의 상호작용을 표현한다.
  • 12.상호작용 개요 다이어그램 : 여러 상호작용 다이어그램 사이의 제어 흐름을 표현한다.
  • 13.통신 다이어그램 : 객체 사이의 관계를 중심으로 상호작용을 표현한다.
  • 14.타이밍 다이어그램 : 객체 상태 변화와 시간 제약을 명시적으로 표현한다.

어느 관점에서 보냐, 어떤 내용을 다루냐에 따라 도면이 다양하듯 소프트웨어 개발에서의 모델링도 많은 것이 존재한다.

  1. 클래스 다이어그램 클래스란 동일한 속성과 행위를 수행하는 객체의 집합 또는 객체를 생성하는 설계도 제목 학생 내용 특징부[이름,전공,학번,과목] 행위부[수강하다 등]의 테이블 식 표현 public: +, private: -, protected: #, package ~ : -이름 +수강하다 이런식으로 접근 제한도 가시화한다. 나아가 설계 단계 전까지 타입도 최대한 작성해준다. 연관 관계: 클래스들이 개념상 서로 연결되었음을 나타냄 화살표로 표시하며 한 클래스가 다른 클래스에서 제공하는 기능을 사용하는 상황일 때 일반화 관계: 상속 관계. 속이 빈 화살표를 사용해 표시.(머리 쪽이 부모 클래스) 집합 관계: 집약, 합성 관계가 존재함. 클래스들 사이의 전체 또는 부분 같은 관계를 나타냄. 의존 관계: 연관 관계와 같이 한 클래스가 다른 클래스에서 제공하는 기능을 사용할 때 차이점은 두 클래스의 관계가 한 메서드를 실행하는 동안 매우 짧은시간만 유지. 점선 화살표 실체화 관계: 인터페이스 구현. 속 빈 삼각형 머리가 점선. (추상 클래스는 이탤릭체로 표기됨)

일반화(상속)는 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종이다. 자식의 수가 많아질수록 일반 클래스 상속이 편리해보인다.

기능을 재사용할 때는 위임을 이용하라. 무작정 상속받아 기능을 이용한다면 쓸데없는 빚이 생긴다. 객체 간의 일반화가 필요할 때엔 서브 클래스에 슈퍼 클래스의 객체를 생성하여 메소드 내에 슈퍼 클래스의 메소드를 끌어다 사용한다. 이것도 캡슐화의 일종일까? 실행 클래스에서 서브 클래스의 객체를 이용한다면 객체 내의 인스턴스 필드에 선언된 슈퍼 클래스의 객체가 모든 행위를 담당하고 있다.

일반화 관계에서 제약 조건 자식 클래스 객체가 동시에 두 클래스에 속할 수 없다는 disjoint 부모-자식간의 서로의 클래스에 상대 객체가 단 하나만 존재해야된다는 complete 집합론적인 관점에서 일반화는 상호 배타적인 부분 집합으로 나누는 과정.

다중 분류가 필요한 상황일 때 UML에서 변별자를 사용한다 하나의 인스턴스는 여러 자식 클래스에 속하게 될 수 있다. 예를 들어 VIP와 일반 멤버가 멤버 클래스를 상속할때 지역민과 비지역민 클래스를 생성해 추가로 멤버 클래스를 상속한다면 완전하게 독립적이라면 상관없지만, 일반 멤버지만 지역 주민에게는 경품을 제공하도록 시스템에 새로운 요구사항을 추가하면 난처한 일이 생길 수 있다. 그래서 상호 배타적으로 존재할 수 있게 VIP의 지역, 비지역민 , 일반 멤버의 지역,비지역민을 따로 서브클래스로 만들어서 사용한다

정적 메서드에서 다형성은 메소드 재정의를 무시한다.

피터 코드의 상속 규칙

  • 자식 클래스와 부모 클래스 사이는 “역할 수행”관계가 아니어야 한다.
  • 한 클래스의 인스턴스는 다른 서브 클래스의 객체로 변환할 필요가 절대 없어야 한다.
  • 자식 클래스가 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행해야 한다.
  • 자식 클래스가 단지 일부 기능을 재사용할 목적으로 유틸리티 역할을 수행하는 클래스를 상속하지 않아야 한다.
  • 자식 클래스가 “역할, 트랜잭션, 디바이스”등을 특수화해야 한다.

기존 코드에 전혀 영향을 주지 않고, 독립적인 자식클래스를 추가할 수 있다면 개방-폐쇄의 원칙(OCP)을 따른다고 말할 수 있다. 한 클래스에 너무 많은 책임을 할당하진 말자. 혹여나 많아졌다면 책임을 분리해주자.

횡단 관심 문제를 해결하기 위한 관심지향 프로그래밍(AOP) AOP는 횡단 관심을 수행하는 코드를 Aspect라는 특별한 객체로 모듈화하고 위빙 작업을 통해 모듈화한 코드를 핵심 기능에 끼워넣을 수 있다. 이를 통해 기존의 코드를 전혀 변경하지 않고도 시스템 핵심 기능에서 필요한 부가 기능을 효과적으로 이용할 수 있다. 횡단 관심에 변경이 생긴다면 해당 Aspect만 수정하면 된다. joinpoint app 실행 중의 특정한 지점. (메서드 호출 등) 어떤 지점에서 AOP를 사용해 추가적인 로직을 삽입할지를 정의한다. advice 특정 joinpoint 에 실행하는 코드 pointcut 여러 조인포인트의 집합체, 어드바이스를 언제 실행할지를 정의할 때 사용 aspect advice와 pointcut을 조합한 조합물. app이 가져야 할 로직과 그것을 실행해야 하는 지점을 정의한 것 weabing app 코드의 해당 지점에 aspect를 실제로 주입하는 과정

컴팩트가 복잡한 복합기가 있다. 클래스에 다양한 기능이 작성되어있지만 클라이언트는 모든 것을 이용하지 않는다. ISP는 이러한 범용 인터페이스보단 클라이언트에 특화되도록 인터페이스를 분리시켜라는 원칙이다.

클래스가 분리될 때 조건문 내부에 있던 메서드는 리턴값을 boolean으로 지정해보자 변경될 가능성이 큰 내용의 경우 분리할 수 있다면 분리해주는 것이 좋다. 테스트를 위해서 인터페이스를 분리하여 사용

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.