객체지향 프로그래밍 vs 절차지향 프로그래밍 - Java, Cpp, python 중심으로

PLC·2024년 9월 21일

CS기본

목록 보기
1/1

절차지향

  1. 정의
    1. 프로그램의 순서와 흐름을 먼저 세우고, 필요한 자료구조와 함수를 설계
    2. 어떤 기능을 어떤 순서로 처리할 것인가? (함수 호출의 개념)
    3. 데이터를 중심으로 함수를 구현
  2. 종류
    1. c, fortran, pascal

객체지향

  1. 정의
    1. 자료구조와 이를 중심으로 한 모듈들을 먼저 설계하고, 이들의 실행순서와 흐름을 짜는 방식
    2. 실생활에 쓰는 모든 것을 객체라고 함, 프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하여 객체 간의 상호작용을 통해 프로그램을 만듦
    3. 기능을 중심으로 메소드 구현
  2. 종류
    1. C++, C#, Java, Python
  3. 장점
    1. 상속, 캡슐화, 다형성의 특징으로 코드의 재사용성, 확장성이 높다
    2. 객체의 상호작용을 생각하기 때문에 실세계에 대한 모델링이 좀 더 쉽다
    3. 캡슐화로 인해, 실제로 구현되는 부분은 외부에 드러나지 않도록 은닉하여 보안성이 높다
  4. 단점
    1. 캡슐화와 격리구조 때문에 절차지향 프로그래밍보다 실행속도가 느리다
  5. 특징
    1. 추상화
    2. 캡슐화
    3. 상속성
    4. 다형성

예시를 통한 비교

객체 지향 언어 Java를 이용한 예제

// 동물의 공통적인 행동을 정의한 Animal 클래스
public class Animal {
    public void sound() {
        System.out.println("Some generic animal sound");
    }
}

// 개라는 구체적인 동물에 대한 Dog 클래스
public class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Bark");
    }
}

// 고양이라는 구체적인 동물에 대한 Cat 클래스
public class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("Meow");
    }
}

// 동물들이 소리를 내는 동작을 테스트하는 코드
public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();  // Dog 객체 생성
        Animal myCat = new Cat();  // Cat 객체 생성

        myDog.sound();  // 출력: Bark
        myCat.sound();  // 출력: Meow
    }
}

객체 지향 언어 C++를 이용한 예제

#include <iostream>
#include <string>
using namespace std;

// Animal 클래스: 동물의 공통적인 동작을 정의
class Animal {
public:
    virtual void sound() {
        cout << "Some generic animal sound" << endl;
    }
};

// Dog 클래스: Animal을 상속하고 sound() 메서드를 재정의
class Dog : public Animal {
public:
    void sound() override {
        cout << "Bark" << endl;
    }
};

// Cat 클래스: Animal을 상속하고 sound() 메서드를 재정의
class Cat : public Animal {
public:
    void sound() override {
        cout << "Meow" << endl;
    }
};

// 메인 함수: 다형성을 활용하여 동물의 소리를 출력
int main() {
    Animal* myDog = new Dog();  // Dog 객체 생성
    Animal* myCat = new Cat();  // Cat 객체 생성

    myDog->sound();  // 출력: Bark
    myCat->sound();  // 출력: Meow

    // 메모리 해제
    delete myDog;
    delete myCat;

    return 0;
}
  • 자바와 씨쁠쁠의 차이
  1. 메모리 관리: Java는 가비지 컬렉션을 사용하여 메모리를 자동으로 관리하지만, C++에서는 new와 delete를 통해 수동으로 메모리 관리를 해야 합니다.
  2. 다형성 구현: Java에서는 모든 메서드가 기본적으로 가상 메서드(virtual method)이지만, C++에서는 virtual 키워드를 명시해야 다형성을 지원합니다.

절차지향 언어 c를 이용한 예제

#include <stdio.h>

// 개의 소리를 내는 함수
void dogSound() {
    printf("Bark\n");
}

// 고양이의 소리를 내는 함수
void catSound() {
    printf("Meow\n");
}

// 메인 함수에서 각각의 동물 소리를 직접 호출
int main() {
    dogSound();  // 출력: Bark
    catSound();  // 출력: Meow
    return 0;
}

표로 정리

객체지향 Java객체지향 C++절차지향 c
1. 클래스OOX (포인터로 흉내 가능)
2. 다형성OOX (포인터로 흉내 가능)
  1. 클래스
    1. 객체지향: 클래스라는 개념이 존재하므로, 공통적인 행동을 Animal에 정의하고, 구체적인 동물 별 특성은 Animal클래스를 상속받은 하위 클래스에서 정의 가능
    2. 절차지향: 모든 동물들이 공통적으로 갖는 특성을 묶어서 정의를 할 수가 없음 → 코드 반복
  2. 다형성
    1. 같은 인터페이스나 상위 클래스를 통해 여러 다른 타입의 객체를 동일하게 다룰 수 있게 해주는 특성
    2. 클래스 상속, 인터페이스(혹은 추상 클래스), 메서드 오버라이딩, 동적 바인딩을 통해 구현됨
    3. 동적 바인딩
      1. 런타임 시점에 객체의 실제 타입을 결정하여 해당 타입의 메서드를 호출하는 것

내가 프로젝트를 하면서 느낀 객체지향의 장점?

  1. service와 serviceImpl
    1. 인터페이스에 로직을 정의하고, 구현체에 해당 로직을 구체적으로 구현함. 이로써 클라이언트 코드는 인터페이스를 참조해서 원하는 로직만 가져갈 수 있음. 해당 로직이 구체적으로 어떻게 구현되어있는지는 신경을 쓰지 않아도 됨 → 구체적 구현이 달라지더라도 클라이언트 코드에서는 신경쓰지 않아도 됨
  2. 같은 특성은 한 번만 정의해도 됨
    1. 예를 들어 오피스텔과 주택이라는 클래스를 정의한다. 이때 두 클래스 모두가 공통적으로 갖고있어야하는 변수는 ‘주소’가 있을 것이다. 이때 집이라는 인터페이스를 선언해서 거기에 주소라는 변수를 넣어둔다. 이러면 같은 코드를 여러번 반복해서 쓰지 않아도 되기 때문에 유지보수성이 높다. 더불어 추후에 아파트라는 클래스를 추가할 때도 집 인터페이스를 상속받으면 되므로 확장성도 확보.

참고

https://blackvill.tistory.com/221

https://velog.io/@goblin820/절차지향-및-객체지향-프로그래밍

profile
jusqu'au dernier silence

0개의 댓글