[Java] 4. OOP – 캡슐화

프로그래밍 언어의 종류는 셀 수 없을 정도로 많습니다. 초기의 코볼이나 파스칼, 포트란등의 언어는 기능 중심으로 프로그램을 구성하기 쉬운 구조적 프로그래밍 언어입니다. 그런데 프로그래밍 역사가 발전하면서 사람이 살고 있는 세상과 비슷한 구조로 표현할 수 있는 OOP[1]에 관한 연구를 진행하였습니다. 그리고 Java 언어와 C# 언어 등은 OOP 언어입니다.

OOP 언어는 사용자 정의 형식을 만들 때 데이터와 기능을 하나로 캡슐화합니다. 이전 구조적 프로그래밍 언어에서는 사용자 정의 형식에는 데이터만 정의하고 기능은 별도로 정의해야 했습니다. 하지만 OOP 언어에서는 데이터와 기능을 하나로 캡슐화할 수 있습니다.

[그림 4.1] 구조적 프로그래밍 언어 VS OOP 언어의 사용자 정의 형식

일반적으로 OOP 언어에서 사용자 정의 형식을 만들 때 데이터와 기능을 하나로 캡슐화할 때 클래스로 정의합니다. 클래스에 캡슐화한 데이터를 멤버 필드라고 부르며 기능은 멤버 메서드라고 부릅니다. 특히 OOP 언어에서 캡슐화할 때 멤버마다 접근 가능한 범위를 지정할 수 있어 데이터 은폐를 통한 신뢰성을 높일 수 있습니다.

또한 OOP 언어에서는 여러 형식의 공통점을 묶어 기반 형식으로 정의하고 이를 상속받아 파생 형식을 정의할 수 있습니다. 이러한 문법을 상속이라 말하며 설계에서는 일반화라고 말합니다. 예를 들어 피아니스트, 기타리스트, 드러머 등의 공통점을 음악가 형식으로 정의하고 피아니스트, 기타리스트, 드러머 형식은 음악가 형식을 기반으로 파생하여 다른점만 추가로 정의하는 것입니다. 이처럼 상속 문법은 클래스의 확장성을 높여줍니다.

그리고 기반 형식의 변수로 파생 형식 개체를 참조할 수 있게 해 줍니다. 예를 들어 음악가 형식 변수로 피아니스트, 기타리스트, 드러머 형식 개체를 참조할 수 있습니다. 또한 피아니스트, 기타리스트, 드러머에 공통으로 존재하는 기능이지만 세부 동작을 다르게 표현할 수 있으며 개체를 참조하는 변수로 멤버 메서드를 호출하면 실제 개체 형식에 정의한 메서드를 호출할 수 있는 문법을 제공합니다. 이처럼 기반 형식의 변수로 파생 형식 개체를 참조할 수 있고 멤버 메서드를 호출하면 실제 개체 형식에 정의한 메서드를 호출하는 특징을 다형성이라 부릅니다.

이처럼 OOP 언어에서는 캡슐화, 상속, 다형성 문법을 지원하여 높은 신뢰성과 확장성, 편의성을 제공하고 있습니다.

이번 장에서는 OOP의 3대 특징 중에 캡슐화를 살펴보기로 합시다.

[1] OOP는 Object Oriented Programming의 약어로 개체 중심으로 프로그래밍하는 것을 말합니다. 초기에 객체 지향 프로그래밍으로 번역을 하여 많은 곳에서 객체 지향 프로그래밍으로 불리고 있는데 개체 지향 프로그래밍으로 부르는 것이 옳다고 주장하기도 합니다.