객체 지향 프로그래밍
- 김영한님의 실전 자바 강의 중 객체 지향 프로그래밍 챕터를 학습하며 절차 지향과 객체 지향의 차이, 캡슐화의 원리, 그리고 객체의 데이터와 기능을 하나로 묶는 설계 방식을 정리함
절차 지향과 객체 지향의 차이
- 프로그래밍 방식은 크게 절차 지향과 객체 지향으로 나눌 수 있음
절차 지향과 객체 지향의 관계
- 두 방식은 서로 대치되는 상반된 개념이 아니며 상보적인 관계임
- 객체 지향 프로그래밍에서도 프로그램의 실행 순서를 나타내는 절차는 여전히 중요함
- 초점의 차이
- 절차 지향은 데이터와 기능이 분리된 상태에서 ‘어떻게’ 실행할지의 흐름에 집중함
- 객체 지향은 데이터와 기능을 하나로 묶어 객체를 설계하고 이들 간의 ‘관계’에 집중함
절차 지향 프로그래밍
- 실행 순서를 중요하게 생각하는 방식임
- 프로그램의 흐름을 순차적으로 따르며 처리함
- 어떻게(How)를 중심으로 프로그래밍함
- 데이터와 해당 데이터를 처리하는 방식이 분리되어 있음
객체 지향 프로그래밍
- 객체를 중요하게 생각하는 방식임
- 실제 세계의 사물이나 사건을 객체로 보고 객체들 간의 상호작용을 중심으로 함
- 무엇을(What) 중심으로 프로그래밍함
- 데이터와 그 데이터에 대한 행동인 메서드가 하나의 객체 안에 포함되어 있음
절차 지향 프로그래밍의 한계
데이터와 기능의 분리
- 데이터는 클래스에 있고 데이터를 사용하는 기능은 별도의 메서드에 분리되어 있음
- 관련 데이터가 변경되면 해당 데이터를 사용하는 모든 메서드를 함께 변경해야 함
-
유지보수 관점에서 관리 포인트가 분리되어 있어 복잡도가 올라감
- 기능별로 메서드를 추출해도 데이터 자체가 외부에 노출되어 있어 응집도가 낮음
데이터 구조 변경 시의 영향 범위
- 절차 지향의 한계
- 데이터 구조가 바뀌면 해당 데이터를 파라미터로 사용하는 모든 외부 메서드를 찾아 수정해야 함
- 관리 포인트가 여러 곳으로 분산되어 있어 유지보수 효율이 낮음
- 객체 지향의 장점
- 데이터와 기능이 하나의 객체 안에 응집되어 있음
- 내부 데이터 요건이 변경되어도 객체 내부의 메서드만 수정하면 됨
- 외부 사용자 코드는 수정할 필요가 없어 유지보수 관리 포인트가 비약적으로 감소함
객체 지향 프로그래밍으로의 진화
- 클래스는 멤버 변수뿐만 아니라 기능을 수행하는 메서드도 포함할 수 있음
절차 지향 방식의 로봇 청소기
-
데이터와 기능을 분리하여 작성한 경우임
1 2 3 4 5 6
package oop.procedural; public class RobotData { int battery = 0; boolean isOn = false; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
package oop.procedural; public class RobotMain { public static void main(String[] args) { RobotData data = new RobotData(); powerOn(data); charge(data, 20); showStatus(data); } static void powerOn(RobotData data) { data.isOn = true; System.out.println("로봇 청소기를 시작합니다."); } static void charge(RobotData data, int amount) { data.battery += amount; System.out.println("배터리 충전 중 현재 배터리 " + data.battery); } static void showStatus(RobotData data) { if (data.isOn) { System.out.println("로봇 상태 ON, 배터리 " + data.battery); } } }
객체 지향 방식의 로봇 청소기
-
데이터와 기능을 하나의 클래스에 묶어서 정의함
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
package oop.object; public class RobotVacuum { int battery = 0; boolean isOn = false; void powerOn() { isOn = true; System.out.println("로봇 청소기를 시작합니다."); } void charge(int amount) { battery += amount; System.out.println("배터리 충전 중 현재 배터리 " + battery); } void showStatus() { if (isOn) { System.out.println("로봇 상태 ON, 배터리 " + battery); } } }
1 2 3 4 5 6 7 8 9 10
package oop.object; public class RobotMain { public static void main(String[] args) { RobotVacuum robot = new RobotVacuum(); robot.powerOn(); robot.charge(20); robot.showStatus(); } }
인스턴스 메서드와 static 키워드
- 객체 지향 방식의 메서드 설계 특징
- 클래스 내부에 정의된 메서드는 호출 시
static키워드를 사용하지 않음 - 객체를 생성한 후에 해당 인스턴스를 통해 호출해야 함
- 클래스 내부에 정의된 메서드는 호출 시
-
본인 인스턴스 데이터에 대한 접근
- 메서드 내부에서 해당 객체의 멤버 변수에 직접 접근하여 작업함
- 외부에서 파라미터로 데이터를 넘겨받을 필요가 없어 객체 스스로의 자립성이 보장됨
-
객체 지향 방식의 동작 흐름

캡슐화의 원리
- 속성과 기능을 하나로 묶어서 필요한 기능만 메서드를 통해 외부에 제공하는 것임
- 사용자는 객체 내부의 데이터 구조나 복잡한 로직을 알 필요가 없음
- 단순하게 객체가 제공하는 기능을 호출해서 사용하기만 하면 됨
- 객체 내부의 필드 이름이 변경되어도 외부 코드를 수정할 필요가 없음
- 속성과 기능이 한 곳에 있어 변경이 쉬워지고 유지보수성이 올라감
객체의 구성 요소와 추상화
- 추상화의 정의
- 현실 세계의 사물을 프로그램으로 설계하기 위해 속성과 기능이라는 두 가지 요소로 단순화하는 과정임
- 복잡한 사물에서 필요한 정보만 남기고 단순화하여 객체 모델을 만드는 근거가 됨
객체별 예시
- 게임 캐릭터
- 속성
- 레벨, 경험치, 공격력
- 기능
- 이동하기, 공격하기, 아이템 사용하기
- 속성
- 은행 계좌
- 속성
- 잔액, 계좌 번호
- 기능
- 입금하기, 출금하기, 잔액 조회하기
- 속성
요약 정리
- 클래스 내부에 메서드를 포함하여 데이터와 기능을 하나로 묶을 수 있음
- 객체 지향 프로그래밍은 무엇(What)을 중심으로 설계하는 방식임
- 캡슐화를 통해 객체 내부의 상세한 구현을 숨기고 외부에 일관된 기능을 제공할 수 있음
- 데이터와 기능이 한 곳에 모여 있어 코드의 가독성과 유지보수성이 비약적으로 상승함
연습 문제
-
절차 지향 프로그래밍과 객체 지향 프로그래밍의 가장 큰 차이점은 무엇일까요?
a. 문제를 바라보는 관점 및 구조화 방식
- 절차 지향은 ‘어떻게’ 실행할지에, 객체 지향은 ‘무엇’이 존재하고 관계 맺는지에 집중함
- 문제를 해결하는 근본적인 접근 방식이 다름
-
데이터와 그 데이터를 처리하는 기능의 관계에서 절차 지향과 객체 지향의 핵심적인 차이는 무엇인가요?
a. 데이터와 기능이 완전히 분리되어 있다 vs 데이터와 기능이 객체 안에 함께 묶여 있다
- 절차 지향은 데이터와 기능이 분리된 채 순서대로 실행되지만, 객체 지향은 데이터와 기능이 하나의 객체로 묶여 관리됨
- 이것이 큰 차이점임
-
객체의 속성(데이터)과 그 속성을 다루는 기능(메서드)을 하나로 묶어서 관리하는 객체 지향의 핵심 개념은 무엇인가요?
a. 캡슐화 (Encapsulation)
- 객체가 가져야 할 데이터와 기능들을 하나의 단위(클래스)로 묶고, 내부 구현을 외부에 숨기는 것을 캡슐화라고 부름
- OOP의 기본 원칙임
-
프로그래밍에서 ‘객체’를 현실 세계의 사물처럼 모델링할 때, 객체는 주로 어떤 두 가지 구성 요소로 이루어지나요?
a. 속성(데이터)과 기능(메서드)
- 현실 세계의 모든 것은 속성과 기능으로 설명할 수 있듯, 프로그래밍 객체도 해당 객체의 상태를 나타내는 데이터(속성)와 객체가 수행할 수 있는 동작(기능)으로 구성됨
-
객체 지향 프로그래밍에서 어떤 객체의 메서드가 호출될 때(예:
account.withdraw()), 이 메서드는 주로 어떤 데이터를 사용하고 변경하나요?a. 메서드가 속한 객체 자신의 데이터
- 메서드는 기본적으로 자신이 속한 객체의 상태(데이터)에 접근하고 이를 조작하도록 설계됨
- 마치 실제 사물이 자신의 상태를 바꾸듯 함