컴퓨터(Computer Science)/소프트웨어공학(Software engineering)

프로젝트 계획(12-3) 클래스 모델링, 재사용 [소프트웨어공학]

게임이 더 좋아 2020. 5. 20. 20:58
반응형
728x170

앞에 글에서 말했던 것처럼 그림을 하나 공부하려고 한다.

또 재사용에 대해서 배우려고 한다.

 

해보자

 


우선 클래스를 이해해야 설계를 잘할 수 있다. 

다시 말해서 객체가 가지는 상태와 여러 오퍼레이션 사이의 관계, 여러 오퍼레이션들이 서로 작용하는 효과를 이해해야 한다. 

 

++분석 모델이 나타내는 선언적인 정의만으로는 이해하기 힘들다

 

그래서 다이어그램, 그림을 그려봐야 한다.

 

상태 다이어그램은 상태와 어떤 이벤트가 발생했을 때 이루어지는 상태 사이의 변환으로 구성된다.

여기서 객체를 모델링 할 때 상태는 속성값이며 이벤트는 객체에 대하여 오퍼레이션이 수행됨을 나타낸다. 어떤 이벤트가 발생하였을 때 상태가 어떻게 변하는지를 나타내면 이벤트와 상태의 관계를 정의할 수 있다.

 

**객체의 상태를 모델링할 때 주의할 점: 객체가 가질 수 있는 모든 상태를 나타내는 것이 아님을 알고있자

**상태 다이어그램은 객체가 논리적으로 가질 수 있는 상태만을 나타낸다.

 

예를 들어 그림을 보자

스택을 나타내는 객체는 크기를 나타내는 Non-empty Not full 일 때는 스택에서 정의된 모든 오퍼레이션 동작이 같다.

그렇지만 Full, Empty 스택일 때는 오퍼레이션이 달라진다.

 

즉 스택의 상태에 따라 발생할 수 있는 이벤트, 오퍼레이션이 호출될 수 있는 집합이 달라진다.

 

++그림을 잘 그려야 구현도 잘 할 수 있는 것이다.

 

**상태 모델은 오퍼레이션을 위한 로직이 올바른지 검증하는 데 사용될 수 있다. 특히 스택과 같이 객체의 상태에 따라 적용될 수 있는 오퍼레이션이 다른 경우 중요하다.

 

++역시 예로 들어서 설명하니까 쉽지?


이제는 클래스 재사용에 대해서 알아보도록 하자

 

우선 순서가 있다. 

일반적으로 3가지가 있다.

 

1. 프레임워크

2. 재구성

3. 최적화 

 

우선 프레임워크에 대해서 살펴보자면

 

**프레임워크란 실정에 맞도록 커스터마이즈 할 수 있게 고안된 재사용 가능한 부분적인 응용프로그램이다.

 

클래스 라이브러리와는 달리 프레임워크는 자료처리나 이동 통신과 같은 특수한 기술이나 사용자 인터페이스나 실시간 하공 같은 응용 도메인을 목표로 한다.

 

**응용 프레임워크의 장점은 재사용과 확장이 가능한 것이다.

 

 

 

소프트웨어 개발 프로세스에서 프레임워크의 위치에 따라 구분할 수 있는데

 

1. 인프라 구조 프레임워크

개발 프로세스를 간소화하기 위한 목적의 프레임워크다.

(ex 운영체제, 이버거, 통신 테스팅, 사용자 인터페이스 설계 등)

 

2. 미들웨어 프레임워크

분산된 응용 시스템과 컴포넌트들을 통합하는데 사용된다.

(ex Java RMI, CORBA, WebObject 등)

 

3. 엔터프라이즈 응용 프레임워크

통신, 항공기, 환경, 제조, 금융, 기업 비즈니스 액티비티와 같은 도메인에 쓰인다.

 

 

 

 

또한 프레임워크를 확장하는데 사용되는 기술도 2가지가 있다.

 

1.화이트박스 프레임워크

확장을 위하여 상속 개념과 동적 바인딩을 이용한다. 

프레임워크 기본 클래스의 서브클래스를 정의하고 템플릿 메소드 패턴과 같은 것을 이용해서 재정의를 하고 확장시킨다.

++ 프레임워크 내부 구조에 대한 사전지식이 필요하다

 

2. 블랙박스 프레임워크

컴포넌트를 플러그인할 수 있도록 인터페이스를 정의하여 확장하는 방식으로 상속보다는 위임 방법을 이용하여 통합한다.

 

 


이번엔 재구성의 입장에서 보자면

 

재구성이라는 말에 걸맞게 진행된다.

 

재구성은 3가지 작업으로 이루어져있는데

 

먼저 연관 관계의 구현이 정확하도록 방향과 다중도를 잘 살핀다.

 

그 다음 재사용도를 높이기 위한 상속을 재검토한다. 

 

**그 이유는 상속은 유사한 클래스들 사이에 재사용을 가능하게 하고 많은 코드 재사용할 수 있다. 
이를 통해 중복을 줄이며 오류의 가능성을 줄이는데 목적이 있다.

 

그렇게 되면 객체에 고유한 동작들로부터 일반적이며 공통된 동작을 구별할 수 있어서 좋다.

 

마지막으로 구현 의존도를 낮추기 위하여 상속을 재검토한다. 

 

 


마지막으로 최적화에 관한 얘기를 해보자 

 

최적화를 왜하냐?? 만들자마자 그냥 그대로 내놓으면 조금 그렇잖아..

 

과학의 날 글라이더 만들 때 날개 정리도 안하고 날리면 잘 날아가나 안 날아가지 ㅋㅋㅋ

 

아무튼 객체 설계를 하는 동안 반응시간, 실행시간, 기억옥간을 최소화하는 설계목표를 달성하려면 최적화를 해야한다.

 

할 것 많다. 하나하나씩 보자면

 

접근 경로를 최적화하기 위하여 연관 관계를 추가하고
객체를 속성으로 축소한다

복잡한 계산은 연기하고
효율성과 명확성 사이에 균형을 이루게 한다. 

 

그런데 최적화는 시스템의 효율성은 높이지만 시스템을 더 복잡하게 하고 이해하기 어렵게 한다.

그런거 있잖아. 자기 방 드럽게 어질러놔도 엄마는 못찾지만 나는 찾는거 ㅋㅋㅋㅋ 엄마가 정리해놓으면

내 물건 만지지 말랬지!!! 이러면서 못찾겠다고 찾아달라고 하는거 있잖아...

 

최적화는 모든 사람의 입장을 고려할 수 없다. // ㅋㅋㅋㅋㅋ 추억

 

아무튼 최적화 하는 방법은 여러가지가 있고 구체적으로 말하고 싶지만... 여기서는 생략하겠다.ㅎㅎ

 

 

다음에 더 배우자 ㅎㅎ

반응형
그리드형