법학과 컴퓨터공학의 유사점


법학을 전공하고 컴퓨터공학을 부전공하며 프론트엔드 개발자로 일하다 보니, 언뜻 보면 전혀 다른 두 분야에서 공통점을 발견했습니다. 바로 논리적 사고의 구조가 매우 닮아있다는 것입니다.

법학, 문과에서 가장 이과스러운 학문

대부분의 문과 학문이 해석의 여지가 많고 정답이 모호한 반면, 법학은 꽤 명확한 답이 존재합니다. 물론 복잡한 사안에서는 해석이 갈릴 수 있지만, 기본적인 법리 적용에는 정해진 논리적 절차가 있습니다.

특히 형법에서 이런 특징이 두드러집니다. 어떤 행위가 범죄에 해당하는지 판단할 때는 다음 세 가지 요건을 순차적으로 검토합니다.

  • 구성요건해당성 - 법에서 정한 범죄의 구성요건에 해당하는가?
  • 위법성 - 그 행위가 법질서에 위반되는가?
  • 책임 - 행위자에게 비난가능성이 있는가?
  • 이 세 조건을 모두 만족해야만 범죄가 성립됩니다. 어느 하나라도 충족되지 않으면 처벌할 수 없습니다.

    프로그래밍의 Boolean 논리와의 닮은꼴

    이 구조를 보는 순간 떠오른 건 프로그래밍의 조건문이었습니다. 특히 AND 연산자를 사용한 논리 구조와 정확히 일치합니다.

    const is범죄 = 구성요건해당성 && !위법성조각사유 && !책임조각사유;
    if (is범죄) {
    처벌();
    } else {
    무죄();
    }

    여기서 위법성조각사유책임조각사유에 NOT 연산자를 붙인 이유는, 이들이 존재할 경우 각각 위법성과 책임이 조각(없어짐)되기 때문입니다.

    더 구체적인 예시: 정당방위

    정당방위를 예로 들어보겠습니다. A가 B를 때렸는데, B가 A의 불법적인 공격을 막기 위해 반격한 상황이라면,

    const 구성요건해당성 = true; // 폭행죄의 구성요건에 해당
    const 위법성조각사유 = "정당방위"; // 정당방위로 인한 위법성 조각
    const 책임조각사유 = null;
    const is범죄 = 구성요건해당성 && !위법성조각사유 && !책임조각사유;
    // true && false && true = false
    console.log(is범죄); // false - 범죄 불성립

    민법에서도 발견되는 논리 구조

    이런 논리적 사고는 민법에서도 마찬가지입니다. 계약의 성립과 효력을 판단할 때도 비슷한 구조를 가집니다.

    const 계약성립 = 청약 && 승낙 && 의사표시일치;
    const 계약효력 = 계약성립 && !무효사유 && !취소사유;
    if (계약효력) {
    계약이행의무발생();
    }

    법 제정 = 코드 작성, 법 해석 = 코드 리딩

    더 흥미로운 건, 법을 만들고 해석하는 과정 자체가 소프트웨어 개발 과정과 놀랍도록 닮아있다는 점입니다.

    법을 제정하는 것은 마치 코드를 작성하는 것과 같습니다. 입법자는 예상 가능한 모든 상황을 고려해 법률 조문을 작성하지만, 현실은 항상 예상보다 복잡합니다. 개발자가 모든 edge case를 미리 예측할 수 없는 것처럼 말이에요.

    법을 해석하는 것코드를 읽고 이해하는 것과 같습니다. 법조인은 조문의 문언을 분석하고, 입법 취지를 파악하며, 전체적인 법 체계 속에서 해당 조문의 의미를 해석합니다. 마치 개발자가 코드를 읽을 때 변수명, 함수명, 주석, 그리고 전체적인 아키텍처를 파악하는 과정과 유사합니다.

    판례 = 핫픽스와 버그 패치

    가장 재밌는 건 판례 시스템입니다. 법률에 명시되지 않은 새로운 상황이 발생하면, 법원이 판례를 통해 해결책을 제시합니다. 이는 소프트웨어에서 핫픽스나 패치를 배포하는 것과 정확히 같은 메커니즘입니다.

    // 기존 법률 (메인 코드)
    function 계약효력판단(계약) {
    if (계약.의사표시일치 && 계약.적법성) {
    return "유효";
    }
    return "무효";
    }
    // 새로운 상황 발생: 전자계약의 등장
    // 기존 법률로는 해결 불가 -> 판례 필요
    // 판례를 통한 핫픽스
    function 계약효력판단_v2(계약) {
    if (계약.의사표시일치 && 계약.적법성) {
    // 판례: 전자서명도 유효한 의사표시로 인정
    if (계약.type === "전자계약" && 계약.전자서명) {
    return "유효"; // 새로운 판례 적용
    }
    return "유효";
    }
    return "무효";
    }

    판례가 축적될수록 법 체계는 더 정교해지고, 예외 상황에 대한 처리 능력이 향상됩니다. 이는 소프트웨어가 버전업을 거듭하며 더 안정적이고 기능이 풍부해지는 과정과 동일합니다.

    상위법과 하위법 = 상속과 오버라이딩

    법의 위계 구조도 객체지향 프로그래밍의 상속 개념과 닮아있습니다.

    class 헌법 {
    기본권보장() {
    return "모든 국민의 기본권은 보장된다";
    }
    }
    class 민법 extends 헌법 {
    // 헌법의 기본권 보장 원칙을 구체화
    재산권보장() {
    return "사유재산권은 보장된다";
    }
    }
    class 특별법 extends 민법 {
    // 특별한 상황에서는 일반법을 오버라이드
    재산권보장() {
    return "공익을 위해 재산권을 제한할 수 있다";
    }
    }

    하위법은 상위법의 기본 원칙을 상속받되, 필요에 따라 구체적인 규정으로 오버라이드합니다. 마치 자식 클래스가 부모 클래스의 메서드를 상속받으면서도 필요에 따라 재정의하는 것과 같습니다.

    왜 이런 유사점이 생겼을까요?

    두 분야 모두 복잡한 현실을 단순화하여 체계적으로 분석해야 하는 특성을 가지고 있습니다.

    법학은 무수히 많은 사회적 갈등과 분쟁을 일관된 기준으로 해결하기 위해 논리적 체계를 구축했습니다. 프로그래밍 역시 복잡한 문제를 작은 단위로 분해하고, 논리적 절차를 통해 해결책을 찾습니다.

    결국 두 분야 모두 "만약 A라면 B하고, 그렇지 않으면 C한다"는 조건부 사고를 기반으로 한다는 점에서 본질적으로 같은 사고 체계를 가지고 있다고 생각합니다.

    마치며

    법학을 공부하며 기른 법리적 사고가 프로그래밍을 할 때 큰 도움이 되고 있습니다. 복잡한 비즈니스 로직을 구현할 때도 법적 사고방식으로 접근하면 더 체계적이고 빈틈없는 코드를 작성할 수 있습니다.

    AI가 인간의 일자리를 위협하는 시대에, 우리에게 중요한 것은 문제를 정의하고 해결하는 능력이라고들 말합니다. 결국에는 법학과 컴퓨터공학이 공통적으로 요하는 논리적 사고력이 필요한게 아닐까요?