시험과 현실의 괴리(Feat. OOP)

프로필

2025년 05월 06일

31 0

자격증 준비를 하고있다. 무슨 자격증이냐고?
2020년 개정 전까지만 해도 개나 소나 다 따던 '정보처리기사'를 준비하고 있다.

기출을 돌리던 중 다음과 같은 문제가 나왔는데

객체지향에서 정보 은닉과 가장 밀접한 관계가 있는 것은?
- Encapsulation
- Class
- Method
- Instance

정답은 Encapsulation(캡슐화)였고, 맞추긴했는데 뭔가 찜찜했다. 그 찜찜함의 이유는 내가 Python 개발자이기 때문이다. Python에서는 캡슐화가 명시적 접근 제어 없이 클래스와 메서드의 조합을 통해 암묵적으로 구현되는 경우가 많다. 접근제어자가 없기 때문에, 캡슐화가 독립된 개념으로 작동하기보다는 클래스의 문맥 속에서 제한적 수준의 은닉을 컨벤션으로 구현하는 방식에 가깝다.

그렇다면 파이썬의 객체지향을 기준으로 본다면 이 문제는 복수정답일까?

아니다. Python에서 캡슐화는 정보 은닉과 1도 관련이 없다.
물론 __컨벤션이나, 데코레이터를 사용하면 비슷하게나마 흉내낼 수는 있지만, C++/Java와 같은 접근제어자가 존재하지 않기에 진정한 의미의 정보 은닉은 불가능하다.
그래서 나는 사실 이 문제를 봤을 때 Encapsulation도 Class도 아닌 Abstraction(추상화)을 떠올렸다. 왜냐면 Python의 객체지향 개념으로 정답을 찾자면 가까운 건 그거밖에 없기 때문이다.

문제의 정답 해설은 다음과 같았다.

캡슐화된 객체는 세부 내용이 외부에 은폐되므로 정보 은닉과 밀접한 관계가 있습니다.

그럼 C++/Java에서는 캡슐화와 클래스가 다른 개념인건가? 라는 의문이 들었다.

찾아보니 그렇다고 한다. Java를 예로 들면

public class User {
    public String name;
    public int balance;
}

이 경우는 클래스는 존재하지만, 캡슐화가 안된 경우라고 한다.

public class User {
    private String name;
    private int balance;

    public String getName() { return name; }
    public int getBalance() { return balance; }
}

반면, 이 경우에는 클래스 + 캡슐화가 명시적으로 조합된 구조라고 한다.

그런데 Python에선?

class User:
    def __init__(self):
        self.balance = balance

이게 캡슐화이자 클래스다. 문제에 해당되는 정보 은닉을 위해서는

class User:
    def __init__(self, balance):
        self.__balance = balance

    def get_balance(self):
        return self.__balance

account = User(1000)

print(account.get_balance())

이런식으로 컨벤션을 이용해서 가능할 수 있다. 하지만 이건 ‘정보 은닉’이라는 목적만을 위한 코드이자, 완벽한 정보 은닉조차 아니며, Java에서 말하는 ‘캡슐화된 클래스’ 개념과는 전혀 관련이 없다.

그런 관점에서 Python 개발자의 입장에서 보면 이 문제는 사실상 정답이 없다.
만약 문제에 C++/Java 기준이라는 부연설명이 존재했다면 의심의 여지 없이 캡슐화가 정답이 맞다. 캡슐화의 결과로 정보 은닉이 따라올 수 있으니까.
하지만 Python/Ruby 같은 경우는 캡슐화 = 정보 은닉이라는 수식이 성립되지 않는다. 구조적으로 캡슐화는 존재하지만 정보 은닉 자체는 구현자의 의지에 맡기는 방식이기 때문이다.

더 근본적인 의문은 여기에 있다. OOP란 애초에 특정 언어에 종속된 구현이 아니라, 언어를 초월한 개념적 사고 방식이다. 그런데 이 문제는 마치 C++/Java라는 특정 언어의 구현 방식에만 기대어 그 개념을 정의하고 있는 게 아닐까 라는 생각이 들었다.

본질이 국가 기술자격 시험인 만큼, 언어 중립성을 지키며 기초 CS지식으로서의 객체지향의 개념을 평가하고자 한 문제라면, 이런 식의 편향된 객관식 선택지가 아니라 서술형 문제로 출제되었어야 한다고 생각한다. 개념을 물으려 했는가? 그렇다면 왜 자바와 C++에서만 정답이 가능한 문항을 냈는가? 실무를 반영하려 했는가? 그렇다면 왜 실무 언어(Python, Ruby, Go)에서 성립하지 않는 해설을 강요하는가?


객체지향의 근본

Alan Kay는 객체지향(Object-Oriented Programming)이란 용어 자체를 만든 사람이다. 그리고 그가 남긴 유명한 말이 있다.

"I invented the term 'object-oriented', and I can tell you I did not have C++ in mind."

즉, 객체지향은 C++이나 Java에서 탄생한 개념이 아니다. 그 뿌리는 Smalltalk라는 언어에 있고, 철학은 다음과 같다.

객체는 상태를 가지며, 메시지를 통해 상호작용한다
캡슐화는 구현 세부를 감추고 인터페이스만 제공하는 것이다
클래스나 상속보다 메시지 전달과 은닉성이 더 중요하다

결론적으로 보면 언어에 따라 캡슐화의 결과가 정보 은닉으로 이어질 수도 있고, 아닐 수도 있다. 내 주력 언어인 Python의 경우에는 아니다. 그렇지만 Python에도 OOP는 존재한다.

누군가는 틀린 문제도 아니고, 맞춘 문제에 대해서 왜 그렇게 피곤하게 사냐고 할 수도 있겠지만, 이런 과정을 통해서 파고 들다보면 캡슐화 = 정보 은닉이라는 내 언어 환경과는 연관없는 '죽은 지식'이 아닌 '진짜 지식'을 얻을 수 있는 게 아닐까 라는 생각이 든다.

#OOP #객체지향 #정보처리기사 #Python

댓글 개

댓글을 작성하려면 로그인이 필요합니다