구현

2023년 7월 20일 수정

IT, 특히 소프트웨어 개발 직종에서 '구현' 이라는 용어는 굉장히 자주 쓰인다.

구현(具現/具顯) (명사) 어떤 내용이 구체적인 사실로 나타나게 함.

'구현'의 사전적 의미는 위와 같다. 하지만 이 글에서 사전적 의미는 크게 의미가 없다.

대충 사용하는 의미

구현하다 = 개발하다, 코딩하다

IT 개발 직종에서 '구현'의 의미는 보통 위와 같이 이해되는 경우가 많다. '개발하다' 라는 의미는 약간 애매모호한 것 같지만, '코딩하다' 라는 의미는 약간은 직설적인 의미를 포함한 것 같다.

하지만 이건 그냥 대충 사용하는 의미일 뿐이다.

'구현'의 의미를 제대로 이해하려면 '정의'와 구분이 필요하다.

구세대 언어에서의 의미

예를 들어 C 언어의 경우 정의는 아래와 같은 식으로 주로 헤더(header) 파일에 적혀있다.

int do_what(int param_a, char *param_b);

위와 같이 정의에는 실제로 어떤 식으로 동작하는지에 대한 기술이 없다. 이 부분은 구현이 담당하는 부분이기 때문이다. 구현부는 .c 등의 별도의 파일에 이런 식으로 존재한다.

int do_what(int param_a, char *param_b)
{
    ...
}

여기서 실제 코드를 넣을 수 있는 중괄호와 동작 루틴이 등장한다.

즉 구현은 특정 함수의 기능을 실제로 개발하는 것이고, 정의는 이 특정 코드의 인터페이스 혹은 사용 방법 등을 알려주기 위한 용도다.

따라서 과거에는 헤더에 정의가 빠져 있으면 private 와 비슷한 느낌으로 사용되곤 했다.

조금 헷갈리는 주제로 전처리기(Preprocessor)를 이용한 매크로가 있다.

#define do_what(a, b) { ... }

마치 정의와 구현이 한 번에 이루어지는 것 처럼 착각될 수도 있는데, 매크로 전처리기는 컴파일 전에 미리 치환되는 부분이기 때문에 컴파일러 입장에서는 매크로 자체는 존재하지 않는 것과 마찬가지다. 따라서 구현이나 정의의 의미와는 다르게 생각하자.

현대적인 언어에서의 의미

현대적인 언어에서 '구현'이라는 말은 그저 "실제로 코딩하다"라는 의미에 가깝다. 예를 들어 Swift로 구조체를 정의하는 방법을 보자.

struct SomeStruct {
  var someValue = 0
  func doWhat() {
    ...
  }
}

Swift에는 헤더 개념이 없다. 대부분의 현대적인 언어, 예를 들자면 Python도 이런 식으로 헤더 파일 개념이 없다. 그래서 정의와 구현이 하나의 같은 개념으로 합쳐 진 것과 비슷하다.

물론 근본적으로는 정의와 구현이 한 번에 이루어진다 라는 것으로 이해하는 게 좋을 것 같다. 특히 최근의 추세는 구현은 정말 코딩하다는 의미가 되고 '정의'는 구현된 코드 그 자체가 정의되었다는 의미에서 사용된다.

현대적인 언어에서는 헤더에 인터페이스를 기재하지 않는 방식과는 다르게 접근 제어(Access Control)라는 방식으로 숨길 것을 코드로 마음껏 숨길 수 있다. 그래서 굳이 정의를 묘사할 헤더를 쓸 이유가 없기도 하다.

결론

정의와 구현은 일단은 다르다.

그냥 이거 한 줄이면 될 것 같다.