지난 번 포스트에서 객체 지향 언어의 4대 기본 원칙 중 첫 번째 캡슐화를 알아보았다.
객체 지향 언어의 4대 기본 원칙 :
- 캡슐화 (Encapsulation)
- 추상화 (Abstraction)
- 상속 (Inheritance)
- 다형성 (Polymorphism)
이번 포스트는 추상화를 이야기해보려고 한다.
나는 사실 처음에 추상화라는 용어가 낯설게 느껴졌다. "이미 소프트웨어라는 것 자체가 추상적인데 뭘 더 추상화하라는 거지?" 라는 생각이 머리에 떠올랐던 것 같다.
사실 추상화 한다는 의미는 사용자의 입장에서 단순화 시켜준다는 의미이다. 사용자는 복잡한 구현에 대해서는 관심이 없다.
예를 들어 우리가 자동차의 엑셀을 밟을 때 몇 ml 의 휘발유를 엔진에 넣고 몇 어느정도의 세기로 압축할 것이며, 어느시점에 점화를 할 것인지 궁금하지 않은 것 처럼 말이다.
리모컨의 인터페이스를 생각해보자. 누가 일일이 알려주지 않아도 +
라고 적힌 버튼을 보면 음량이 높아질 것 같다. 리모콘이 어떤 과정을 거쳐 음량을 높이는지는 모르겠지만 사용자가 보기에 음량이 높아질 것 같다는 생각이 들면 그 자체로 좋은 디자인인 것이다.
그렇기 때문에 추상화라는 것은 반드시 interface
를 사용한다거나 abstract
클래스를 사용하는 것을 의미하지는 않는다. 이런 것들은 추상화를 도와주는 도구일 뿐이다.
그래도 이왕 이야기가 나왔으니 interface
를 사용하면 어떻게 추상화가 되는지 예를 들어 보자. interface
는 클래스와 비슷하게 생겼는데 구현부가 없고 메소드 이름과 형태만 존재한다.
interface IEncoder
{
string Encode(Video video);
Video Decode(string encodedString);
}
위 예제에서 내가 설정한 상황은 이렇다.
우리 팀은 좋은 인코더를 만들 수 있는 기술이 없다. 그래서 영상팀에 인코더를 만들어달라고 요청하려고 하는데 그 팀에서 어떻게 구현하는지는 관심이 없고
Video
를 넣으면string
으로 바꿔주는 인코더와 인코딩된string
을 다시Video
로 바꿔주는 디코더만 있으면 된다.
이렇게 함수의 형태와 이름을 약속하는 것이 interface
의 역할이다. 이제 영상팀은 IEncoder 를 상속받아 구현할 것이다.
public class ExcelentEncoder : IEncoder
{
public Video Decode(string encodedString)
{
Video vedeo = new Video();
// ~~복잡한 구현~~
return vedeo;
}
public string Encode(Video video)
{
string encodedString = "";
// ~~복잡한 구현~~
return encodedString;
}
}
우리팀은 이제 영상팀에서 interface
를 통해 약속한 계약만 지켜준다면 그들이 어떻게 구현하든 상관 없이 개발을 이어나갈 수 있다.
static void Main(string[] args)
{
Video video = new Video();
IEncoder encoder = new ExcelentEncoder();
string encoded = encoder.Encode(video);
// 데이터 베이스에 저장, 메일로 전송, 블라 블라~~
}
여기서 인터페이스를 사용했다는 것 보다 중요한 것은 "인코딩"이라는 작업을 추상화 했다는 것이다. 사용자인 나는 "인코딩"이 어떻게 이뤄지는지는 관심이 없다. 그저 Encode()
라는 메소드를 이용하면 "인코딩"이 될 것이라는 약속이면 만족한다.
이렇게 interface
를 사용하여 약속을 정하는 것은 추상화에 사용하는 일반적인 기법중에 하나이다. 꼭 interface
나 abstract
클래스를 사용하지 않더라도 사용자의 시점에서 어떻게 하면 기능들을 추상화(단순화)하고 사용하는데 편리하게 만들 수 있을까 고민하는 것이 중요하다.
다음 포스트 : 상속
'IT노트 > C#' 카테고리의 다른 글
[C# 하루한개] 디자인 패턴 - 옵저버 패턴 (0) | 2022.01.08 |
---|---|
[C# 하루한개] 디자인 패턴 - 스트래티지 패턴 (0) | 2022.01.07 |
[C# 하루한개] 다형성 (객체 지향 언어의 4대 원칙) (0) | 2022.01.03 |
[C# 하루한개] 상속 (객체 지향 언어의 4대 원칙) (0) | 2022.01.02 |
[C# 하루한개] 캡슐화 (객체 지향 언어의 4대 원칙) (0) | 2021.12.31 |
[C# 하루한개] 클래스(Class) - 객체 지향 언어의 출발 (0) | 2021.12.30 |