728x90
반응형

지난 번 포스트에서 객체 지향 언어의 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를 사용하여 약속을 정하는 것은 추상화에 사용하는 일반적인 기법중에 하나이다. 꼭 interfaceabstract클래스를 사용하지 않더라도 사용자의 시점에서 어떻게 하면 기능들을 추상화(단순화)하고 사용하는데 편리하게 만들 수 있을까 고민하는 것이 중요하다.

다음 포스트 : 상속

728x90
반응형

+ Recent posts