세상을 분류한다는 것
우리는 세상을 이해하기 위해 그것을 분류한다.
철학자는 존재를 분류했고 프로그래머는 객체를 분류한다.
각자의 언어는 다르지만 그들이 하는 일은 닮아 있다.
세계를 잘게 나누고 공통과 차이를 찾아내며 구조화된 틀 안에서 의미를 재구성한다.
철학에서 분류는 존재론의 시작이다.
어떤 것이 “무엇”인지 말하려면, 그것이 무엇과 같고 무엇과 다른지를 먼저 설명해야 한다.
그래서 아리스토텔레스는 “류”와 “종차”라는 개념을 통해 사물을 나눴다.
프로그래밍에서도 분류는 설계의 시작이다.
우리는 객체지향에서 “클래스”를 만들고, 그것을 상속하며 기능을 나누고 확장한다.
어떤 객체가 어떤 동작을 하는지 어떤 속성을 가지는지 정의하기 위해 먼저 그것이 속한 구조를 정한다.
분류는 단순히 정리의 기술이 아니다.
그것은 생각하는 방식, 세계를 틀에 담기 위한 노력이다.
철학의 분류 원리는 류와 종차이다.
아리스토텔레스는 존재를 분류하기 위해 두 개념을 도입했다.
바로 류(類, Genus)와 종차(種差, Differentia)다.
류는 공통적인 범주다. 여러 사물 사이의 유사성을 모아 상위 개념으로 묶은 것.
예를 들어, 인간과 고양이는 모두 ‘동물’이라는 류에 속한다.
하지만 같은 류에 속한다고 해서 모두 같은 것은 아니다.
무엇이 인간을 고양이와 다르게 만드는가?
그 고유한 차이를 아리스토텔레스는 종차라 불렀다.
그래서 인간은
“동물이라는 류”에,
“이성적이라는 종차”가 더해져 정의된다.
인간 = 동물(류) + 이성적(종차)
류는 공통을 말하고, 종차는 차이를 말한다.
아리스토텔레스는 이렇게 어떤 존재를 특정지었다.
객체지향 프로그래밍의 분류 방식 : 클래스와 상속
객체지향 프로그래밍도 세상을 분류한다.
우리는 비슷한 객체들을 묶어 클래스를 만들고,
그 클래스를 기반으로 객체를 생성하며,
필요할 땐 기존 클래스를 상속해 새로운 개념을 정의한다.
이때 상위 클래스는 류에 해당한다.
공통된 속성과 동작을 정의하고,
하위 클래스는 이를 물려받아 자신의 고유한 차이를 추가한다.
예를 들어보자.
Animal이라는 클래스가 있다면
그 안에는 모든 동물이 공통적으로 가지는 특징이 들어간다.
Human 클래스는 Animal을 상속받고,
여기에 “말한다”는 메서드를 더한다.
class Animal: # 류
def eat(self):
return "먹는다"
class Human(Animal): # 종 = Animal + 고유 기능
def speak(self):
return "말한다"
상속은 공통과 차이를 분리하는 구조다.
류는 클래스가 되고 종차는 고유한 메서드가 된다.
코드에서 드러나는 류와 종차의 개념
객체지향에서 클래스는 본질을 담고,
상속은 그 본질을 계승하며 오버라이딩은 차이를 말한다.
이 구조는 철학자가 존재를 분류하던 방식과 닮아 있다.
아리스토텔레스는 "무엇인가를 정의하려면 그것이 속한 류를 말하고,
그 안에서의 차이를 밝혀야 한다"고 했다.
OOP에서도 객체는 같은 구조를 따르되 서로 다르게 행동한다.
그 차이는 오버라이딩을 통해 표현된다.
class Animal:
def speak(self):
return "소리를 낸다"
class Dog(Animal):
def speak(self): # 종차
return "멍멍"
class Human(Animal):
def speak(self): # 종차
return "말한다"
여기서 def speak()는 Dog와 Human에서 같은 메서드지만 다른 동작을 한다.
이것이 바로 철학에서 말하는 종차다.
그래서, 오버라이딩은
공통된 형상 위에 차이를 선언하는 일이다.
철학에서 존재는 "공통 + 차이"로 정의되었고,
객체지향도 마찬가지로 "상속 + 구현"으로 객체를 구성한다.
객체지향은 결국
존재를 분류하고 형식화하는 철학의 사유 방식을
하나의 코드 구조로 옮겨온 것이다.
철학과 OOP 개념
class Animal: # 류
def move(self):
return "움직인다"
class Bird(Animal): # 종 = Animal + 고유 기능
def fly(self): # 종차
return "난다"
류 (Genus) | 슈퍼클래스 (Superclass) | 여러 하위 존재(종)를 포괄하는 공통 구조. 상속의 기반이 되는 클래스 |
종차 (Differentia) | 서브클래스의 고유 기능/오버라이딩 | 같은 류에 속하지만 구분되게 만드는 고유 특성. 메서드 오버라이딩, 추가 기능 등 |
종 (Species) | 서브클래스 (Subclass) | 상위 구조(류)를 물려받고, 고유한 종차로 구체화된 존재. 하나의 구체적 객체 유형 |
추상화는 공통과 차이의 경계에서
추상화는 본질을 남기고 나머지를 덜어내는 일이다.
철학에서 그것은 ‘개념’을 만드는 방식이고
프로그래밍에서는 ‘클래스’를 만드는 방식이다.
철학자에게 추상화란
수많은 구체적 사물들 속에서 공통된 속성을 끌어올리는 일이다.
사람, 개, 고양이를 보며 "이들은 모두 동물이다"라고 말하는 순간
그는 이미 ‘류’라는 추상화를 수행한 것이다.
프로그래머도 마찬가지다.
여러 객체들에서 반복되는 구조를 뽑아내고
그것을 클래스라는 틀로 만든다.
이 틀은 구체가 아니지만
수많은 구체를 만들어내는 시작점이 된다.
그런데 추상화는 단지 공통만을 말하지 않는다.
차이를 남기는 방식으로 공통을 정의한다.
바로 그 경계에서 류와 종차가 나뉘고,
슈퍼클래스와 오버라이딩이 갈라진다.
객체지향에서 추상화란
공통과 차이 사이의 균형을 설계하는 일이다.
너무 많은 것을 끌어올리면 본질을 잃고
너무 적게 정의하면 확장할 수 없다.
그래서 추상화는 단순한 구조화가 아니다.
그것은 생각하는 기술이며
존재를 어떻게 바라보고 나눌 것인가에 대한 깊은 태도다.
'프로그래밍, 코딩' 카테고리의 다른 글
투포인터는 유효한 구간에 대한 완전탐색이다의 증명 (0) | 2025.02.10 |
---|