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

프로젝트 계획(8) - 모델링(Modeling) + 객체지향 [소프트웨어공학]

게임이 더 좋아 2020. 4. 20. 18:37
반응형
728x170

계획 다 했으니 이제 정말로 형태를 갖춰가는 작업을 해야지??

그게 모델링이다. 형태를 만드는 것

 

 


 

 

모델링이란 도메인 지식을 체계화 하는 과정으로

중요한 도메인 개념과 특성, 관계를 파악하여 다이어그램으로 정형화하는 것이다.

 

모델링은 개발팀이 응용 문제를 이해하는 데 도움을 주는 일종의 개념화 과정이다.

요구 추출과정에 의하여 수집된 도메인 개념과 정보는 분석되고 분류되어 UML과 같은 방법을 이용하여 모델로 비주얼화 된다.

 

 모델링이 구체적으로 어떻게 개발자에게 도움을 주느냐?

 

1. 응용문제를 이해하는 데 도움을 줌
2. 개발팀원들 사이에 응용문제의 공통 개념으로 대화하게 하고 개선시킴
3. 파악한 개념을 사용자와 고객에게 전달 할 때 도움을 줌
4. 후속 작업 즉 설계, 구현, 테스팅, 유지보수에 개념적인 기준을 제공

 

 

 


모델링은 어떻게하느냐?? 

패러다임에 따라 다양한 모델링 방법이 있다. 

ex) 자료흐름도 - 프로세스 위주의 모델링

 

그러나 최근에는 객체지향 패러다임이 많이 사용되고 있다.

왜 사용되느냐?

 

객체지향의 장점을 한 번 보자

 

 

1. 개발자가 설계를 작성하고 이해하기 쉬움

// 함수 중심의 절차적 소프트웨어는 기능이 개발되어있어도 다시 개발해야하는 경우가 있다.

// 약간의 차이(ex 데이터 타입,  변수 타입)이 달라도 함수가 무용지물이 되기 때문


2. 자료와 함수를 함께 추상화 함으로써 변화에 영향을 적게 받음

// 절차적 방법의 단점 보완


3. 사용자 중심, 대화식 프로그램의 개발에 적합

// 유사성을 이용할 수 있는 방법을 제공, 소프트웨어 부품을 체계적으로 다시 사용할 수 있도록 프로그래밍


4. 프로그램을 뚜렷하게 구별되는 단위(object)로 분할 가능

// 구별된 단위들은 잘 정의된 인터페이스를 이용, 상호 작용가능

//그에 따라 요구 분할 및 변경 작업 용이

 

**특히 객체지향 설계를 위한 여러 가지 모델링 방법들이 통합된 UML(Unified Modeling Language) 는

소프트웨어 개발자에게 필수임

 


 

객체지향과 절차적 방법의 비교

 

객체지향 기술의 근본은 주어진 문제를 이해하고 모델링 하는 시각에 있다.

 

객체지향은 주어진 문제 영역을 그 안에 존재하는 객체의 집합으로보며, 객체들은 서로 정보를 주고받아 상호 작용한다고 여긴다.

 

 

절차적 줌심의 방법의 시각은 소프트웨어는 데이터 구조와 이를 이용한 함수들의 집합이라고 본다.

 + 데이터와 함수는 밀접한 관련이 있음에도 원시코드에 퍼져있다.

 

객체지향 기술의 중요한 기본 개념은 객체, 클래스, 캡슐화, 상속, 다형성, 객체 사이의 관계에 있다.

 

JAVA를 배우면 이 모든 것들을 배우지만,, 난 다 까먹음 ㅠ

 


 

그럼 더욱 자세히 객체지향 방법에 대해 알아보자

 

클래스와 객체부터 알아보자

 

정의는

클래스(타입) : 속성과 오퍼레이션을 캡슐화
객체 : 클래스의 인스턴스

 

클래스를 정의하기 위해서는 클래스가 가지는 속성(attribute)를 도출해야한다.

밑에 그림을 보면 Employee 클래스를 정의하는 과정이 나와있다.

 

 

private처럼 이용해야 하는 데이터들이 들어있고

 

public에는 이용해야 하는 함수들이 들어있다. 

 

결국 클래스란 각각의 객체들이 갖는 속성과 적용되는 연산을 정의하고 있는 틀(templet)이다. 

 

** 프로그램에서는 객체를 이렇게 선언한다

Employee  asd_fgh  = new Employee( ) ;

 

 


그럼 이번에는 객체와 속성에 대해 알아보자

 

정의는 

객체 : 속성과 오퍼레이션을 가진 애플리케이션의 독립된 존재
속성 : 객체의 특징을 결정

 

객체란 필요한 자료 구조와 이에 수행되는 함수들을 가진 하나의 독립된 개체이다. 

각 객체가 자료구조를 갖는다? 이것은 각 객체가 속성을 가지고 있다는 것이다.

 

 

ex) 그래픽 프로그램에서 하나의 점을 객체로 본다면 수평과 수직 위치가 자료가 되고 그 값이 객체의 속성을 의미한다.

 

**객체가 적용될 수 있는 연산(operation)을 가진다는 것은 객체가 연산을 수행할 수 있는 능력이 있다는 것이다.

다시 말해서 객체 안에 함수(연산)이 있으면  그 객체는 연산을 수행할 수 있는 능력을 가졌다고 말한다.

 

객체의 구조는 이렇다

소프트웨어 모듈(객체) = 자료구조 + 함수

 

 

객체는 상태(state), 능력(behavior), 정체성(identity)을 가짐
1. 상태 // 속성을 가짐
2. 능력 : 연산(operation)을 수행 할 수 있는 능력 // 함수를 가짐 
3. 정체성 : 구별 가능 // 다른 객체와 구별 가능

 

 


이번에는 다른 특징인 캡슐화 (encapsulation)을 알아보자

 

정의는


 속성과 관련된 오퍼레이션을 클래스 안에 묶어서 하나로 취급하는 것이다.
 ex) 대학 학사 관리 시스템
 데이터 : 학번, 이름, 주소 캡슐화
 함수 : 평점 계산, 주소 변경, 수강 신청 캡슐화

 

왜 묶냐고?? 그래야 처리하기 편하니까. 이유없는 작업은 없다.

 

캡슐화는 설게나 분석 단계에 주어진 문제를 간단히 생각하는 추상화의 수단이 될 수도 있다.

즉 데이터를 이루는 객체의 속성, 연산 등 세부사항은 나중에 생각하고 처음에는 객체라는 덩어리 단위로 생각하게 한다.

또한 정보를 외부에서 접근하지 못하게 감출 수 있다.

정보은닉(information hiding)
캡슐 속에 있는 항목에 대한 정보를 외부에 감추는 것 ,즉 외부의 직접적 접근 불가, 일종의 블랙박스

 

구현에 따라 선택 가능
문법 : public, private, protected (접근 제한을 둘 수 있다)

 

 


이번에는 연관(association)에 대해서 알아보자

 

객체는 일반적으로 상호작용하여 동작한다. // 혼자 동작하지 않음

객체지향 시스템에서는 객체는 다른 객체가 제공하는 서비스를 실행시키는 메세지를 보내어 상호작용한다.

그래서 객체에 있는 서비스를 호출하면 두 객체는 관계가 맺어져야 한다. 그게 연관이다

** 다시 말하자면 연관이란 하나 또는 그 이상의 클래스와의 관계를 말한다.

 

++연관지으려면 상호작용할 필요가 있는지 찾아내는 작업이 필요하다.

 

연관의 예를 보여주자면

 

ex) 은행시스템과 학사업무 시스템

 

손님과 계좌는 소유관계

 

학생과 수강 과목과 교수의 관계는 가르침을 받고 가르침을 주고 그 가르침의 대상이 되는 관계

 

객체가 다른 객체의 서비스를 사용하는 것이 바로 연관이 있다는 것이다.

 

연관이 있으면 따라오는 것이 있는데 그것이 바로 객체의 가시성(visibility)이다. 가기성이란 객체의 접근 가능성을 뜻하는 것으로 A 객체가 B 객체와 연관이 있다면 A 에서 B 객체를 알고 있고 접근 가능하단 소리다. 

 

 

?? 그렇다면 어떻게 연관 짓냐???

 

1. 연관된 객체(Course)를 전역으로 선언하여 클라이언트 객체(Student)가 접근할 수 있게 함

//그러나 연관된 객체가 모든 다른 객체에게 오픈된다. (정보 은닉은 안됨)


2. 연관된 객체(Course)를 클라이언트 객체(Student)의 메시지 호출 오퍼레이션의 매개변수로 만듬

// 즉 연관객체가 메소드의 매개변수가 되면 메소드를 통하여 접근


3. 연관된 객체(Course)를 클라이언트 객체(Student)의 일부로 만듬

// 연관된 객체가 클라이언트 객체 안의 데이터 멤버로 정의되는 것

//그렇게 되면 클라이언트 객체가 소멸되면 당연히 멤버인 연관 객체도 사라짐


4. 연관된 객체(Course)를 클라이언트 객체(Student)에서 선언

// 클라이언트 객체가 연관된 객체의 포인터를 갖도록 선언하는 것이다.

 

 

 

 

++ 클라이언트는 사용자를 뜻한다고 보면 되겠다.

 

 


그 다음에는 집합에 대해 알아보자

 

여기서 집합은 (set이 아니라 aggregation)

 

집합이란 전체 개념(whole)과 부분 개념(part) 사이의 관계이다. 

 

집합관계는 격납(containment)의 의미를 가지고 있는데 (일반 영어단어와 좀 다른 뜻)

A,가B,C의 집합 개념이라면 B,C는 A에 포함된다는 뜻이다.

 

다시 말해서 집합은 두 클래스 사이의 관계를 말하는 것이다.

한 객체가 다른 클래스의 객체의 부분이 될 때 집합의 관계를 가진다고 한다.

 

 ex)디스크 > 트랙  >섹터

++Disk 클래스는 Track 클래스의 객체에 대한 포인터를 그 안에 가지고 있고

이 포인터는 객체 밖에서 접근 x (private)

 

++Track 클래스의 정의를 보면 Sector 클래스 타입의 객체 배열을 그 안에 포함하고 있음

 

 

 


 

이번에는 상속에 대해 알아볼 것이다. 

정말 유용하게 쓰이니까 잘 알아두자

 

상속이란 두 클래스 사이의 관계다. 한 클래스가 다른 클래스의 일반화된 개념인 경우 성립한다.

 

다시 말해서 상위 개념의 일반화된 클래스가 갖는 속성과 연산을 하위 개념의 구체화된 클래스가 그대로 온전히 물려받는 것을 의미한다. 

 

** 그대로 속성과 연산을 물려받고 싶을 때는 다시 작성하는 것이 아닌 상속으로 간단하게 쓸 수 있다.

 

용어로는 슈퍼클래스(superclass), 서브 클래스(subclass) 가 있다.

슈퍼클래스는 원래 클래스를 말하면 서브클래스는 슈퍼 클래스 하위 클래스를 말한다.

 

** 물론 슈퍼클래스 객체가 갖는 특유의 속성은 추가 가능하다

(그렇지 않으면 서브랑 슈퍼가 구분이 안되잖아ㅎㅎ)

 

 

 

일반적으로 슈퍼클래스도 여러 개 서브클래스는 여러 개를 가질 수 있다

이것이 바로 복수 상속이라고 한다 ( multiple inheritance)

 

학부생은 인사대상, 학생을 슈퍼클래스로 가지는 한편

인사 대상은 학생, 교수, 직원을 서브클래스로 가진다.

 


 

 

마지막 객체지향의 특징, 다형성에 대해 알아보자

 

Polymorphism , 해리포터에 나온 폴리모프주스랑 같은 폴리모프다. poly가 다수 morph가 형태, 변함을 뜻하는데

영어시간이 아니니까 여기까지만 하고 아무튼

 

여러 형태를 가지고 있다는 뜻이다. 다시 말해서 여러 형태를 받아들일 수 있는 특징이 있다는 것이다.

 

객체의 상태를 변화시키려면 그 객체가 소유하는 연산을 호출해야 한다. 이 때 같은 이름의 메세지를 다른 객체 또는 서브클래스에 호출할 수 있는 특징을 바로 다형성이라고 한다. 

 

예를 들어보자

 

 

++getArea()는 도형의 넓이를 구하는 오퍼레이션

 

getArea()라는 오퍼레이션는  도형이 모양이 달라도 호출할 수 있다. 

//하지만 메소드는 도형마다 달라야겠지..? 그래야 넓이를 구하지

 

++메소드 : 특정한 클래스를 위하여 오퍼레이션을 구현한 것

 

++ 하나 이상의 메소드를 가진 오퍼레이션은 매개 변수나 객체가 속한 클래스의 이름으로 구분한다

즉 Circle이나 Rectangle은 같은 오퍼레이션이라도 실행되는 메소드가 다르다 이말이다.

 

**장점으로는 현재 코드를 변경하지 않고 새로운 클래스를 쉽게 추가할 수 있다는 것이다.

 

 

 

여기까지 객체지향의 관점을 한 번 배워보았다.

 

728x90
반응형
그리드형