절차적 프로그래밍과 객체 지향 프로그래밍

|

절차적 프로그래밍

  • 프로시저 (메서드, 함수)를 이용한 프로그래밍 패러다임

  • 장점
    • 함수를 통해 추상화와 재사용성을 얻는다
    • 함수 내에 호출을 통해 여러 부분을 생략하여 코드의 가독성이 높아진다
  • 단점
    • 프로시저 호출의 오버헤드가 발생한다 (스택 생성 및 호출)
    • 데이터의 처리방법 만을 구조화 했을뿐, 데이터 자체는 구조화하지 못했다

객체 지향 프로그래밍

  • 프로그램을 ‘객체’라는 기본 단위로 나누고 객체간 상호작용으로 프로그래밍 하는 패러다임
  • 객체는 메서드와 변수의 묶음이다
  • 데이터 자체를 구조화하지 못했던 절차적 프로그래밍의 단점을 보완한다
  • 객체를 구현하기 위해 클래스 또는 프로토타입 개념을 사용한다
  • 장점
    • 캡슐화를 통해 응집도를 높이고, 결합도를 낮출 수 있다 (스파게티 코드 위험을 낮춘다)
    • 상속을 통해 재사용성을 높인다
    • 다형성을 통해 유연한 코드 작성이 가능하다 (오버라이딩, 오버로딩, 제네릭, 형변환)
  • 단점
    • 상속을 통해 재사용성을 높일 수 있지만, 상속이 많아지면 코드의 복잡도가 급격히 증가한다
    • 개념을 기준으로 나누다보니 컴퓨터 친화적이지 않다. 특히 배열 자료구조를 적용하기 힘들어진다. 상속시 부모만 같으면 자식의 종류를 신경쓰지 않다보니 각자의 메모리 크기가 달라지며, 결국 고정된 연속 메모리에 담을 수 없게 된다 -> 메모리 단편화 발생 가능성 있다, 캐쉬 효율적 사용이 힘들다
    • getter, setter와 같은 보일러 플레이트 코드 발생
    • 캡슐화로 인한 성능저하가 발생한다
      • 함수 호출이 부가적으로 들어가거나 (ex. getter, setter), 계산식 중간에 포인터 연산 등이 필요해지기 때문