이름 캡슐화

같은 이름이 둘이면 어떻게 될까?

문제

전역 이름이 부딪힙니다

큰 프로그램에는 전역 이름이 아주 많습니다. 전역 이름은 프로그램 어디서나 보이는 변수, 함수, 클래스의 이름입니다. 여러 곳에서 만든 코드를 합치면 같은 이름이 겹치기 쉽습니다. 그래서 이름을 논리적인 묶음으로 가를 수단이 필요합니다.

라이브러리는 가져다 쓰도록 만들어 둔 코드 묶음입니다. x, init, open은 예시 이름입니다.

이름 캡슐화

이름에 사는 곳을 줍니다

이름 캡슐화(naming encapsulation)는 이름에 새 스코프를 만들어 주는 수단입니다. 스코프는 이름이 보이는 코드 범위입니다. 같은 x라도 사는 곳이 다르면 부딪히지 않습니다. 밖에서 쓸 때는 어느 곳의 x인지 함께 적습니다.

A::x는 C++에서 'A 안의 x'를 적는 방법입니다. A와 B는 예시입니다.

C++의 네임스페이스

라이브러리마다 자기 공간

C++에서는 이 공간을 네임스페이스(namespace)라고 합니다. 라이브러리를 저마다 자기 네임스페이스에 넣어 두고, 밖에서 쓸 때는 네임스페이스 이름을 붙여 적습니다. C#에도 네임스페이스가 있습니다.

std는 C++ 표준 라이브러리의 네임스페이스이고, cout << 는 화면에 글을 내보내는 코드입니다. using std::cout; 은 이 강의가 따르는 교재의 Stack.cpp에 있는 줄입니다.

자바의 패키지

긴 이름, 또는 import

자바의 패키지(package)는 클래스 정의를 여럿 담습니다. 쓰는 쪽은 패키지 경로를 앞에 다 붙인 완전 한정 이름으로 쓰거나, import 선언을 해 두고 짧은 이름으로 씁니다.

java.util.*는 java.util 패키지에 든 클래스 전부라는 뜻입니다.

루비의 모듈

객체를 못 만드는 묶음

루비는 클래스도 이름 캡슐화 노릇을 하지만 모듈(module)이 따로 있습니다. 모듈은 주로 상수와 메서드를 모아 둡니다. 클래스와 달리 객체를 만들 수 없고, 물려받을 수 없고, 변수를 정의할 수도 없습니다. 쓸 때는 require로 불러옵니다.

require는 다른 파일의 코드를 불러오는 루비 명령입니다. 상수는 바뀌지 않는 값입니다. 물려받기(상속)는 11강에서 다룹니다.

10강을 돌아보면

묶음이 점점 커졌습니다

이번 강은 감추고 묶는 이야기였습니다. 서브프로그램은 방법을, 추상 자료형은 표현을 감춥니다. 캡슐화 구조는 그런 것들을 큰 단위로 묶고, 이름 캡슐화는 이름이 사는 곳을 가릅니다.

언어별 정리

같은 생각, 다른 문법

네 언어 모두 클래스로 표현과 연산을 묶고, 접근 제어로 표현을 감춥니다. 요소 타입을 비워 두는 방법은 C++의 템플릿, 자바 5.0과 C# 2005의 제네릭이었습니다.

다음 강의

11강은 여기에 상속과 다형성을 더합니다

10강 끝목록으로 돌아가기