정의

2020년 5월 30일 수정

이 글은 정의롭다 라고 할 때의 정의(justice)가 아니라, IT 개발과 관련해서 어떤 의미를 정할 때 사용하는 정의(definition) 개념을 다룬다.

대충 사용하는 의미

정의하다 = 코딩하다

구현의 의미에서도 다뤘던 것과 동일한 의미가 나와버린다. 사실 이는 현대적인 개념에서 과거와 달라졌기에 이렇게 쓴다고 무조건 틀린 말은 아니다.

물론 구현과 정의를 구분하기 위해 이 글을 쓰니 만큼 계속 글을 써 보자.

구세대 언어의 예

예를 들어 C 언어의 경우 정의는 아래와 같은 식이다.

int do_what(int param_a, char *param_b);

위와 같이 정의에는 실제로 어떤 식으로 동작하는지에 대한 기술이 없다. 이 부분은 구현이 담당하는 부분이기 때문이다.

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

여기서 실제 코드를 넣을 수 있는 중괄호가 등장한다.

즉 '구현'은 특정 기능을 구현하는 것이고, '정의'는 이 특정 코드의 인터페이스 혹은 사용 방법 등을 다른 코드나 사람에게 알려주기 위한 용도다.

따라서 정의는 문서화의 주축이다. 인터페이스를 정의하는 것은 그 인터페이스 사용법을 알려 주는 것이다. 정의가 존재하지 않으면 마치 존재하지 않는 기능이 되어버린다.

다만 이 설명은 구세대 언어에서 통하는 것이고 현대적인 언어에서는 약간 다르다.

현대적인 언어의 예

예를 들어 Swift로 구조체를 정의하는 방법을 보자.

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

위 코드는 정의와 구현을 하나의 파일에서 한 번에 모두 기술하고 있다.

그런데 최근에는 이런 식의 코드는 '정의되었다' 라고 표현하기도 한다. 실체화, 즉 인스턴스오브젝트 개념이 등장하면서 정의와 인스턴스 사이를 구분하게 된다. 그리고 정의를 만드는 것을 '구현' 한다고 표현하기도 한다.

예를 들어 위 코드를 코딩하는 것을 '구현하다' 라고 표현하고, 이렇게 구현된 코드는 '정의되었다' 라고 표현한다. 뭔가 미묘하지만 뭐… 그렇다.

결론

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

단지 현대적인 의미에서 '정의'가 더 큰(?) 힘을 얻게 되었다는 점은 좀 다르긴 하다.