본문 바로가기

스터디스터디/정처기

[실기] 소프트웨어 구축- 객체지향 설계

최초 작성일: 2024-09-01

최종 작성일: 2024-09-01

목표 : 정처기 합격 및 CS 지식 쌓기

 

객체지향 구현

1.    객체 지향(OOP, Object Oriented Programming)

(1)   개념

현실세계의 유형, 무형의 모든 대상을 객체로 나누고 객체의 행동(Method)과 고유한 값(Attribute)을 정의하여 설계하는 방법

객체를 만들고 조작하며 객체끼리 관계를 맺음으로 다수의 객체가 함께 수행될 수 있게 한다

*쇼핑몰 안에 들어가는 모든 것을 객체로 만들어 (user-id,pw,이름 -> 이런것을 변경할 수 있는 get,set메서드 등을 묶에서 객체로 만들어는 것/ 그렇게 만든 객체를 호출하는 경우 메시지를 활용함)

(2)   객체지향 구성요소

구성요소 설명
클래스
(
구조,class,붕어빵 틀)
-유사한 종류의 유형/무형의 존재를 속성과 연산을 정의하여 만든 틀
-다른 클래스와 독립적으로 디자인한다
-데이터를 추상화(공통의 성질을 묶어)하는 단위
객체(object,인스턴스, 붕어빵) -클래스의 인스턴스(메모리상 올리가면)
-객체는 자신 고유의 속성을 가지며, 클래스에서 정의한 연산을 수행(
-객체의 연산은 클래스에 정의된 연산에 대한 정의를 공유함으로써 메모리를 경제적으로 사용
속성(attribute) -> 고유한 값 -객체들이 가지고 있는 고유한 데이터를 단위별로 정의한 것
-성질, 분류, 수량, 현재 상태 등에 대해서 표현한 값
메서드 -> 연산 -어떤 특정한 작업을 수행하기 위한 명령문의 집합
-객체가 가지고 있는 속성들을 변경할 수 있는 하나의 연산
메시지 -객체에게 어떤 행위를 하도록 지시
-객체의 메서드를 호출함으로써 객체간의 상호작용을 할 수 있도록 한다

 

(3)   객체 지향 언어의 특징

특징 설명
캡슐화 싸는 것, 안에 싼 것은 외부에 공개 하지 않음 다만 행동, 매서드만 공개함 -> 사용 기록 확인 가능. 메서드를 통해서 속성을 참조하게 함
(Encapsulation)
-속성(attribute)과 속성을 조작하는 메서드를 하나로 묶은 것
-캡슐화된 객체의 세부내용은 외부에 은폐(정보 은닉)되어, 오류의 파급 효과가 적다
-캡슐화된 객체들은 재사용이 용이
-객체들 간의 메시지를 주고받을 때 해당 객체의 세부내용을 알 필요가 없으므로 인터페이스가 단순해지고 결합도가 낮아진다.
정보은닉
(information hiding)

 
 
*못보게 한다 -> 정보은닉
못보게 하면서 이것들을 사용할 수 있는 메서드를 묶었어 ->캡슐화
-캡슐화의 가장 중요한 개념
-다른 객체들이 객체의 내부 데이터에 직접 접근할 수 없도록 제한하며, 오직 공개된 메서드를 통해서만 내부 상태에 접근할 수 있게 한다
상속
(inheritance)
-상위 클래스(부모 클래스)의 모든 속성과 메서드를 하위 클래스가 물려 받는 것
-상속을 이용하면 하위클래스는 상위 클래스의 속성과 메서드를 자신의 클래스에 다시 정의하지 않아도 된다
-하위 클래스는 상위 클래스에서 상속받은 요소 외에 새로운 속성과 메서드를 추가하여 사용할 수 있다.
-상위 클래스의 요소들을 사용할 수 있기 때문에, 소프트웨어 재사용을 증대시키는 중요한 개념
다형성
(
메시지 오버 로딩- 똑 같은 이름의 메서드가 있는 것, 오버 라이딩-상속시 부모클래스에 받은 메서드를 재 정의하는 것)
-하나의 메시지에 대해 각 객체가 가지고 있는 여러 가지 방법으로 응답할 수 있는 개념
-객체에서 동일한 메서드명을 인자 값의 유형이나 개수만 틀리게 하는 오버 로딩이 존재
-객체에서 상속받은 메서드를 재정의하는 오버 라이딩이 존재
추상화
(
공통의 성질을 묶어둔 것, abstraction)

 
*기업회원, 개인 회원
공통의 성질을 묶어두고
차이 나는 값을 확장해서 쓰는 것
 
-실체의 핵심적인 개념만을 추출하여 간결한 형태로 표현하는 것
-하위 클래스 들에 존재하는 공통적인 매서드를 상위 클래스 혹은 인터페이스로 정의하여 하위
클래스가 해당 매서드를 재정의할 수 있도록 하는 것

 

(4)   객체 지향 설계 원칙(SOLID)

설계원칙 설명
단일 책임 원칙
(SRP, Single Responsibility Principle)
-한 클래스는 하나의 책임만을 가져야 한다
개발 폐쇄 원칙
(OCP, Open-Closed Principle)
-소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만, 수정에 대해서는 닫혀 있어야 한다.
-기존의 코드를 변경하지 않으면서(Closed), 기능을 추가할 수 있도록 (open_설계
리스코프 치환 원칙
(LSP, Liskov Substitution Principle)
-자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있어야 한다
-부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 작동해야한다
인터페이스 분리 원칙
(ISP, interface segregation Principle)
-자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다
-자신이 사용하지 않는 인터페이스 때문에 영향을 받아서는 안된다
의존성 역전 원칙
(DIP, Dependency Inversion Principle)
-의존 관계를 맺을 때 자주 변화하는 것보다 변화가 거의 없는 것에 의존해야한다
-구체적인 클래스보다 인터페이스나 추상 클래스와 의존 관계를 맺어야 한다

 

2.    디자인 패턴

(1)   디자인 패턴 개념

-      객체 지향 프로그래밍 설계를 할 때 자주 발생하는 문제들에 대해 재 사용할 수 있도록 패턴 들의 모음

-      이미 만들어져서 잘 되는 것을 활용하여 재사용함으로써 프로그램 최적화에 도움을 준다

-      효율적인 코드를 만들기 위한 방법론

(2)   디자인 패턴 구조

구조 설명
패턴의 이름과 유형 각 패턴은 고유의 이름을 가지고 있어 개발자들 사이의 의사소통을 돕고, 특정 디자인 패턴을 쉽게 식별할 수 있게 해준다
패턴의 유형(생성, 구조, 행동 등)은 패턴의 목적과 사용방식을 분류하는 데 도움이 된다
문제 및 배경 패턴이 어떤 상황에서 사용되어야 하는지, 어떤 문제를 해결하려고 하는지에 대한 설명을 포함한다
솔루션 패턴의 구조와 그것이 어떻게 작동하는지를 설명한다
클래스, 객체 그리고 그들 사이의 관계와 상호작용을 포함한 패턴의 요소를 정의한다
사례 실제 문제나 기술적 상황에서 패턴이 어떻게 적용될 수 있는지에 대한 예를 제공한다
결과 패턴을 사용함으로써 얻을 수 있는 장단점, 그리고 패턴이 시스템에 미치는 영향에 대해 설명한다
샘플 코드 구체적인 코드 예제는 패턴을 실제로 어떻게 구현하는지 보여준다

(3)   GoF 디자인 패턴 gof외 다른 디자인 패턴도 있지만 객체 지향에서 대표적으로 사용하는 디자인 패턴이다 라고 보면 됨)

개발영역에서 디자인 패턴을 구체화하고 체계화 시킴

23가지의 디자인 패턴을 정리

각각의 디자인 패턴을 생성, 구초, 행위 3가지로 분류

GoF 디자인 패턴 분류

생성패턴 객체 생성과 관련된 패턴
객체 생성에 있어서 프로그램 구조에 영향을 크게 주지 않는 유연성 제공
구조 패턴 클래스나 객체를 조합해서 더 큰 구조를 만드는 패턴
행위 패턴 객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴 (동작 할 때 활용)

 

생성패턴 구조패턴 행위패턴
-abstract factory
-builder
-factory method
-prototype
-singleton
-adaptor
-bridge
-composite
-decorator
-façade
-flywieght
-proxy
-chain of responsibility
-command
-interpreter
-iterator
-mediator
-memento
-observer
-state
-strategy
-template method
-visitor

(4)   디자인 패턴 종류

1)    생성패턴

객체 생성에 관련된 패턴

객체의 인스턴스 생성을 추상화하는 방법

객체의 생성과정과 클래스의 인스턴스화를 캡슐화하여 특정 상황에서 어떤 객체를 생성할지 결정할 수 있게 도와준다

종류 설명
추상 팩토리
(abstract Factory)
구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴
빌더 복합 객체의 생성과 표현을 분리하여 동일한 생성 절차에서도 다른 표현 결과를 만들어낼 수 있음
팩토리 매서드 객체 생성을 서브클래스로 위임하여 캡슐화 함
Virtual- Constructor 패턴이라고도 함
프로토 타입 원본 객체를 복사함으로써 객체를 생성함
Java clone()을 이용하여 생성하고자 하는 객체에 clone에 대한 override를 해준다
싱글톤 어떤 클래스의 인스턴스를 (오직)하나임을 보장하고 어디서든 참조할 수 있도록 함

2) 구조 패턴

클래스나 객체를 조합해서 더 큰 구조를 만드는 패턴

상속을 통해 클래스나 인터페이스를 합성하는 방법을 정의

종류 설명
어댑터 클래스의 인터페이스를 다른 인터페이스로 변환하여 다른 클래스가 이용할 수 있도록 함
브리지 구현부에서 추상층을 분리하여 각자 독립적으로 확장할 수 있게 함
Composite 객체들의 관계를 트리 구조로 구성하여 복합객체와 단일 객체를 구분 없이 다룸
하나 이상의 유사한 객체를 묶어서 설계된 객체로 모두 유사한 기능을 나타낸다
Decorator 주어진 상황 및 용도에 따라 어떤 객체에 다른 객체를 덧붙이는 방식
Facade 서브 시스템에 있는 인터페이스 집합에 대해 하나의 통합된 인터페이스를 제공(wrapper)
서브시스템의 가장 앞쪽에 위치하면서 서브시스템에 있는 객체들을 사용할 수 있도록 인터페이스 역할
플라이웨이트
(flyweight)
크기가 작은 여러 개의 객체를 매번 생성하지 않고 가능한 한 공유할 수 있도록 하여 메모리를 절약함
프록시(proxy) 접근이 어려운 객체로의 접근을 제어하기 위해 객체의 대리(surrogate)나 대체글(placeholder)을 제공

3)행위패턴

객체나 클래스들이 상호작용하는 방법 및 책임을 정의하는 패턴

객체 사이의 효율적인 커뮤니케이션과 책임 할당을 돕는다(서로 연계하는)

종류 설명
책임 연쇄 한 객체가 처리할 수 없는 요청을 다음 객체로 전달하는 방식
객체들은 연쇄적으로 연결되어 있으며, 각 객체는 요청을 처리하거나 다음 객체로 전달 할 수 있다
커맨드 실행될 기능을 캡슐화함으로써 주어진 조건을 만족하는 기능을 잘 할 수 있는 유연성을 제공한다
요청자체를 객체로 감싸서 전달함으로써 로그, 큐 관리, undo-redo 등의 기능을 구현할 수 있다
Interpreter 주어진 언어에 대해, 그 언어의 문법에 대한 표현을 정의하고 해당 언어를 해석하는 해석자를 위한 패턴
복잡한 문법을 가진 언어의 해석에 사용
Iterator
(반복자)
컬렉션 객체의 내부 구조를 노출시키지 않고도 그 원소들에 접근할 수 있는 방법을 제공
이를 통해 단일 원칙의 적용을 유지하면서도 컬렉션에 대한 반복작업을 수행할 수 있다
중재자
(mediator)
객체들 간의 복잡한 상호작용을 캡슐화하고, 객체들이 서로 직접 참조하지 않도록 중재자 객체를 통해 통신하도록 만든다
이를 통해 시스템을 더 잘 조직화하고 결합도를 낮출 수 있다
메멘토 객체의 상태정보를 저장하고 필요에 따라 이전 상태로 복원할 수 있는 기능을 제공
옵서버 객체의 상태 변화를 관찰하는 관찰자들의 목록을 객체에 등록하여, 상태 변화가 있을 때마다 메서드를 통해 객체가 직접 목록의 각 관찰자에게 통지하도록 한다
이를 통해 상태의 일관성을 유지할 수 있다
상태
(state)
객체의 내부 상태에 따라 동일한 작업이 상태에 따라 다르게 작동하도록 상태를 객체로 표현한다
이를 통해 객체의 상태 전이 방식을 좀 더 명확하게 표현할 수 있다
전략 알고리즘을 사용하는 클라이언트와 상관없이 독립적으로 알고리즘을 다양하게 만든다
이를 통해 알고리즘을 쉽게 바꿔 사용할 수 있다
탬플릿 매소드 상위 클래스는 알고리즘의 골격만을 작성하고 구체적인 처리는 서브클래스로 위임함
방문자
(Visitor)
객체 구조를 이루는 원소에 대한 연산을 정의하는 데 사용되는 패턴
이를 통해 새로운 연산을 추가하더라도 그 객체 구조를 변경하지 않아도 된다
객체지향 원칙(solid)중 하나인 개방-폐쇄원칙(OCP)을 적용하는 방법