본문 바로가기

스터디/C#.NET:자료

객체 지향 (패키지화, 상속)에 대해서

 

C++ 언어를 꽤 오랫동안 사용해 왔지만 솔직히 객체지향 방식을 거의 사용하지 않은듯합니다. 올해 C#을 접하면서부터 객체지향이라는 것을 좀더 깊이 알게 되었는데 기존에 C++로 코딩한 소스를 보니 겉만 C++이고 속은 거의 C언어로 짠 거 같았습니다. 객체지향의 개념을 다시 정리해 봅니다.

 

◆ 객체지향

   

객체 지향 프로그래밍(문화어: 대상지향프로그람작성, 객체본위프로그람작성, Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임의 하나이다. 객체 지향 프로그래밍은, 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다. 또한 프로그래밍을 더 배우기 쉽게 하고 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점을 갖고 있다. 그러나 지나친 프로그램의 객체화 경향은 실제 세계의 모습을 그대로 반영하지 못한다는 비판을 받기도 한다.

출처: http://ko.wikipedia.org/wiki/객체지향

 

모듈형식으로 묶어서 프로그램 하는 것(패키지화)을 객체지향이라고 할 수 있으며 객체지향은 상속이라는 기능도 제공합니다. 패키지화와 상속에 대해 알아보겠습니다.

 

 

 

 

◆ 패키지화를 사용하지 않는 예 - 사람

   

'사람'을 예로 들어 설명해 보겠습니다. 사람을 나타내기 위해서는 여러 가지 항목이 필요합니다. 이름, 나이, 성별, 주소 등등이 있어야만 '사람'을 나타낼 수 있는데 이러한 것들을 속성이라고 합니다.

'사람' 하나를 C 언어로 간단하게 표현해 보면 아래와 같을 겁니다.

char 이름[];

int 나이;

int 성별;

char 주소[];

 

만약 사람 10명을 표현하려면 어떻게 해야 할까요? 아래처럼 2차원 배열로 선언하면 될 것입니다.

char 이름[10][];

int 나이[10];

int 성별[10];

char 주소[10][];

 

만약 사람 100명을 표현하려면 어떻게 해야 할까요? [10]을 [100]으로 변경하면 됩니다.

char 이름[100][];

int 나이[100];

int 성별[100];

char 주소[100][];

 

위 예는 속성을 4개만 사용하고 선언된 부분에서만 크기를 변경한 것이라서

'그냥 뭐 숫자 몇 개만 변경해서 사용하면 되지 뭐'라고 생각하시는 분들께서도 계실 겁니다.

 

하지만 사람의 속성이 예처럼 달랑 4개만 있는 것도 아니고 이러한 변수가 100군데, 1000군데에서 사용되었을 때 사람수가 변경된다면 그 모든 부분을 다 수정해 줘야 해서 많은 시간이 소요될 뿐만 아니라 최악의 경우 여기저기 흩어져 있는 변수 때문에 코드가 길어질 경우 억지로 껴 맞춰야 하는 경우도 생길 수 있습니다.

 

 

 

◆ 패키지화 방법 이용하기 – 사람

 

 

 

'사람'을 하나의 묶음으로 만들어서 다루어 보겠습니다. C++ 과 C#에서는 class를 이용하여 묶을 수가 있습니다. '사람'을 클래스로 묶는다면 아래와 같을 겁니다.

Class 사람

{

char 이름[];

int 나이;

int 성별;

char 주소[];

기타 등등 다른 속성들 // 속성이 수 없이 많아서 상관 없다.

} 

 

이렇게 선언된 사람 클래스를 100명, 1000명으로 만들려면 어떻게 해야 할까요?

아래처럼 각각 1줄이면 끝입니다.

Clsass 사람 생성된사람[100]; // 100 명 생성

Clsass 사람 생성된사람[1000]; // 1000 명 생성

 

 

 

 

◆ 상속 이용하기 – 사람을 학생과 회사원으로 확장

 

위에서 객체지향의 성격 중 패키지에 대해서 알아 보았는데, 객체지향은 상속이라는 방법도 지원합니다. 만약 사람이라는 클래스를 만든 상황에서 학생과 회사원이라는 클래스를 만들어야 한다면 어떻게 해야 할까요?

그냥 '사람'을 만든 것처럼 몇 가지 속성을 추가해서 만들면 될까요?

학생

회사원

Class 학생

{

char 이름[];

int 나이;

int 성별;

char 주소[];

int학년; // 학생 속성

char 학교명[]; // 학생 속성

 

} 

Class 회사원

{

char 이름[];

int 나이;

int 성별;

char 주소[];

char 회사명[]; // 회사원 속성

char 부서명[]; // 회사원 속성

 

물론 그냥 만들어도 됩니다. 하지만 잘 살펴보면 '학생'도 기본적인 '사람'의 속성을 포함하고 '회사원'도 '사람'의 속성을 포함합니다. 그림으로 그려보면 아래와 같을 겁니다.

 

학생

회사원

Class 학생

{

사람 속성;

int학년; // 학생 속성

char 학교명[]; // 학생 속성

 

} 

Class 회사원

{

사람 속성;

char 회사명[]; // 회사원 속성

char 부서명[]; // 회사원 속성

 

기존에 만들었던 '사람'을 어떻게 활용할 수 없을까요? 이럴 땐 상속이라는 것을 이용하면 됩니다.

학생

회사원

Class 학생 : 사람

{

int학년; // 학생 속성

char 학교명[]; // 학생 속성

 

}

Class 회사원 : 사람

{

char 회사명[]; // 회사원 속성

char 부서명[]; // 회사원 속성

 

 

즉 '사람'의 속성을 포함하는 '학생'은 '사람'을 상속받고 학생전용 속성을 추가한 것과 같습니다.

상속받지 않는 '학생'과 '사람을 상속받은 학생'의 기능은 동일하지만 상속을 받은 '학생'이 가식성이 좋아집니다.

학생

'사람'을 상속 받은 '학생'

비 고

Class 사람

{

char 이름[];

int 나이;

int 성별;

char 주소[];

}

Class 사람

{

char 이름[];

int 나이;

int 성별;

char 주소[];

}

'사람'은 동일함

 

 

 

 

Class 학생

{

char 이름[];

int 나이;

int 성별;

char 주소[];

int학년; // 학생 속성

char 학교명[]; // 학생 속성

 

}

Class 학생 : 사람

{

int학년; // 학생 속성

char 학교명[]; // 학생 속성

}