본문 바로가기
스터디/혼공학습단 10기 - 자바 & 머신러닝

[혼공학습단] 객체지향 프로그래밍을 좀 더 쉽게 이해해보자.

by 찌노오 2023. 7. 16.

 

 

 비전공자입장에서, 또 프로그래밍을 독학하고 있는 사람의 입장에서 객체지향 프로그래밍을 이해하기 위해 정리해보려고 한다. 

 

객체지향 프로그래밍이 뭔데? 쉽게 설명해봐!

 

최초의 프로그래밍은 단순 명령어의 집합(목록)이었다고 한다.

 

예를 들어 직장인의 일상을 프로그래밍해본다고 가정하자.

출근을 한다. → 커피를 한 잔 마신다. → 근무를 한다. → 회의를 한다. → 퇴근을 한다.

 

실제 현실에서는 이거보다 더 복잡하겠지만 최대한 간략하게 적어봤다.

이걸 코드로 바꿔보면 다음과 같다.

 

public class Main {
    public static void main(String[] args) {
        // 출근
        System.out.println("Go to work.");

        // 커피를 한 잔 마신다.
        System.out.println("Drink a cup of coffee.");

        // 근무
        System.out.println("Do work.");

        // 회의
        System.out.println("Have a meeting.");

        // 퇴근
        System.out.println("Go home.");
    }
}

 

대충 이런 과정(프로시저)을 컴퓨터에게 명령한다.

 

그런데 이런 과정을 한 명이 아니라 20명이 한다고 가정해보자. 똑같은 명령을 20번 입력해야 한다. 그래서 우리는 반복문이라는 것을 써서 가독성과 유지보수를 높인다.

 

public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            // 출근
            System.out.println("Go to work.");

            // 커피를 한 잔 마신다.
            System.out.println("Drink a cup of coffee.");

            // 근무
            System.out.println("Do work.");

            // 회의
            System.out.println("Have a meeting.");

            // 퇴근
            System.out.println("Go home.");
        }
    }
}

 

그런데 여기서 부서에 따라 근무의 세부형태까지 잡아야 한다면 어떨까? 예컨대, 영업팀은 대리점에서 근무를 하고, 유지보수팀은 현장에서 영업하고 마지막으로 기획팀은 사무실에서 리서치를 한다고 가정해보자.

 

다시 명령어를 하나씩 나열해야 할까? 아니다. 함수(function)라는 것을 이용해서 매개변수(parameter)를 바꾸주는 방법으로 다시 효율적으로 바꿔줄 수 있다.

 

    public static void doWork(String department) {
        if (department.equals("Sales")) {
            System.out.println("Works with distributors.");
        } else if (department.equals("FieldEquipment")) {
            System.out.println("Performs equipment maintenance in the field.");
        } else if (department.equals("Planning")) {
            System.out.println("Conducts research in the office.");
        } else {
            System.out.println("Unknown department: " + department);
        }
    }

 

 

사실 여기서  끝난 게 아니다. 아까 서두에 실제 현실은 이것보다 더 복잡하다고 적었다.

 

Jay라는 사람은 영업팀이고,  Alice는 유지보수팀, David는 기획팀이라면 어떨까?

아니 이런 식으로 세분화가 되고 끊임없이 복잡해진다면 어떻게 유지보수 할까?

 

이제 더 이상 절차적인 개념으로 접근 할 수 없다. 객체지향 프로그래밍은 여기서 출발한다. 컴퓨터 프로그램을 여러 개의 단위, 객체(object)로 정의하고 파악하는 것이다. 

 

예시는 Employee  클래스만으로 예시를 들었다.

여기서 다시 직장인 일과라는 부모(상위) 클래스(Class)를 만들고  영업팀, 유지보수팀, 기획팀라는 자식(하위) 클래스를 만들어서 작성하는 것도 가능하다.

 

class Employee {
    private String name;
    private String department;

    public Employee(String name, String department) {
        this.name = name;
        this.department = department;
    }

    public String getName() {
        return name;
    }

    public String getDepartment() {
        return department;
    }

    public void doWork() {
        if (department.equals("Sales")) {
            doSalesWork();
        } else if (department.equals("FieldEquipment")) {
            doMaintenanceWork();
        } else if (department.equals("Planning")) {
            doResearchWork();
        } else {
            System.out.println("Unknown department: " + department);
        }
    }

    private void doSalesWork() {
        System.out.println(name + " works with distributors.");
    }

    private void doMaintenanceWork() {
        System.out.println(name + " performs equipment maintenance in the field.");
    }

    private void doResearchWork() {
        System.out.println(name + " conducts research in the office.");
    }
}

public class Main {
    public static void main(String[] args) {
        Employee employee1 = new Employee("Jay", "Sales");
        Employee employee2 = new Employee("Alice", "FieldEquipment");
        Employee employee3 = new Employee("David", "Planning");

        // 출근
        System.out.println("Go to work.");

        // 커피를 한 잔 마신다.
        System.out.println("Drink a cup of coffee.");

        // 근무
        employee1.doWork();
        employee2.doWork();
        employee3.doWork();

        // 회의
        System.out.println("Have a meeting.");

        // 퇴근
        System.out.println("Go home.");
    }
}

 

위 코드와 같이 클래스를 만들어 언제든지 새로운 사람과 팀을 연결지어 유지보수와 가독성을 높인 프로그래밍이 가능한 것이 바로 객체지향프로그래밍이다.

 

마무리

정리하는 수준으로 간단하게 정리해봤지만, 사실 객체지향프로그래밍에 대한 내용은 훨씬 더 설명을 잘하는 레퍼런스가 있기에 아래 링크를 참고해보면 좋을 것 같다.

 

참고로 java 코드들은 chatGPT의 도움으로 작성했다.

 

https://www.youtube.com/watch?v=vrhIxBWSJ04

 

https://www.codestates.com/blog/content/%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%ED%8A%B9%EC%A7%95

 

객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화 -

객체 지향 프로그래밍은 객체의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미합니다. 객체 지향 프로그래밍의 기본적인 개념과 그 설계를 바르게 하기 위

www.codestates.com

 

https://medium.com/@limsungmook/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94-%EC%99%9C-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85%EC%9D%84-%EC%84%A0%ED%83%9D%ED%96%88%EC%9D%84%EA%B9%8C-997f985adb42

 

자바스크립트는 왜 프로토타입을 선택했을까

프로토타입으로 검색하면 으레 나오는 서두처럼 저 또한 자바스크립트를 처음 접했을 때 가장 당황스러웠던 게 프로토타입이었습니다.

medium.com

 

 

https://black7375.tistory.com/86

 

객체지향 시스템과 패러다임 그리고 철학

자바스크립트는 왜 프로토타입을 선택했을까 라는 글을 읽고 떠오르는 내용들을 덧붙이거나 정리 해보았습니다. 원글과는 접근법이 좀 다르며, 기획이 아닌 급하게 쓴 글이라 의식의 흐름 사이

black7375.tistory.com

 

 

https://leedakyeong.tistory.com/entry/Class-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-Class%EB%A5%BC-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0-Class-vs-function

 

Class 이해하기 :: Class를 쓰는 이유, Class vs function

Class VS Object 먼저 Class와 Object(객체)의 개념에 대해 알아보겠다. 예를 들자면 class는 '인간' 이라는 추상적인 타입이고, object는 '이효리', '유재석' 처럼 실제로 존재하는 객체를 의미한다. '인간'은

leedakyeong.tistory.com

 

 

 

** 사실과 다른 내용이 있을 수 있습니다. 언제든지 피드백 부탁드립니다!

반응형

댓글