1. Introduction
저번 강좌에서는 객체와 클래스의 개념에 대해서 자세하게 알아 보았습니다. 이제 어느 정도 객체와 클래스의 개념을 이해 했을 것입니다. 하지만 이런 객체와 클래스를 알게 되었다고 해서 우리가 객체 지향 적인 프로그래밍을 설계하고 활용 할 수 있는 것은 아닙니다. 이 개념은 꾸준히 연구하고 설계하는 노력에서 나오는 것이기 때문입니다. 그래서 이번 장에서 클래스를 설계하는 방법에 대해 연구해보고 설계하는 방법을 다루어 볼 것입니다. 이번 장의 대상은 객체와 클래스의 개념을 이해 하고 있으신 분 이여야 하며 클래스의 문법 또한 이해하고 있어야 합니다. 그럼 객체 지향 설계에 들어 가보도록 하겠습니다.
2. 객체지향의 단계적 활용
2.1 업무 요청
여러분은 어느 호텔의 고객정보관련 프로그램 일을 유지하고 개발하는 개발자입니다. 어느 무료한 시간을 보내고 있던 중에 새로운 작업요청이 들어 왔습니다.
To. 고객관리 개발자
현재 호텔에 투숙하고 있는 고객의 정보를 가지고 있다가 투숙하고 있는 고객들의 성(gender)을 물어보면 그 고객이 남자인지 여자인지 반환해 주는 프로그램을 만들어 주세요
아주 간단한 프로그램을 요청이 들어왔네요. 작업내용을 한번 정리 해보겠습니다. 호텔의 고객들의 성을 반환해 주는 프로그램을 만들어 주면 됩니다. 근데 잠시 저장 시켰다가 요청한 아이의 성을 반환해 주라는 것이군요. 머 어려울 거 없는 내용입니다.
위와 같은 업무를 받았을 때 여러분은 클래스를 어떻게 설계하고 정의할지 생각해 보시기 바랍니다. 그리고 이제 단계별로 객체지향 적인 설계를 해 볼 것입니다. 여러분이 생각하고 활용하는 객체 지향의 능력은 어느 정도 되는지도 한번 점검해 보기 바랍니다.
2.2 객체 지향의 30% 활용
public class Custom
{
//여러 고객정보들 생략
private bool Sung; //true=남,false=여
public Custom(bool _Sung) //고객의 성을 저장하는 생성자
{
Sung=_Sung;
}
public string GetSung
{
get{return Sung;}
set{Sung=value;}
}
public string GetSung() // 고객의 성을 반환해주는 메소드
{
if(Sung)
return "남자";
else
return "여자";
}
}
객체를 30% 활용한 코드를 살펴 봅시다. 고객의 정보를 담을 Custom이라는 클래스를 만들었습니다. 그리고 Sung이라는 변수를 이용해서 남자 고객인지 여자 고객인지 구분하여 문자열을 전달합니다. 어떻습니까? 별 문제가 없어 보이죠? 대부분의 개발자들이 위와 같이 클래스를 설계 할 것입니다.
하지만 위의 클래스 객체 지향적인 설계로 보여지지 않습니다. 위의 프로그램 설계는 남자 고객인지 여자 고객인지 확인 하기 위해서는 생성한 객체 Sung이라는 변수를 확인 해야만 합니다. 다시 말하면 남자고객과 여자고객 두 개의 객체를 하게 되면 사실상 남자 고객인지 여자 고객인지 명확하게 구별 되지 못하는 거입니다. 이제 다음 단계를 살펴 봅시다. 그럼 왜 효율적이지 못한 것인지 충분히 느끼게 될 것입니다.
2.3 객체 지향의 60% 활용
public class Custom
{
// 고객 정보들 생략!
}
public class Man : Custom
{
public string GetSung()
{
return "남자";
}
}
public class Woman : Custom
{
public string GetSung()
{
return "여자";
}
}
이번에 설계된 클래스는 고객 객체를 생성 할 때 너는 여자다 남자다 라는 인자를 기억해둘 필요가 없습니다. 고객 클래스에서 Sung인자를 없애버렸습니다. 프로그램 메모리도 어느 정도 절약 할 수 있게 된 것이죠. 그리고 남자와 여자라는 자식 클래스를 별도로 만들었습니다.
이 클래스는 너의 성이 무엇이냐 라는 질문에 어떤 플래그를 거치지 않고 자신의 성을 말할 수 있습니다. 여기서는 객체 지향의 상속성 이라는 개념을 도입한 것입니다. 너무나 중요한 개념입니다. 상속을 도입했다고 해서 첫술에 배부르면 안 됩니다. 자, 그럼 이제 다형성과, 추상화의 개념을 도입하여 클래스를 설계 해 보겠습니다.
2.4 객체 지향의 90% 활용
public abstract class Custom
{
abstract public string GetSung(); //추상화
}
public class Man : Custom
{
public override string GetSung() //다형성
{
return "남자";
}
}
public class Woman : Custom
{
public override string GetSung()
{
return "여자";
}
}
추상화의 개념은 Custom 안에 GetSung()이라는 메서드 에서 사용 되었습니다. 추상화라는 것은 표현하고자 하는 특성을 간추리는 작업을 의미합니다. Custom 클래스에서 추상적으로 선언된 GetSung() 메서드는 abstract로 선언 되어 있습니다. 그리고 각각의 Man,Woman 클래스에서는 Custom 클래스를 상속 받고 그 안에서 GetString()을 구체화 하여 사용합니다. 각각의 클래스에서 자신의 특성에 맞추어서 구체화 되는 것을 우리는 다형성 이라고 부릅니다. 같은 GetSung()이지만 남자와 여자의 두 개의 특성으로 사용 되는 것입니다. 위의 설계는 추상화의 개념과 다형성의 개념이 잘 표현되고 있습니다.
2.5 다형성과 추상화의 활용
다형성과 추상화를 이용한 예제를 살펴 보았습니다. 이제 객체에 대한 놀라움과 감탄이 나와야 할 타이밍입니다. 하지만 별다른 감동이 오지 않으시는 분들이 대부분일 것입니다. 별 감동이 없으신 분들을 세가지 분류의 사람들로 가려집니다. 첫 번째 경우는 다형성과 추상화의 개념을 자주 도입해 사용 하시고 있는 분이라면 그다지 큰 감동이 오지 않습니다. 괜한 시간낭비를 했다고 생각 할 수 있습니다. _-_; 두 번째는 다형성과 추상화의 개념을 알고는 있었지만 필요성을 느끼지 못해서 사용해오지 않았던 분들입니다. 그리고 마지막으로 객체지향 설계를 한번도 접해 본적이 없으신 분들입니다. 필자의 생각으로는 주로 두 번째 분류의 사람이 대부분이라고 생각이 됩니다. 객체의 개념은 알고 있지만, 별다른 필요성을 느끼지 못해 왔다는 것입니다. 필자 역시 그래 왔었기 때문에 여러분들의 마음을 잘 읽을 수 있습니다. 그래서 특별히 두 번째 사람들의 분류를 겨냥한 돌발 상황을 만들어 보겠습니다.
여러분은 앞서 주문한 프로그램은 완성 하였습니다. 하지만 추상화와 다형성의 개념은 사용하지 않았습니다. 이유는 별 필요성을 느끼지 못해서 라고 해두겠습니다. 프로그램은 정상적으로 아주 잘 작동 되었습니다. 하지만 이 호텔에는 외계인이 자주 잠을 자러 방문합니다. 그런데 외계인은 자신은 중성이라고 자꾸 떼를 씁니다. 외계인 덕분에 요청에 의해서 만들어 준 프로그램은 사용할 수 없었습니다. 호텔 운영자는 중성이라는 요소를 추가시켰으면 좋겠다는 소망이 간절할 뿐입니다.
자, 프로그램 수정! 머 한두 번 있는 일도 아닙니다. 너그럽게 수정을 받아 드리도록 합시다. 자 이제 30%, 90% 의 설계를 살펴 보면서 어떻게 수정해야 될지 같이 생각해 봅시다.
만약 30% 활용한 설계일 경우를 살펴 봅시다. 클래스가 상당히 지저분해 질 것으로 보여집니다. 플러그의 형태를 변화시켜야 되고 GetSung() 이라는 메서드를 수정 해야 합니다. 이것은 깨끗하지 못한 클래스 되어 간다는 것을 볼 수 있습니다. 그럼 객체를 90% 활용한 클래스를 살펴 보도록 합시다. 다형성의 개념을 가지고 있는 이 클래스에서는 단지 중성 클래스를 확장 함으로서 간단히 해결 할 수 있게 됩니다.
객체 지향적 사고는 한번에 자신의 머리 속에 정착 되지 않는 것이 특징입니다. 객체 지향적 사고를 가지기 위해서는 많이 설계해보고 토론해보고 또 생각해보는 노력이 필요합니다.
3. 정리!! 객체지향적 설계 방법
순차적으로 진행 되어야 할 객체 지향 설계 방법을 정리 해보겠습니다.
1) 구현 할 대상(객체)를 선별합니다.
-> 남자, 여자를 구분해 낸 것처럼 연관성 있는 객체들을 분별해 냅니다.
2) 중복 요인을 확인합니다.
-> 중복되는 부분을 뽑아내어 하나의 부모 클래스로 묶는 작업을 말합니다.
3) 상속 받은 후, 각자의 특징대로 클래스를 다시 정의합니다.
-> 고객 클래스를 상속 받은 후 남자, 여자, 중성과 같이 나누는 잡업을 말합니다.
객체 지향에는 정답이 없습니다. "이렇게 설계하는 것이 객체 지향적으로 설계하는 것이다." 것은 극히 주관적인 말이 되는 것입니다, 하지만 효율적인 객체 지향적인 프로그래밍을 하기 위해서는 객체의 특성을 자유롭게 활용 하도록 노력해야만 합니다. 앞의 예제에서 적용해 본 객체의 속성은 추상화(Abstraction), 상속성(Inheritance), 다형성(Polymorphism) 이였습니다. 이 밖에도 캡슐화(Encapsulation), 주체성(Identity), 분류성(Classification)등등의 많은 개념들이 존재 합니다.
작성자 : HOONS(박경훈)
이메일 : tajopkh@hanmail.net
홈페이지 : http://www.hoonsbara.com