코드 재활용과 생산라인 증설 - 起
이철우
객체지향[참고 1] 언어가 나오면서 기존의 구조적 언어 또는 함수형 언어보다 더 쉽게 더 효율적으로 코드를 재활용할 수 있게 되었다. 이는 결과적으로 유지/보수할 코드가 줄어들어 프로그래머에게는 코드를 검토하는 부담을 줄이고 경영자에게는 코드 관련한 비용을 절감하는 효과가 있다.
어느 기업에서 공장에 라인을 추가하며 기존의 코드를 재활용한 방법을 소개하며 ‘이것보다는 더 좋은 다른 방법이 없을까?’ 생각하고, '객체지향’을 활용한 더 나은 다른 방법을 소개한다. 글은 起, 承, 轉, 結, 이렇게 네 꼭지로 나누어 쓸 것이다.
'起’에서는 이 글의 윤곽과 공장을 추상화한 코드를 도입하고 객체지향의 '숨기기’를 활용하여 앞의 코드를 분리할 것이다. '承’에서는 신규 생산라인에 쓸 코드를 기존 코드를 '복사’하여 가동하는 방법과 라인별로 '이름’을 붙여 재활용 하는 방법을 소개한다. '轉’에서는 객체지향의 '물려받기’를 이용한 재활용 방법으로 개선할 것이다. '結’에서는 앞의 세 방법을 비교하며 각각의 장단점을 살펴보겠다.
공장 추상화
공장은 재료를 준비(Get Ready)하고, 가동(Run)하며, 정지(Stop)하는 세 가지 기능이 있다. 재료는 나무와 쇠가 들어가며 준비에서 이를 입력 받고, 가동하면 나무와 쇠의 수를 더해 제품을 만든다. 정지하면 제품 수를 출력한다. 아래는 DotNet8 C# 콘솔 프로젝트로 만든 코드 - Program.cs - 이다. 기능과 실행이 한 파일에 있기에, 이 Program.cs 파일을 '한 파일에 모두’라고 부르겠다.
- Program.cs -
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
string? input;
bool isInputCorrect;
int wood, steel;
int output;
GetReady();
Run();
Stop();
Console.WriteLine("Bye.");
void GetReady()
{
isInputCorrect = false;
input = Console.ReadLine();
}
void Run()
{
var words = input!.Split(' ');
if (words!.Length == 2)
{
isInputCorrect = true;
wood = int.Parse(words[0]);
steel = int.Parse(words[1]);
output = wood + steel;
}
else
{
isInputCorrect = false;
output = 0;
}
}
void Stop()
{
if (isInputCorrect)
{
Console.WriteLine($"Output: {output}");
}
else
{
Console.WriteLine("Input is not correct.");
}
}
‘숨기기’ 이용하여 코드 분리
준비, 가동, 정지, 이 세 가지 기능을 갖는 interface IFactory.cs를 만들고, 위 '한 파일에 모두’에서 Factory.cs를 분리하자.
- IFactory.cs -
internal interface IFactory
{
void GetReady();
void Run();
void Stop();
}
- Factory.cs -
internal class Factory : IFactory
{
private string? _input;
private bool _isInputCorrect;
private int _wood, _steel;
private int _output;
public void GetReady()
{
_isInputCorrect = false;
_input = Console.ReadLine();
}
public void Run()
{
var words = _input!.Split(' ');
if (words!.Length == 2)
{
_isInputCorrect = true;
_wood = int.Parse(words[0]);
_steel = int.Parse(words[1]);
_output = _wood + _steel;
}
else
{
_isInputCorrect = false;
_output = 0;
}
}
public void Stop()
{
if (_isInputCorrect)
{
Console.WriteLine($"Output: {_output}");
}
else
{
Console.WriteLine("Input is not correct.");
}
}
}
그리고 위 Program.cs를 다음과 같이 바꾼다. 기능(Factory.cs)과 실행(Program.cs)을 분리했기에 이 Program.cs 파일을 '실행만 함’이라고 부르겠다.
- Program.cs -
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
IFactory factory = new Factory();
factory.GetReady();
factory.Run();
factory.Stop();
Console.WriteLine("Bye.");
코드를 분리하는 과정에 알게 모르게 SOLID[참고 2] 중 몇 개가 적용되었을 수 있다. 다음 글 - 承 - 에서 객체지향 있기 前의 생산라인 증설 방법에 대해 알아보자.
[참고 1] 객체지향 프로그래밍
[참고 2] The Principles of OOD
http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod