Home 김영한의 실전 자바 - 객체 지향 프로그래밍
Post
Cancel

김영한의 실전 자바 - 객체 지향 프로그래밍

객체 지향 프로그래밍

  • 김영한님의 실전 자바 강의 중 객체 지향 프로그래밍 챕터를 학습하며 절차 지향과 객체 지향의 차이, 캡슐화의 원리, 그리고 객체의 데이터와 기능을 하나로 묶는 설계 방식을 정리함



절차 지향과 객체 지향의 차이

  • 프로그래밍 방식은 크게 절차 지향과 객체 지향으로 나눌 수 있음

절차 지향과 객체 지향의 관계

  • 두 방식은 서로 대치되는 상반된 개념이 아니며 상보적인 관계임
  • 객체 지향 프로그래밍에서도 프로그램의 실행 순서를 나타내는 절차는 여전히 중요함
  • 초점의 차이
    • 절차 지향은 데이터와 기능이 분리된 상태에서 ‘어떻게’ 실행할지의 흐름에 집중함
    • 객체 지향은 데이터와 기능을 하나로 묶어 객체를 설계하고 이들 간의 ‘관계’에 집중함

절차 지향 프로그래밍

  • 실행 순서를 중요하게 생각하는 방식임
  • 프로그램의 흐름을 순차적으로 따르며 처리함
  • 어떻게(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)을 중심으로 설계하는 방식임
  • 캡슐화를 통해 객체 내부의 상세한 구현을 숨기고 외부에 일관된 기능을 제공할 수 있음
  • 데이터와 기능이 한 곳에 모여 있어 코드의 가독성과 유지보수성이 비약적으로 상승함



연습 문제

  1. 절차 지향 프로그래밍과 객체 지향 프로그래밍의 가장 큰 차이점은 무엇일까요?

    a. 문제를 바라보는 관점 및 구조화 방식

    • 절차 지향은 ‘어떻게’ 실행할지에, 객체 지향은 ‘무엇’이 존재하고 관계 맺는지에 집중함
    • 문제를 해결하는 근본적인 접근 방식이 다름
  2. 데이터와 그 데이터를 처리하는 기능의 관계에서 절차 지향과 객체 지향의 핵심적인 차이는 무엇인가요?

    a. 데이터와 기능이 완전히 분리되어 있다 vs 데이터와 기능이 객체 안에 함께 묶여 있다

    • 절차 지향은 데이터와 기능이 분리된 채 순서대로 실행되지만, 객체 지향은 데이터와 기능이 하나의 객체로 묶여 관리됨
    • 이것이 큰 차이점임
  3. 객체의 속성(데이터)과 그 속성을 다루는 기능(메서드)을 하나로 묶어서 관리하는 객체 지향의 핵심 개념은 무엇인가요?

    a. 캡슐화 (Encapsulation)

    • 객체가 가져야 할 데이터와 기능들을 하나의 단위(클래스)로 묶고, 내부 구현을 외부에 숨기는 것을 캡슐화라고 부름
    • OOP의 기본 원칙임
  4. 프로그래밍에서 ‘객체’를 현실 세계의 사물처럼 모델링할 때, 객체는 주로 어떤 두 가지 구성 요소로 이루어지나요?

    a. 속성(데이터)과 기능(메서드)

    • 현실 세계의 모든 것은 속성과 기능으로 설명할 수 있듯, 프로그래밍 객체도 해당 객체의 상태를 나타내는 데이터(속성)와 객체가 수행할 수 있는 동작(기능)으로 구성됨
  5. 객체 지향 프로그래밍에서 어떤 객체의 메서드가 호출될 때(예: account.withdraw()), 이 메서드는 주로 어떤 데이터를 사용하고 변경하나요?

    a. 메서드가 속한 객체 자신의 데이터

    • 메서드는 기본적으로 자신이 속한 객체의 상태(데이터)에 접근하고 이를 조작하도록 설계됨
    • 마치 실제 사물이 자신의 상태를 바꾸듯 함



Reference

Contents