캡슐화 구조
한 줄 고쳤는데 프로그램 전체를 다시 컴파일해야 할까?
큰 프로그램
나누는 까닭은 둘
프로그램이 커지면 서브프로그램으로 나누는 것만으로는 모자랍니다. 관련된 것끼리 모아 정리할 수단이 필요하고, 전체보다 작은 단위로 컴파일할 수단도 필요합니다.
서브프로그램은 함수처럼 이름을 붙여 부르는 코드 묶음이고, 컴파일은 소스를 기계어로 번역하는 일입니다. 네모의 수는 예시입니다.
캡슐화
고친 단위만 다시 컴파일
논리적으로 관련된 서브프로그램을 한 단위로 묶고, 그 단위를 따로 컴파일할 수 있게 합니다. 이런 묶음이 캡슐화(encapsulation)입니다. 한 단위만 고쳤으면 그 단위만 다시 컴파일하면 됩니다.
따로 컴파일할 수 있는 단위를 컴파일 단위(compilation unit)라고 합니다. 언어가 이런 묶음을 만들라고 주는 구문이 캡슐화 구조(encapsulation construct)입니다.
가장 단순한 형태
서브프로그램 안에 서브프로그램
서브프로그램의 정의를, 그것을 쓰는 더 큰 서브프로그램 안에 넣는 방법입니다. 중첩 서브프로그램(nested subprogram)이라고 합니다. 관련된 코드가 한곳에 모입니다. 파이썬, 자바스크립트, 루비가 지원합니다.
C의 캡슐화
#include는 복사입니다
C에서는 서브프로그램을 담은 파일을 따로 컴파일할 수 있습니다. 밖에 알릴 선언은 헤더 파일(header file)에 모으고 구현은 다른 파일에 둡니다. #include를 적으면 전처리기가 헤더의 내용을 그 자리에 넣어 줍니다.
전처리기는 컴파일 전에 #으로 시작하는 줄대로 소스의 글자를 바꿔 놓는 것입니다. 파일 이름과 내용은 스택을 C로 옮겨 본 예시입니다.
C의 문제
어긋나도 모릅니다
헤더와 구현 파일은 따로 컴파일됩니다. 둘을 잇는 링커는 헤더의 선언과 구현의 타입이 맞는지 검사하지 않습니다. 또 포인터(메모리 칸의 위치를 담는 값)로 메모리에 직접 닿으면 감춘 데이터도 건드릴 수 있습니다.
링커는 따로 컴파일한 코드 조각을 실행 파일 하나로 잇는 도구입니다. 어긋난 두 선언은 예시입니다.
C++의 캡슐화
C++에는 길이 셋
C++는 C처럼 헤더 파일과 코드 파일을 나눌 수 있습니다. 클래스를 인터페이스로 삼아 프로토타입만 적어 두고 멤버의 정의를 다른 파일에 둘 수도 있습니다. 여기에 friend가 더해집니다.
프로토타입은 본문 없이 이름과 타입만 적은 선언입니다. 4편의 Stack.h와 Stack.cpp가 둘째 방법입니다.
C#의 어셈블리
파일 여럿이 하나로
C#의 캡슐화 단위는 어셈블리(assembly)입니다. 파일 여럿의 모음인데, 응용 프로그램에는 DLL 하나나 실행 파일 하나로 보입니다. 멤버에 internal을 붙이면 같은 어셈블리 안의 모든 클래스에서 보입니다.
DLL(동적 링크 라이브러리)은 실행 중인 프로그램에 따로 연결되는 클래스와 메서드의 모음입니다. 모듈은 따로 컴파일할 수 있는 코드 단위입니다.
다음 편