본문 바로가기
개발일지

절차지향 / 객체지향 / 함수형 프로그래밍

by 윤승임 2023. 4. 4.

컴퓨터 프로그래밍 패러다임 중 절차지향 / 객체지향 / 함수형 프로그래밍에 대해 알아보자!

절차지향 프로그래밍

프로그램을 처리할 일련의 절차로 나누고 각각의 절차를 순차적으로 실행하여 원하는 결과를 얻는 방식

프로그램을 작성하기 위해 절차와 데이터를 따로 구분하여 설계하는 것이 특징

데이터와 함수를 분리하여 설계하며, 함수는 데이터를 처리하는 데 필요한 일련의 절차를 포함한다.

함수는 매개변수를 통해 입력값을 받고, 반환값을 통해 출력값을 반환한다.

이러한 함수는 순서대로 호출되어 실행되며, 함수 호출의 결과로 처리된 데이터가 메모리에 저장된다.

절차지향 프로그래밍의 장점

  • 프로그램의 구현이 상대적으로 간단
  • 프로그램의 실행 속도가 빠름
  • 대용량 데이터 처리에 적합

절차지향 프로그래밍의 단점

  • 프로그램이 복잡해지면 유지보수가 어렵다.
  • 함수의 순서가 변경될 경우 전체적인 프로그램의 동작이 변경될 수 있다.
  • 함수 간의 데이터 공유가 어려울 수 있다.

 

절차지향 프로그래밍은 C, Pascal, Fortran 등의 언어에서 주로 사용되었으며, 현재는 객체지향 프로그래밍의 등장으로 인해 사용 빈도가 줄어들고 있다.


객체지향 프로그래밍

이 방식은 프로그램을 작성하기 위해 객체를 생성하고, 이들 객체간의 상호작용을 통해 원하는 결과를 얻는 것이 특징

객체지향 프로그래밍에서는 데이터와 함수를 하나의 객체로 묶어서 관리한다.
객체는 데이터와 함수를 함께 가지며, 이들은 객체의 속성과 동작으로 구분된다. (데이터가 속성, 함수가 동작)
이러한 객체들은 클래스(Class)를 통해 생성되며, 클래스는 객체를 생성하기 위한 템플릿 역할을 합니다.

객체지향 프로그래밍의 특징

  • 캡슐화(Encapsulation)
    객체의 상태와 동작을 하나로 묶어서 외부에서 접근할 수 없도록 보호하는 것
    캡슐화를 통해 객체의 내부 구현이 변경되더라도 외부 인터페이스는 유지될 수 있다.
  • 상속성(Inheritance)
    기존에 정의된 클래스를 상속받아 새로운 클래스를 생성하는 것
    상속을 통해 기존 클래스의 기능을 재사용하고, 확장할 수 있다.
  • 다형성(Polymorphism)
    같은 이름의 메서드가 다양한 객체에서 다르게 동작하는 것
    다형성을 통해 객체의 동작이 유연하게 변경될 수 있다.
  • 추상화(Abstraction)
    객체의 공통적인 특징을 추출하여 일반화하는 것
    추상화를 통해 객체 간의 유사점을 파악하고, 이를 기반으로 클래스를 설계할 수 있다.
// 물건을 나타내는 클래스
public class Item {
    // 캡슐화 - 외부에서 접근할 수 없는 private 상태 변수
    private String name; // 물건 이름
    private int price; // 물건 가격

    // 생성자
    public Item(String name, int price) {
        this.name = name;
        this.price = price;
    }

    // 상속성 - Item 클래스를 상속받는 Food 클래스
    public class Food extends Item {
        // 추가적인 속성 변수
        private int expiryDate; // 유통기한

        // 생성자
        public Food(String name, int price, int expiryDate) {
            super(name, price);
            this.expiryDate = expiryDate;
        }

        // 메서드 오버라이딩 - Item 클래스의 메서드와 이름은 같지만 동작이 다름
        @Override
        public void printInfo() {
            System.out.println("음식 이름: " + getName());
            System.out.println("음식 가격: " + getPrice() + "원");
            System.out.println("음식 유통기한: " + getExpiryDate() + "일");
        }
    }

    // 다형성 - Item 클래스의 메서드와 이름은 같지만 파라미터가 다름
    public void printInfo() {
        System.out.println("물건 이름: " + getName());
        System.out.println("물건 가격: " + getPrice() + "원");
    }

    // 추상화 - Item 클래스와 Food 클래스의 공통적인 특징을 추출하여 일반화한 인터페이스
    public interface Sellable {
        String getName();
        int getPrice();
    }

    // Getters and setters
    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }

    public int getExpiryDate() {
        return expiryDate;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public void setExpiryDate(int expiryDate) {
        this.expiryDate = expiryDate;
    }
}

객체지향 프로그래밍의 장점

프로그램의 구현이 상대적으로 간단

객체의 재사용이 용이

객체 간의 관계를 통해 복잡한 문제를 해결할 수 있다.

대규모 프로젝트에서 유지보수가 용이

객체지향 프로그래밍의 단점

프로그램의 실행 속도가 느릴 수 있다.

설계 단계에서 객체 간의 관계를 결정하는 것이 어려울 수 있다.

 

객체지향 프로그래밍은 Java, C++, Python 등의 언어에서 주로 사용되며, 현재는 다양한 분야에서 널리 사용되고 있다.


함수형 프로그래밍

수학적인 함수 개념을 바탕으로 프로그램을 구현하는 방식

상태를 변경하는 대신, 입력 값과 출력 값 사이의 관계를 명확하게 정의하여 함수의 결과를 예측 가능하게 만드는 것이 특징입니다. 

함수형 프로그래밍에서는 함수가 일급 객체(First-class Citizen)로 다루어진다. 즉, 함수가 변수에 저장될 수 있고, 인자로 전달될 수 있으며, 반환 값으로 사용될 수 있다. 또한, 함수는 부수 효과(Side Effect)가 없는 순수 함수(Pure Function)로 구현되어야 한다. 부수 효과는 함수 외부의 상태를 변경하는 것을 말하며, 이러한 효과가 있는 함수는 예측할 수 없는 결과를 만들어내기 때문에 함수형 프로그래밍에서는 지양한다.

함수형 프로그래밍의 장점

  • 코드의 가독성이 높아진다.
  • 동시성(Concurrency) 문제를 해결하기 쉽다.
  • 디버깅이 쉽다.
  • 테스트가 용이

함수형 프로그래밍의 단점

  • 성능이 떨어질 수 있다.
  • 상태를 관리하는 것이 어렵다.

함수형 프로그래밍은 Haskell, Lisp, Clojure, Scala, JavaScript 등의 언어에서 주로 사용되며, 현재는 다양한 분야에서 널리 사용되고 있다.