집합에서 범주로 넘어가며 곱, 합, 보편 성질, 쌍대성, 그리고 범주의 기본 정의를 그림과 함께 설명합니다.
이 장에서는 집합론의 몇 가지 구성을 조금 더 살펴보겠지만, 동시에 그에 대응하는 범주론적 개념도 도입하여 범주 자체의 개념을 부드럽게 소개하려고 합니다.
그 작업이 끝나면, 실제로 집합론에 의존하지 않고도 범주를 처음부터 정의하려고 시도해 볼 것입니다. 거의 성공할 것입니다.
이전 장에서 우리는 어떤 다른 집합들의 원소들로 이루어진 복합 원소를 갖는 집합을 만드는 방법이 필요했습니다. 예를 들어 수학적 함수를 논의할 때, 하나의 인자만 받는 함수만 공식화할 수 있었기 때문에 를 정의할 수 없었습니다. 마찬가지로 프로그래밍 언어의 원시 타입인 Char 와 Number 를 소개할 때도, 우리가 실제로 사용하는 대부분의 타입은 복합 타입이라고 언급했습니다. 그렇다면 그런 것들은 어떻게 만들까요?
그래서, 집합 (를 포함하는)과 집합 (를 포함하는)을 생각해 봅시다.
집합 과 의 데카르트 곱 (또는 튜플) (라고 표기)은, 집합 의 원소 하나와 집합 의 원소 하나를 담고 있는 순서쌍 의 집합입니다. 또는 형식적으로 말하면: 여기서 는 “의 원소이다”를 뜻합니다.
과제 1: 왜 이것을 곱이라고 부를까요? 힌트: 원소가 몇 개 있나요?
자연스럽게, 곱에는 두 개의 함수가 딸려 옵니다. 각 속성에 하나씩 있으며, 쌍을 받아 그 속성의 값을 꺼냅니다. 즉 와 이고, 이를 곱의 사영 이라고 부릅니다. (프로그래밍 용어로는 이것들을 “getter”라고 부를 것입니다) — 구성 값을 다시 꺼내 오는 함수들입니다.
두 개가 아니라 세 개의 집합을 하나의 곱으로 묶고 싶은 경우도 있습니다. (예: ) 이것은 첫 번째와 두 번째를 먼저 곱으로 묶고, 그 결과를 세 번째 집합과 다시 곱으로 묶어 만들 수 있습니다. (그러면 가 됩니다.)
세 집합의 세 겹 곱을 만드는 다른 방법도 있습니다. 두 번째와 세 번째를 먼저 묶고, 그 결과를 첫 번째와 묶는 것입니다. (즉 입니다.) 하지만 실제로는 어느 쪽을 쓰든 중요하지 않습니다. 결과는 서로 동형이기 때문입니다.
이 동형은 함수 합성의 정의에서 본 적이 있을지도 모릅니다. 이것은 데카르트 곱 연산이 함수 합성과 마찬가지로 결합적 이라는 뜻입니다.
이전 장에서 우리는 프로그래밍 언어의 여러 개념과 집합론 사이의 대응을 확인했습니다. 집합은 타입과 비슷하고, 함수는 메서드나 서브루틴과 비슷합니다. 이 그림은 곱을 통해 완성됩니다. 곱은 간소화된 클래스 (또는 레코드, 구조체)와 같습니다. 곱을 이루는 집합들은 클래스의 속성 (또는 멤버)에 대응하고, 그것들에 접근하는 함수는 프로그래머가 getter 메서드 라고 부르는 것과 비슷합니다. 예를 들어 객체지향 프로그래밍에서 유명한 Person 클래스가 name 과 age 필드를 가진다고 할 때, 그것은 문자열 집합과 숫자 집합의 곱에 지나지 않습니다. 두 개보다 많은 값을 가진 객체는 중첩된 곱의 합성으로 표현할 수 있습니다. (예를 들어 멤버가 , , 인 레코드는 중첩 튜플 (, (, )) 또는 더 형식적으로 로 표현할 수 있습니다.)
곱은 하나보다 많은 인자를 받는 함수를 표현하는 데도 쓸 수 있습니다. (실제로 ML 계열 언어들 가운데 일부는 다중 인자 함수를 이렇게 구현합니다.) 예를 들어 “plus”는 두 숫자의 곱집합에서 숫자 집합으로 가는 함수입니다. 즉, 입니다.
참고로, 이런 함수들 — 같은 타입의 객체 두 개를 받아 같은 타입의 세 번째 객체를 돌려주는 함수들 — 을 연산 이라고 부릅니다.
곱은 앞에서 말했듯이 순서 있는 쌍의 집합입니다. (형식적으로는 ) 그러므로 곱을 정의하려면 순서쌍의 개념을 정의해야 합니다. 그렇다면 어떻게 해야 할까요?
원소들의 순서쌍은 단순히 그 두 원소를 담은 집합이 아니라는 점에 유의하세요. (그것은 무순서쌍 입니다.) 순서쌍에는 어떤 객체가 첫 번째이고 어떤 객체가 두 번째인지에 대한 정보도 들어 있습니다. 어떤 수학 연산들(예: 덧셈)은 순서를 신경 쓰지 않지만, 다른 연산들(예: 뺄셈)은 순서를 신경 씁니다. 그리고 프로그래밍에서는 객체의 각 속성에 이름을 붙일 수 있는데, 이것도 같은 목적을 이룹니다. 즉, 객체의 아무 속성이나가 아니라 특정 속성에 접근할 수 있게 해 줍니다.
그렇다면 순서쌍이 집합이 아니라면, 우리가 그것을 사용하려면 집합을 정의할 때처럼 “원시” 타입으로 따로 정의해야 한다는 뜻일까요? 그럴 수도 있지만, 다른 접근법도 있습니다. 순서쌍과 동형인 구조를 집합만을 사용해 정의할 수 있습니다. 수학자들은 이를 위한 여러 기발한 방법을 고안해 냈습니다. 첫 번째는 1914년에 Norbert Wiener가 제안한 것입니다. 공집합이 유일하다는 사실을 영리하게 이용하는 점에 주목하세요.
다음 것은 같은 해에 Felix Hausdorff가 제안했습니다. 이것을 사용하려면 먼저 와 를 정의해야 합니다.
1921년에 Kazimierz Kuratowski가 제안한 이 정의는, 쌍의 구성요소만 사용합니다.
이 모든 정의는 곱의 개별 원소들 속으로 확대해서 들어가는 방식으로 작동합니다. 이것을 우리는 정의에 대한 저수준 접근, 즉 곱의 내부 구조에 초점을 맞추는 접근이라고 생각할 수 있습니다. 하지만 범주론의 관점에서 더 흥미로운 것은 고수준 접근입니다. 즉, 확대해서 들여다보는 대신 축소해서 멀리서 보고, 집합의 내용은 완전히 무시한 채 오직 곱과 관련된 함수들에만 초점을 맞추는 것입니다.
이제 우리는 곱집합에 대한 범주론적 정의를 살펴보겠습니다. 이 정의를 외부적 이라고 부르는 이유는, 그것이 객체가 가진 내부 구조가 아니라 객체의 외적 행태 — 즉 그 객체로 들어오고 나가는 함수들에 의해 규정되는 행태 — 에 기반하기 때문입니다. 그리고 이것은 외적 도식들과 강하게 연결되어 있습니다.
이런 정의는 정의하려는 객체에 대한 개념적 모델에서 출발합니다. 예를 들어 우리는 곱이 다음과 같은 것이라고 합의할 수 있습니다.
와 의 곱은, 의 원소 하나와 의 원소 하나를 담고 있으며, 그 이상은 아무것도 없다.
이제 이 개념적 모델에 따라, 두 집합이 주어졌을 때, 그것들로부터 오고 가는 함수들을 살펴봄으로써 어떤 집합이 그들의 곱인지 정확히 집어내는 방법을 고안해야 합니다.
우리는 와 의 곱이 의 원소 하나와 의 원소 하나를 담고 있다고 말했습니다. 그렇다면 이 기준을 만족하기 위해 반드시 존재해야 하는 함수는 무엇일까요? 물론 그것은 사영입니다. 곱의 두 원소를 다시 꺼내는 함수 와 입니다. 그것들이 없다면 곱이 무슨 의미가 있겠습니까?
이제 (반쯤) 외적 관점으로 전환하면, 이 도식만으로도 곱이 무엇인지에 대한 어떤 정의가 이미 주어집니다.
와 의 곱, 즉 는, 함수 와 가 존재하는 어떤 집합이다…
다시 말해, 어떤 집합 에 대해 함수 와 가 존재한다면, 는 잠재적으로 와 같을 수 있습니다.
하지만 이 정의는 완전하지 않습니다. 왜냐하면 와 의 곱은 그런 함수들을 정의할 수 있는 유일한 집합이 아니기 때문입니다. 예를 들어 각 원소가 세 값을 가지는 삼중쌍의 집합도 자격이 있습니다. 그것은 곱과 비슷하지만 원소를 세 개 가집니다. 또한 와 로 가는 몇몇 함수를 우연히 갖는 다른 어떤 집합도, 이 정의에 따르면 “가짜 곱”이 됩니다.
이런 가짜들을 드러내기 위해 우리는 다시 우리의 정신적 모델로 돌아갑니다. 가 의 원소 하나와 의 원소 하나를 담고 그 이상은 아무것도 없다 고 했던 것을 기억하세요. 이것은 이런 가짜들 각각이 로 변환될 수 있음을 말해 줍니다. 즉, 화살표 가 존재합니다. 왜일까요? 앞서 말했듯이, 이런 집합들은 모두 곱보다 더 복잡한 구조이기 때문입니다. 더 복잡한 구조를 더 단순한 구조로 바꾸는 함수는 언제나 만들 수 있습니다. 그냥 정보를 버리면 되기 때문입니다.
우리는 이 화살표가 모든 가짜 곱에 대해 존재함을 알 수 있습니다. 왜냐하면 가짜 집합 의 임의의 원소는 의 원소 하나와 의 원소 하나, 그리고 추가 정보 를 담고 있기 때문입니다. 그러면 집합 안에는 같은 의 원소와 같은 의 원소를 담고 있는 원소가 존재합니다. (그리고 아무것도 더 담고 있지 않습니다.) 따라서 그 추가 정보를 버리는 함수 를 정의할 수 있습니다.
그리고 더 흥미로운 점은, 가 가짜 곱인 이유가 되는 함수 와 역시 이 함수 를 통해 정의될 수 있다는 것입니다.
예를 들어 삼중쌍의 집합과, 삼중쌍을 곱으로 바꾸는 표준 함수를 생각해 봅시다. 이 함수는 세 번째 원소 를 그냥 제거합니다. 그러면 가 와 에 연결되는 것은 오직 이 함수 때문 이라는 사실을 알 수 있습니다. 즉, 이 함수를 라고 부르고, 와 를 곱의 사영 (곱의 원소 와 를 꺼내는 화살표)이라고 하면, 삼중쌍을 와 에 연결하는 화살표들은 단지 합성 와 일 뿐입니다.
좀 더 형식적으로, 우리는 곱을 다음과 같이 정의할 수 있습니다.
와 의 곱, 즉 는 다음을 만족하는 집합이다:
- 두 개의 “사영” 함수 와 가 존재한다.
- 같은 종류의 사영 함수 ( 와 )를 가지는 임의의 가짜 곱 에 대해, 타입 시그니처가 인 유일한 함수 가 존재해야 하며, 이 함수는 가짜 곱을 진짜 곱으로 바꾸고, 가짜 곱의 사영은 와 곱의 사영들을 합성한 것과 같아야 한다.
어떤 주어진 집합이 곱임을 보이려면, 기준에 맞는 함수 의 공식을 제시하면 됩니다. 함수 와 가 주어졌을 때, 함수 는 두 함수의 결과로 쌍을 만드는 함수가 됩니다. 그래서 가 의 원소라면, 입니다.
따라서 함수 는 모든 객체 에 대해 존재합니다. 다시 말해, 로 어떤 객체를 택하든 이 도식은 가환합니다. (아, 또 이 도식이군요.)
이 책에서 비슷한 도식을 많이 보게 될 것입니다. 범주론에서는 어떤 객체가 가질 수 있는 성질을 정의할 때, 흔히 그 객체와 비슷한 모든 객체가 그 객체로 변환될 수 있도록 하는 구조를 정의합니다. 이것을 보편 성질 이라고 부르지만, (아직 범주론이 무엇인지조차 말하지 않았으니) 지금은 자세히 들어가기에는 이릅니다.
한 가지 짚고 넘어가야 할 점은, 이 정의가 곱과 동형인 집합들을 배제하지 않는다는 것입니다. 보편 성질로 사물을 표현할 때, 동형은 동등성처럼 취급됩니다. 우리는 곱이 “동형을 제외하고는 유일하다”고 말합니다. 이것은 “실제로는 하나보다 많지만, 모두 서로 동형이므로 신경 쓰지 않는다”는 뜻의 줄임말입니다.
이것은 프로그래밍에서도, 특히 고수준에서 작업할 때 자주 취하는 관점과 같습니다. 리스트나 쌍을 구현하는 방식이 여러 가지일 수도 있고, 어떤 데이터를 저장하는 형식도 여러 가지일 수 있습니다. 하지만 한 쪽을 다른 쪽으로 (그리고 다시 되돌려) 변환할 수만 있다면, 우리에게 그것들은 모두 같은 것입니다.
이제 곱과 꽤 비슷하면서도 동시에 매우 다른 구조를 살펴보겠습니다. 곱과 비슷한 이유는, 이것 역시 두 집합 사이의 관계이며, 그 둘을 구조를 지우지 않은 채 하나로 합칠 수 있게 해 주기 때문입니다. 그러나 동시에 매우 다른 이유는, 전혀 다른 종류의 관계를 담고 있기 때문입니다. 곱은 두 집합 사이의 그리고(and) 관계를 담는 반면, 합은 또는(or) 관계를 담습니다.
두 집합 과 의 합, 즉 는 첫 번째 집합의 모든 원소와 두 번째 집합의 모든 원소를 함께 담는 집합입니다.
우리는 여기서 또는 이라는 논리 구조와의 연결을 바로 볼 수 있습니다. 예를 들어, 부모는 아이의 어머니이거나 아버지이므로, 모든 부모의 집합은 어머니들의 집합과 아버지들의 집합의 합입니다. 즉, 입니다.
곱의 경우처럼, 합을 집합만으로 표현하는 일도 그렇게 간단하지 않습니다. 예를 들어 어떤 객체가 두 집합 모두의 원소라면, 그것은 합 안에 두 번 등장하게 됩니다. 그러나 집합은 같은 원소를 두 번 담을 수 없으므로 이것은 허용되지 않습니다.
곱과 마찬가지로, 해결책은 약간의 추가 구조를 넣는 것입니다.
그리고 곱과 마찬가지로, 합도 집합만을 사용해 표현하는 저수준 방식이 있습니다. 우연히도, 여기서는 쌍을 사용할 수 있습니다.
이미 짐작했겠지만, 흥미로운 부분은 함수로 두 집합의 합을 표현하는 것입니다. 그러기 위해서는 다시 정의의 개념적 부분으로 돌아가야 합니다. 우리는 합이 두 사물 사이의 또는 관계를 표현한다고 말했습니다.
모든 또는 관계가 갖는 성질 가운데 하나는, 어떤 것이 이면 그것은 또한 이기도 하다는 것입니다. (참고로 기호 는 또는 을 뜻합니다.) 예를 들어 내 머리카락이 갈색 이면, 내 머리카락은 또한 금발이거나 갈색 이기도 합니다. 이것이 바로 또는 의 의미입니다. 그렇지요? 이 성질은 함수로 표현할 수 있습니다. 정확히는 두 개의 함수로요. 합 관계에 참여하는 각 집합에 대해 하나씩 있습니다. (예를 들어 부모가 어머니이거나 아버지라면, 함수 와 가 분명 존재합니다.)
이미 눈치챘겠지만, 이 정의는 이전 절의 곱 정의와 꽤 비슷합니다. 차이는 화살표의 방향이 뒤집혔다는 점입니다. 그리고 유사성은 여기서 끝나지 않습니다. 곱의 경우처럼, 여기에도 가짜 합으로 생각할 수 있는 집합들이 있습니다. 이런 함수들이 존재하긴 하지만, 추가 정보도 함께 담고 있는 집합들입니다.
이 모든 집합은 단순한 합보다 더 모호한 관계를 표현하므로, 이런 집합이 주어졌을 때 그것을 진짜 합과 구분해 주는 유일한 함수가 존재합니다. 유일한 차이는, 곱을 정의할 때와 달리 이번에는 그 함수가 합에서 가짜로 향한다는 점입니다.
정의는 다음과 같습니다.
와 의 합, 즉 는 다음을 만족하는 집합이다:
- 두 개의 “사영” 함수 와 가 존재한다.
- 같은 종류의 사영 함수 ( 와 )를 가지는 임의의 가짜 합 에 대해, 타입 시그니처가 인 유일한 함수 가 존재해야 하며, 이 함수는 진짜 합을 가짜 합으로 바꾸고, 가짜 합의 사영은 와 사영들의 합성과 같아야 한다.
곱과 합의 개념은 내부 도식으로 보면 이미 어느 정도 비슷해 보일 수 있습니다. 하지만 외적 관점은 이 유사성을 정확하게 드러냅니다. 두 도식은 사실 하나의 같은 도식이며, 단지 화살표만 뒤집혀 있습니다. 다대일 관계가 일대다 관계가 되고, 그 반대도 마찬가지입니다.
두 구조를 정의하는 보편 성질도 같습니다. 라는 합이 있으면, 같은 각 가짜 합에 대해 자명한 함수 가 존재합니다.
그리고 기억한다면, 곱의 경우에는 화살표가 반대 방향으로 갔습니다. 곱에 대한 대응 예시는 함수 일 것입니다.
이 사실은 곱 과 합 이라는 개념 사이에, 다른 방식으로는 잘 드러나지 않는 깊은 연결을 드러냅니다. 둘은 서로의 반대입니다. 곱 은 합 의 반대이고, 합 은 곱 의 반대입니다.
범주론에서는 이런 관계를 갖는 개념들이 서로 쌍대 라고 말합니다. 따라서 곱 과 합 의 개념은 서로 쌍대입니다. 이것이 범주론 맥락에서 합이 역곱 또는 줄여서 쌍대곱(coproduct) 으로 불리는 이유입니다. 이런 명명 규칙은 범주론의 모든 쌍대 개념에 사용됩니다.
지금까지 이 책에서 우리는 집합의 원소들을 들여다보지 않고, 오직 함수와 외적 도식만 사용해서 집합론적 구조를 정의하는 놀라운 방법들을 보았습니다.
첫 장에서는 이 도식으로 함수와 함수 합성을 정의했습니다.
그리고 이제 곱과 합도 정의했습니다.
더 놀라운 점은, 범주론의 선구자 Francis William Lawvere가 발견했듯이, 함수의 개념만을 바탕으로 집합론 전체 를 정의할 수 있다는 것입니다.
전통적으로 집합론에서 모든 것은 집합 과 원소 라는 두 개념으로 정의됩니다. 따라서 그것을 집합 과 함수 로 정의하려면, 집합의 원소 라는 개념을 함수로 정의해야 합니다.
이를 위해 우리는 한원소 집합을 사용할 것입니다.
좋습니다. 먼저 우리가 기술하고 싶은 임의의 집합 하나를 잡아 봅시다.
이제 한원소 집합에서 그 임의의 집합으로 가는 함수들을 살펴봅시다.
각 원소마다 정확히 하나의 함수가 존재한다는 것은 쉽게 볼 수 있습니다. 따라서 우리는 이렇게 말할 수 있습니다.
임의의 집합의 각 원소는 어떤 함수와 동형이다. (여기서 는 한원소 집합을 뜻한다.)
따라서 우리가 집합의 “원소”라고 부르는 것은, 한원소 집합에서 그 집합으로 가는 함수들입니다.
이제 함수에 기반한 집합 원소 의 정의를 얻었으니, 집합의 원소들을 외적 도식으로 그려 볼 수 있습니다.
하지만 이 도식은 아직 완전히 외적이지 않습니다. 왜냐하면 그것이 한원소 집합, 즉 하나의 원소 를 가진 집합이라는 개념에 의존하기 때문입니다. 더구나 이것은 전체 정의를 순환적으로 만듭니다. 원소의 개념 없이 한 원소 집합이라는 개념을 정의할 수 없기 때문입니다.
이 어려움을 피하기 위해, 우리는 함수만을 사용해 한원소 집합을 정의하는 방법을 고안합니다. 곱과 합에서 했던 것과 같은 방식으로, 한원소 집합이 가진 고유한 성질을 사용합니다. 특히, 임의의 다른 집합에서 한원소 집합으로 가는 함수는 정확히 하나뿐입니다. 즉, 가 한원소 집합이라면 모든 객체 에 대해 정확히 하나의 함수 가 있습니다. 다시 말해 입니다. (여기서 는 “유일하게 존재한다”를 뜻합니다.)
놀랍게도 이 성질은 한원소 집합을 유일하게 규정합니다. 즉, 이 성질을 갖는 다른 집합은 없고, 한원소 집합과 동형인 집합들만이 있습니다. 이유는 간단합니다. 만약 이 성질을 가진 두 집합이 있다면, 그 두 집합 사이에도 서로 유일한 함수들이 존재하므로, 둘은 서로 동형이어야 하기 때문입니다. 더 형식적으로, 와 라는 두 집합이 있고, 둘 다 이 성질 (“임의의 다른 집합에서 이 집합으로 가는 함수가 정확히 하나”)을 만족한다면, 도 성립합니다.
그리고 한원소 집합 외에는 이 성질을 갖는 다른 집합이 없으므로, 우리는 이것을 한원소 집합의 정의로 사용할 수 있습니다.
한원소 집합은, 임의의 다른 집합에서 그 집합으로 가는 유일한 함수가 존재하는 집합이다. 즉, 라면, 는 한원소 집합이다.
이로써 우리는 한원소 집합의 완전히 외적인 정의를 (동형까지는 허용해서) 얻게 되었고, 따라서 집합 원소의 정의도 얻게 됩니다. 어떤 집합의 원소들은 그저 한원소 집합에서 그 집합으로 가는 함수들입니다.
이 성질로부터 한원소 집합이 정확히 하나의 원소를 가진다는 사실이 따라 나온다는 점에 주목하세요. 이것은 우리의 정의가 올바르다는 것을 확인해 줍니다.
과제 2: 왜 정확히 그런 결론이 따라 나올까요? (정의를 확인해 보세요.)
공집합은 물론 원소가 없는 집합입니다. 하지만 원소를 언급하지 않고 이것을 어떻게 말할 수 있을까요?
이전 장에서 우리는 공집합의 흥미로운 성질 하나를 보았습니다.
공집합에서 임의의 다른 집합으로 가는 함수는 유일하다.
그리고 다시 말해, 공집합만이 이 성질을 갖기 때문에, 위의 진술을 뒤집어서 정의로 사용할 수 있습니다.
공집합은, 그 집합에서 임의의 다른 집합으로 가는 함수가 존재하는 집합이다.
과제 3: 공집합에서 가는 함수는 왜 유일할까요?
눈치 빠른 독자라면 시초 객체와 종말 객체를 묘사하는 도식들 사이의 유사성을 알아챌 것입니다. (물론 이 두 개념도 서로 쌍대입니다.)
그리고 더더욱 눈치 빠른 독자들은 (여러분, 제발 조금만 조용히요. 너무 눈치가 빠르잖아요) 곱/쌍대곱 도식과 시초/종말 객체 도식 사이의 유사성도 알아챌 수 있을 것입니다.
이 도식들의 유사성은, 사물을 정의하는 비슷한 일반적 접근에서 옵니다. 두 경우 모두, 어떤 개념을 유용하게 만드는 성질을 찾아내고, 그 개념이 그 성질을 갖도록 정의합니다*.
집합 원소에 대한 함수적 정의를 본 뒤에는 다음과 같은 질문을 하게 될지도 모릅니다. 원소가 함수로 표현된다면, 주어진 함수를 집합의 원소에 적용 하여 (그리고 다른 집합의 원소를 얻어) 사용하는 것은 어떻게 표현할까요?
답은 놀라울 정도로 간단합니다. 집합에서 어떤 원소를 선택하는 것 은 한원소 집합에서 그 원소로 가는 함수를 만드는 것과 같습니다.
그리고 원소에 함수를 적용하는 것 은, 그 원소를 나타내는 함수를 우리가 적용하려는 함수와 합성하는 것 과 같습니다.
그 결과는, 적용된 함수가 반환하는 원소를 나타내는 함수입니다.
이것은 Lawvere의 집합의 범주에 대한 초등 이론(ETCS)의 맛보기였습니다. ETCS는 함수의 개념만 사용하여 집합론을 엄밀하게 정의하는 이론입니다. (ZFC 집합론과 동등합니다.)
우리는 이 이론 전체를 다룰 수도 있고, 필요한 공리들을 모두 나열할 수도 있습니다. 하지만 지금은 아마도, 애초에 왜 이런 것이 필요한지를 이해하는 편이 더 중요할 것입니다.
짧은 대답은 이렇습니다. 전통적인 정의보다 더 일반적이기 때문에, 이 새로운 정의는 정확히 집합은 아니지만 어떤 점에서는 집합과 비슷한 객체들에도 적용됩니다.
이것을 전혀 다른 객체들의 범주 에 적용한다고 말할 수도 있습니다. (넌지시, 넌지시.)
이제 범주가 무엇인지 볼 때가 된 것 같습니다. 짧게 정의하면 이렇습니다. 범주는 객체들의 모임 (집합이 그 예입니다)과, 한 객체에서 다른 객체로 가는 사상들의 모임으로 이루어지며, 이 사상들은 함수처럼 행동하고 서로 합성 가능합니다. 범주에 대해 훨씬 더 많은 말을 할 수도 있고, 형식적 정의도 제시할 수 있지만, 지금은 집합이 범주의 한 예라는 것, 그리고 범주론적 객체는 집합과 비슷하지만 우리는 그 원소들 을 보지 않는다는 것만 기억하면 충분합니다. 즉, 범주론적 개념은 외적 도식으로 포착되고, 엄밀히 집합론적인 개념은 내부 도식으로 포착될 수 있습니다.
집합의 영역 안에 있을 때, 우리는 각 집합을 개별 원소들의 모음으로 볼 수 있습니다. 범주론에서는 그런 개념이 없습니다. 하지만 그 개념을 없애면, 합집합과 곱집합 같은 개념들을 전혀 다른, 더 일반적인 방식으로 정의할 수 있게 됩니다. 게다가 지난 절의 요령들을 쓰면 언제든 다시 집합론으로 “돌아갈” 방법도 있습니다.
| Category Theory | Set theory | Programming Languages |
|---|---|---|
| Category | N/A | N/A |
| Objects and Morphisms | Sets and Functions | Classes and methods |
| N/A | Element | Object |
집합론의 렌즈를 통해 본 세계와 범주론의 렌즈를 통해 본 세계 사이에는, 어딘가 이상한 듯하면서도 (하지만 사실은 완전히 논리적인) 대칭성, 혹은 어쩌면 “역대칭성”이 있다는 점에 주목하세요.
| Category Theory | Set theory |
|---|---|
| Category | N/A |
| Objects and Morphisms | Sets and functions |
| N/A | Element |
외적 도식으로 전환하면 우리는 개별적인 것들 (우리 집합의 원소들)을 보지 못하게 되지만, 대신 한 걸음 물러서서 이전에는 갇혀 있던 전체 우주를 볼 수 있게 됩니다. 집합 전체의 세계를 하나의 범주로 생각할 수 있는 것처럼, 프로그래밍 언어도 하나의 범주로 생각할 수 있습니다. 범주의 개념은 이런 구조들과 다른 구조들 사이의 유사성을 찾고 분석할 수 있게 해 줍니다.
“Object”라는 단어는 프로그래밍 언어와 범주론에서 모두 쓰이지만, 의미는 완전히 다릅니다. 범주론적 객체는 프로그래밍 언어 이론에서의 타입 또는 클래스 에 해당합니다.
계속하기 전에 한 가지 언급해 두겠습니다. 지난 절에서는 범주론과 집합론이 서로 경쟁 관계에 있는 것처럼 보이게 했을지도 모릅니다. 만약 범주론과 집합론이 상대성 이론과 양자역학처럼 구체적 현상을 설명하려는 이론이었다면, 그런 생각이 어느 정도 맞았을지도 모릅니다. 구체적 이론은 주로 세계의 기술 로서 고안되므로, 그런 이론들이 어떤 위계 관계로 연결되는 것은 자연스럽습니다.
반대로, 범주론과 집합론 같은 추상 이론은 그런 기술을 표현하기 위한 언어 에 더 가깝습니다. 물론 이들도 서로 연결될 수 있고, 실제로 하나 이상의 방식으로 연결되어 있습니다. 하지만 둘 사이에 본질적인 위계 관계는 없기 때문에, 어느 쪽이 더 기초적인지, 혹은 더 일반적인지를 두고 논쟁하는 것은 닭과 달걀의 문제에 불과합니다. 다음 장에서 그것을 보게 될 것입니다.
“집합의 모든 원소를 무시하고 그 집합의 정의로 작업함으로써 집합의 모든 원소를 다룬다.” — Dijkstra (“On the cruelty of really teaching computing science”에서)
이 책을 포함해 모든 범주론 책은 집합론 이야기로 시작합니다. 돌이켜 보면, 왜 그런지 정말 모르겠습니다. 어떤 주제를 다루는 책이 대개는 먼저 전혀 다른 주제 를 소개하고 나서야 정작 본론으로 들어가지는 않으니까요. 아마 집합부터 시작하는 방식이 범주를 소개하는 가장 좋은 방법일지도 모릅니다. 혹은 사람들이 다 그렇게 하니까 그냥 그렇게 하는 것일 수도 있습니다. 하지만 한 가지는 분명합니다. 범주를 이해하기 위해 반드시 집합을 공부할 필요는 없습니다. 그래서 이제 처음부터 다시 시작해서, 범주를 기초 개념으로 이야기해 보고 싶습니다. 그러니 이것이 새 책이라고 가정해 봅시다. (혹시 다른 사람에게 헌정할 수 있으려나 궁금하네요.)
범주는 객체(사물)들의 모임이며, 여기서 “사물”은 여러분이 원하는 무엇이든 될 수 있습니다. 예를 들어, 다음의 알록달록한 회색 공들을 생각해 봅시다.
범주는 객체들의 모음과 더불어, 객체들을 서로 연결하는 몇몇 화살표들로 이루어집니다. 우리는 이 화살표들을 사상 이라고 부릅니다. (지금은 함수라고 생각해도 됩니다.)
잠깐만요. 모든 집합이 하나의 범주를 이룬다고 말했는데, 동시에 하나의 집합 자체도 그 자체로 하나의 범주로 볼 수 있다고 했습니다. (단지 사상이 없는 범주일 뿐입니다.) 이것은 사실이며, 범주론의 매우 특징적인 면이기도 합니다. 하나의 구조가 여러 서로 다른 각도에서 검토될 수 있고, 종종 재귀적인 방식으로 여러 역할을 할 수 있습니다.
하지만 이 특정한 동치 — 집합을 사상이 없는 범주로 보는 것 — 는 실제로는 거의 쓸모가 없습니다. 그것이 어떤 의미에서 틀려서가 아니라, 범주론은 사상에 관한 학문 이기 때문입니다. 집합론에서 화살표가 그저 출발점과 도착점 역할을 하는 집합들을 잇는 연결에 지나지 않는다면, 범주론에서는 오히려 객체 가 다른 객체들과 그것을 연결하는 화살표들의 출발점과 도착점에 지나지 않습니다. 그래서 위의 그림에서는 객체가 아니라 화살표에 색이 칠해져 있습니다. 제 생각에는 집합의 범주는 정말로 함수의 범주 라고 불려야 합니다.
이와 관련해서, 범주의 객체들은 여러 개의 화살표로 서로 연결될 수 있으며, 출발 집합과 도착 집합이 같다고 해서 화살표들이 결코 동등해지는 것은 아니라는 점에 주목하세요.
왜 그런지는 집합론으로 잠깐만 돌아가 보면 아주 분명합니다. (좋아요, 아마 가끔은 정말 돌아가야 하나 봅니다.) 예를 들어 숫자에서 불리언으로 가는 함수는 무한히 많고, 입력 타입과 출력 타입이 같다는 사실 (혹은 우리가 말하길 좋아하는 타입 시그니처 가 같다는 사실)은 그것들을 결코 서로 동등하게 만들지 않습니다.
두 객체 사이에 (각 방향마다) 사상이 하나만 있는 범주의 종류도 있지만, 그것은 나중에 이야기하겠습니다.
어떤 구조가 범주라고 불리기 위한 가장 중요한 요구사항은 두 사상이 세 번째 사상을 만들 수 있어야 한다 는 것, 다시 말해 사상들이 합성 가능 해야 한다는 것입니다.
세 개의 객체와 그 사이의 연속된 두 화살표가 주어지면, 우리는 세 번째 화살표를 만들 수 있습니다. (집합론에서는 이것이 앞의 두 함수를 차례로 적용하는 것과 같습니다.)
형식적으로 이 요구사항은, 보통 기호 로 표기되는 어떤 연산 이 존재해야 한다는 뜻입니다. 따라서 각 사상 쌍 와 에 대해, 사상 가 존재합니다.
기억한다면, 집합론에서 우리는 다른 종류의 관계 대신 함수를 택했는데, 그 이유는 함수가 합성 가능하기 때문이었습니다. 여기서는 그냥 사상이라는 개념을 발명하고, 그것이 합성 가능하다고 정의합니다. (마치 우리가 (쌍대)곱을 만들고 나서, 나중에 공집합과 한원소 집합을 정의했던 것처럼요.) 이 정의가 우리를 어디로 데려가는지 봅시다.
함수 합성은 오른쪽에서 왼쪽으로 읽는다는 점에 주의하세요. 예를 들어 를 적용한 다음 를 적용하는 것은 라고 쓰며, 반대로 쓰지 않습니다. ( 를 줄여 쓴 것이라고 생각해도 됩니다.) 어떤 사람들에게는 “\circ”를 “after”라고 읽는 것이 도움이 될 수 있습니다. 예를 들어 처럼요.
수를 가지려면 0이 있어야 합니다. 범주론의 0에 해당하는 것은 각 객체에 대한 “항등 사상”입니다. 간단히 말해, 이것은 아무 일도 하지 않는 사상입니다.
이 사상을 따로 표시하는 것은 중요합니다. 왜냐하면 (다시 한 번 이 매우 중요하고, 이제는 아마 매우 지루할 정도로 익숙한 말을 하자면) 같은 객체에서 자기 자신으로 가는 사상도 많을 수 있기 때문입니다. 예를 들어 집합의 범주에서는 숫자 집합을 출발점이자 도착점으로 하는 많은 함수들을 다룹니다. 예컨대 , , , 같은 것들이 있고, 이들은 전혀 항등 사상이 아닙니다.
어떤 구조가 범주라고 불리려면, 각 객체마다 항등 사상이 있어야 합니다. 이것을 항등 법칙 이라고 합니다.
과제 4: 집합의 범주에서 항등 사상은 무엇일까요?
합성이 특별한 이유는, 적절한 시그니처를 가진 두 사상을 취해 세 번째 사상을 만들 수 있기 때문만이 아닙니다. 이것을 끝없이 반복할 수 있기 때문이기도 합니다. 즉, 각 화살표의 도착 객체가 다음 화살표의 출발 객체가 되는 일련의 연속된 화살표들이 있을 때, 우리는 그것들 모두를 연속 적용한 것과 같은 하나의 화살표를 그릴 수 있습니다. (정확히 하나입니다.)
위 정의를 자세히 살펴보면, 그것은 다음 공식의 반복 적용으로 환원될 수 있음을 알 수 있습니다. 세 객체와 그 사이의 두 사상 이 주어졌을 때, 와 를 합친 뒤 그 결과를 와 합치는 것과, 를 와 의 결과에 합치는 것은 같아야 합니다. (간단히 말하면 입니다.)
이 공식은 다음 도식으로 표현할 수 있습니다. 이 도식은 공식이 참일 때에만 가환합니다. (범주론의 모든 도식은 가환한다고 보므로, 이런 경우 공식과 도식은 서로 동등하다고 말할 수 있습니다.)
이 공식 (그리고 이 도식)은 결합성 이라고 불리는 성질의 정의입니다. 함수 합성이 진정한 함수 합성이라고 불리기 위해서, 그리고 따라서 범주가 진정한 범주라고 불리기 위해서, 결합성은 필요합니다. 또한 우리의 도식들이 제대로 작동하기 위해서도 필요합니다. 도식은 오직 결합적인 구조만 표현할 수 있기 때문입니다. (만약 위의 도식이 가환하지 않는다면 정말 이상하겠지요.)
결합성은 도식에만 관한 것이 아닙니다. 예를 들어 관계를 식으로 표현할 때, 결합성은 단지 식에서 괄호가 중요하지 않다는 뜻입니다. ( 의 정의에서 드러나듯이요.)
그리고 이것은 범주에만 해당하는 것도 아닙니다. 다른 종류의 객체들에 대한 다른 연산들에도 나타나는 성질입니다. 예를 들어 숫자를 보면, 곱셈 연산은 결합적입니다. 예를 들어 입니다. 반면 나눗셈은 그렇지 않습니다. 는 성립하지 않습니다.
위의 도식들은 초록색 사상이 다른 두 사상과 동등하다는 사실을 보여 주기 위해 색을 사용합니다. (그저 아무 관련 없는 사상이 아니라는 뜻입니다.) 하지만 실제로는 이 표기법은 조금 중복됩니다. 애초에 도식을 그리는 유일한 이유는 서로 동등한 경로들을 표현하기 위해서이기 때문입니다. 동등하지 않은 다른 경로들은 그냥 다른 도식에 속해야 할 것입니다.
지난 장에서 잠깐 언급했듯이, 이런 종류의 도식 — 두 객체 사이의 임의의 두 경로가 서로 동등한 도식 — 을 가환 도식 이라고 합니다. (또는 가환하는 도식이라고도 합니다.) 이 책의 모든 도식은 (틀린 도식만 빼면요, 넌지시 넌지시) 가환합니다.
좀 더 형식적으로 말하면, 가환 도식은 두 객체 와 및 그 둘 사이의 두 사상 열이 주어졌을 때, 그 두 열이 서로 동등하다고 말할 수 있는 도식입니다.
위 도식은 가장 단순한 가환 도식의 하나입니다.
하지만 책 속의 도식들이 모두 가환한다고 해서, 일반적으로 모든 도식이 가환하는 것은 아닙니다. 즉, 같은 타입 시그니처를 가진 사상이라도 서로 동등하지 않은 경우가 많습니다.
나중을 위해 범주가 무엇인지 다시 정리해 둡시다.
범주는 객체 (점이라고 생각해도 됩니다)들의 모임과, 한 객체에서 다른 객체로 가는 사상 (화살표)들의 모임이다. 그리고 다음이 성립해야 한다:
- 각 객체는 항등 사상을 가져야 한다.
- 적절한 타입 시그니처를 가진 두 사상을 세 번째 사상으로 합성하는 방법이 있어야 하며, 그 합성은 결합적이어야 한다.
이것이 전부입니다.
그리고 범주가 집합처럼 행동하기 때문에, 많은 집합론적 정의들이 범주에도 그대로 유효합니다. 예를 들어 집합의 곱에 대한 정의에서 “집합”을 “객체”로, “함수”를 “사상”으로 바꾸어 쓰면, 범주적 곱의 일반 정의를 얻게 됩니다.
와 의 곱, 즉 는
집합객체이며, 다음을 만족한다:
- 두 개의 “사영”
함수사상 와 가 존재한다.- 같은 종류의 사영
함수사상 ( 와 )을 가지는 임의의 가짜 곱 에 대해, 타입 시그니처가 인 유일한함수사상 가 존재해야 하며, 이 사상은 가짜 곱을 진짜 곱으로 바꾸고, 위의 두함수사상은 와 곱의 사영들을 합성한 것과 같아야 한다.
범주는 왜 저 두 법칙으로 정의될까요? 다른 두 개의 법칙이 아니라, 혹은 하나, 셋, 넷 등 다른 수의 법칙이 아니라 말입니다. 한 관점에서 보면 답은 자명해 보입니다. 우리는 범주를 연구하는데, 왜냐하면 그것들이 잘 작동하기 때문입니다. 얼마나 많은 응용이 있는지만 봐도 그렇습니다. 하지만 동시에 범주론은 추상 이론이기 때문에, 그 모든 것은 다소 임의적이기도 합니다. 법칙 하나를 없애면 범주론과 비슷해 보이는 다른 이론을 얻게 됩니다. (실제로는 꽤 많이 달라질 수도 있습니다.) 또 법칙 하나를 더하면 또 다른 이론을 얻게 됩니다. (실제로 그런 법칙들과 이론들이 있으며, 나중에 다룰 것입니다.) 그렇다면 왜 바로 이 법칙들의 집합이 다른 어떤 것보다 더 잘 작동하는가 하는 사실은 설명을 요구합니다. 그것은 수학적 설명은 아닙니다. (예를 들어 이 이론이 다른 이론보다 더 낫다는 것을 어떤 식으로도 증명 할 수는 없습니다.) 그래도 설명은 필요합니다. 이어지는 내용은 항등성 과 결합성 의 법칙에 관해 그런 설명을 시도해 본 저 나름의 시도입니다.
항등 법칙이 필요한 이유는 훨씬 더 자명합니다. 왜 아무 일도 하지 않는 사상이 필요할까요? 사상이 우리의 언어를 이루는 기본 벽돌이기 때문입니다. 제대로 말하기 위해서는 항등 사상이 필요합니다. 예를 들어 항등 사상의 개념이 정의되면, 그것을 바탕으로 동형사상 에 대한 범주론적 정의를 만들 수 있습니다. (이것은 중요합니다. 왜냐하면 동형사상의 개념은 범주론에서 매우 중요하기 때문입니다.)
앞 장에서 말했듯이, 두 객체 ( 와 ) 사이의 동형사상은 두 사상 — 와 — 으로 이루어져 있으며, 이들의 합성이 각 객체의 항등 함수와 동등합니다. 형식적으로, 객체 와 가 동형이라는 것은 와 라는 사상이 존재해서 이고 임을 뜻합니다.
그리고 이것을 가환 도식으로 표현하면 다음과 같습니다.
앞의 경우와 마찬가지로, 이 도식은 공식과 같은 (단순한) 사실을 표현합니다. 즉, 한 객체 ( 또는 )에서 다른 객체로 갔다가 다시 출발한 객체로 돌아오는 것이 항등 사상을 적용하는 것, 다시 말해 아무것도 하지 않는 것과 같다는 뜻입니다.
어떤 대격변으로 모든 과학 지식이 파괴되고, 다음 세대의 생명체에게 단 한 문장만 전해질 수 있다고 하자. 그렇다면 가장 적은 말로 가장 많은 정보를 담는 진술은 무엇일까? 나는 그것이 원자 가설이라고 믿는다. (혹은 원자 사실, 혹은 뭐라고 부르든.) 모든 것은 원자로 이루어져 있다는 것 — 끊임없이 움직이며, 조금 떨어져 있을 때는 서로 끌어당기고, 서로를 너무 세게 밀어 넣으면 밀어내는 작은 입자들 말이다. 그 한 문장 안에는, 조금만 상상력과 사고를 더하면, 세계에 대한 엄청난 양의 정보가 담겨 있다. — Richard Feynman
결합성 — 그것은 무엇을 의미하고 왜 필요한 것일까요? 이 질문에 답하려면 먼저 다른 개념 하나를 이야기해야 합니다. 바로 환원주의 입니다.
환원주의는 복잡한 현상의 거동이 더 단순하고 더 근본적인 여러 현상들의 관점에서 이해될 수 있다는 생각입니다. 다시 말해, 사물은 더 “작아질수록” (혹은 더 낮은 수준에서 볼수록) 점점 더 단순해진다는 생각입니다. 환원주의의 한 예는 물질의 거동이 그 구성요소, 즉 원자들의 거동을 연구함으로써 완전히 이해될 수 있다는 생각입니다. (이 단어는 “더는 나눌 수 없는”을 뜻합니다.)
환원주의적 관점이 보편적으로 타당한가, 즉 매우 단순한 법칙들의 집합으로 우주 전체를 설명하는 만물 이론 을 세울 수 있는가 하는 문제는, 그 우주가 결국 붕괴할 때까지 계속 논쟁할 수도 있을 것입니다. 그러나 분명한 사실은, 환원주의가 우리의 모든 이해의 밑바탕에 놓여 있다 는 것입니다. 특히 과학과 수학에서는 더욱 그렇습니다. 각 과학 분야는 단순한 기초 요소 들 (예: 입자물리학의 기본 입자, 화학의 화학 원소 등)에 기반하여, 그 위에 훨씬 더 복잡한 이론을 쌓아 올립니다.
그렇다면 이 원리가 그렇게 중요하다면, 그것을 형식화할 수 있다면 좋을 것입니다. (즉, 수학 언어로 번역할 수 있다면 말입니다.) 이제 바로 그것을 해 보려고 합니다. 환원주의의 원리를 표현하는 한 가지 방식은, 각 사물은 그 부분들의 합에 지나지 않는다 고 말하는 것입니다. 즉, 같은 부분들의 집합을 결합하면 언제나 같은 결과를 얻는다는 뜻입니다. 이것을 형식화하기 위해 우리는 객체들(공들)의 집합과 그것들을 결합하는 방법 하나를 둡니다. (이 결합은 점으로 표기하겠습니다.)
따라서 다음과 같은 어떤 “조리법”이 있다면, 예를 들어
다음도 성립해야 합니다.
혹은 간단히
우연히도 이것은 가환성 이라고 불리는 수학적 법칙의 정의입니다.
이 법칙이 적용되는 간단한 맥락 하나는 자연수입니다. 자연수는 덧셈 연산에 대해 가환적입니다. 예를 들어 1 + 2 = 2 + 1 입니다. (이에 대해서는 군을 다루는 장에서 더 배울 것입니다.)
과제 5: 우리의 객체가 집합이라면, 이 예에서 점의 역할을 할 수 있는 집합 연산은 무엇일까요? (즉, 어떤 것들이 가환적일까요?)
때로 우리는 주어진 기초 요소들의 조합으로 표현될 수는 있지만, 그것들이 특정한 방식으로 결합될 때만 가능한 현상을 봅니다. (가환적 맥락처럼 아무렇게나 결합해도 되는 것이 아닙니다.) 예를 들어 어떤 정비공이든 확인해 주겠지만, 자전거는 분명 바퀴와 프레임의 조합일 뿐입니다…
…하지만 그렇다고 해서 위 부품들의 아무 조합이나 자전거가 되는 것은 아닙니다. 예를 들어 자전거의 앞바퀴를 프레임의 뒤쪽 끝에 달면 제대로 작동하는 자전거가 되지 않습니다. 그리고 바퀴 두 개를 서로 결합하는 것은 아예 불가능합니다.
좀 더 형식적인 예를 들면, 함수 A를 B와 결합해서 C를 얻을 수 있다고 해서…
…자동으로 B를 A와 결합해서 같은 결과를 얻을 수 있다는 뜻은 아닙니다.
덧붙여 말하면, 임의의 함수를 다른 임의의 함수와 합성할 수 있는 것은 출발 집합과 도착 집합이 같은 함수들에 대해서뿐이며, 그 경우에도 최종 결과가 항상 같은 것은 아닙니다.
어쨌든, 함수 합성 (자전거 조립도 마찬가지)은 가환성의 법칙을 따르지 않는다는 것을 확인했습니다. 즉, 모든 함수(또는 자전거 부품)가 다른 모든 함수(또는 부품)와 합성되는 것은 아닙니다. 하지만 그럼에도, 일부 는 분명 합성됩니다. 즉, 함수 시그니처를 맞추거나 (자전거의 경우 올바른 부품을 올바른 위치에 두면) 그것들은 매끄럽게 맞물립니다. 따라서 개별 부분들을 결합하는 순서는 최종 결과에 영향을 주지 않습니다. 예를 들어 자전거를 조립할 때, 앞바퀴를 먼저 프레임에 붙이든 뒷바퀴를 먼저 붙이든 결과는 같습니다.
마찬가지로 함수를 결합할 때도, 함수 쌍은 언제든 그 둘을 결합해서 얻는 함수로 대체할 수 있습니다.
다시 말해, 어떤 주어진 함수 집합을 결합하는 모든 서로 다른 방식은 결국 하나의 같은 결과로 수렴합니다.
이 사실은 가환성보다 더 제한적인 버전의 가환성으로 포착되는데, 그것이 바로 결합성 입니다. 함수에 대해서는 보통 다음과 같이 표현합니다.
혹은 더 일반적으로, (임의의 연산에 대해)
이것이 결합성의 핵심입니다. 결합성은 우리가 복잡한 현상을 연구할 때, 그 순간 살펴보고 싶은 부분으로 확대해서, 그것을 고립시켜 볼 수 있게 해 줍니다.
우리가 정의한 연산자는 한 차원에서만 결합을 허용한다는 점에 주목하세요. (왼쪽과 오른쪽으로는 붙일 수 있지만, 위아래로는 붙일 수 없습니다.) 나중에 우리는 범주론 개념의 확장인 모노이달 범주를 배우게 될 텐데, 그것은 2차원에서 작업하는 것을 “지원”합니다.
과제 6: 사실 이 장에서 우리는 이미 2차원 합성의 한 사례를 정의했습니다. 다만 그것이 2차원 합성이라고 말하지 않았을 뿐입니다. 눈치채셨나요?