절차지향 vs. 객체지향

DanChu 🌟·2022년 7월 11일
1

절차지향 vs. 객체지향

절차지향

  • procedural programming
  • 순차적인 처리가 중요
  • 하드웨어와 소프트웨어의 개발 속도 차이가 크기 않았던 과거에 비해, 컴퓨팅 환경의 변화가 빠른 현재에는 소프트웨어 시간을 줄일 수 있는 객체지향이 사용되는 추세 (아래 객체지향 참고)
  • e.g. C

장점

  • 컴퓨터의 처리방식과 비슷하여 처리 속도가 빠름

단점

  • 유지 보수의 어려움 (모든 코드가 유기적으로 연결되어 있어서)
  • 실행 순서가 정해져있어서 코드의 순서가 바뀔 시 결과값이 달라질 수 있음


객체지향

  • object oriented programming
  • 소프트웨어의 개발속도를 빠르게 올리기 위해서 반복적으로 사용할 수 있는 코드들을 모듈화, 캡슐화해서 개념적으로 접근하는 형태
  • 개발하려는 것을 기능별로 묶어 모듈화 => 같은 기능을 중복으로 연산하지 않고 모듈을 재활용
  • e.g. Java, python, C# etc

장점

  • 코드의 재활용성 높음
  • 유지보수가 쉬워짐
  • 절차지향보다 간편한 코딩

단점

  • 처리속도가 절차지향에 비해 느림 (소프트웨어의 개발속도를 올리기 위해 빠르게 발전된 하드웨어의 성능을 조금 더 할애)
  • 최초 설계시 시간이 많이 걸림

NOTE

  • 객체지향과 절차지향은 반대되는 개념이 아님

  • 객체지향, 절자지향보다 객체적지향, 절차적 프로그래밍이 더 맞는 표기
    : 프로그래밍의 기본 틀이 절차/객체에 틀을 두고있고, 우리는 그 틀을 꺠지 않는 선에서 절차적/객체지향적으로 프로그래밍을 하기 때문

  • 각 성향의 대표되는 언어를 예시로 넣었으나, 어디까지나 일반적 지향일 뿐 Java로 반드시 객체지향적 프로그래밍을 해야하는 것은 아님
    : 1) 캡슐화, 다형성, 클래스 상속 지원 여부
    2) 데이터 접근 제한을 걸 수 있는지
    에 따라 만족하면 객체지향, 그렇지 않으면 절차적 성격을 띈다고 봄

OPP 4대 특징

추상화 abstgraction

객체들의 공통적인 속성, 기능을 뽑아 이름을 붙임

클래스
  • 분류에 대한 개념 즉, 같은 특성을 가진 여러 객체를 총칭하는 집합의 개념 e.g.사람
  • 어떤 문제를 해결하기 위해 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것
인스턴스 (객체)
  • 분류된 실체, 사물 e.g. 철수, 영희
  • 인스턴스(객체) : 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터

캡슐화 encapsulation

  • 객체 내의 데이터를 유지하고 보호하기 위해 존재

  • 특정 객체가 독립적으로 역할을 제대로 수행하기 위해 필요한 데이터와 기능을 하나로 묶은 것 (모듈화의 의미)

  • 라이브러리와 같이 변수와 함수를 재사용할 수 있다

  • 정보를 객체 안에 포함시키고, 그 정보에 대한 직접 접근은 허용하지 않는 대신(정보 은닉), 필요에 따라 확인할 수 있는 인터페이스를 외부에 공개하는 방식

e.g. Java: 접근 제어자를 통해 접근 허용 범위 지정

상속 inheritance

  • 클래스 사이에는 부모와 자식 클래스가 존재할 수 있다 → 객체들 간의 관계를 구축할 수 있다
  • 부모 클래스의 속성과 메소드를 자식 클래스에서 물려 받는 것
  • 자식 클래스에서는 더 필요한 속성이나 메서드을 확장해서 사용할 수 있다
하위 클래스 - 상위 클래스
  • 하위 클래스는 상위클래스 특성을 재사용하고, 확장한다.
  • 상위 클래스의 물려줄 특성이 많을수록 좋다
인터페이스
  • 다중 상속 대신 도입
  • 어떤 객체가 해야할 일을 정의하는 추상 자료형
  • 구현 클래스 is able to 인터페이스 (ex. Runnable)
  • 인터 페이스는 구현을 강제할 메서드가 적을수록 좋다

다형성 polymorphism

  • 모듈이 갖고있는 정체성과 표현방식
  • 다형성을 극대화 하기 위해 추상클래스나 인터페이스를 이용한다.
오버라이딩
  • 부모클래스에서 상속받은 데이터를 자식클래스에서 재정의하여 사용하는 것
class OverloadingTest{
    //이름이 cat인 메서드
    void cat(){
        System.out.println("매개변수 없음");
    }
    
    //매개변수 int형이 2개인 cat 메서드
    void cat(int a, int b){
        System.out.println("매개변수 :"+a+", "+b);
    }
    
    //매개변수 String형이 한 개인 cat 메서드
    void cat(String c){
        System.out.println("매개변수 : "+ c);
    }
    
}
 


출처: https://private.tistory.com/25 [공부해서 남 주자]
오버로딩
  • 같은 이름을 가진 메소드를 인자(parameter)의 타입과 개수에 따라 여러개 만들 수 있는 것
  • 같은 이름의 메소드일지라도 원하는 기능이 다를 수 있으니, 받는 인자에 따라 기능을 다르게 정의하는 것.
class OverloadingTest{
    //이름이 cat인 메서드
    void cat(){
        System.out.println("매개변수 없음");
    }
    
    //매개변수 int형이 2개인 cat 메서드
    void cat(int a, int b){
        System.out.println("매개변수 :"+a+", "+b);
    }
    
    //매개변수 String형이 한 개인 cat 메서드
    void cat(String c){
        System.out.println("매개변수 : "+ c);
    }
    
}
 


출처: https://private.tistory.com/25 [공부해서 남 주자]

OOP 5원칙 (SOLID)

  • Single Responsibility Principle,SRP 단일 책임 원칙
    • 하나의 클래스하나의 목적을 위해서 생성되며, 클래스가 제공하는 모든 서비스는 하나의 책임을 수행하는 데 집중되어 있어야 한다는 원칙입니다.
    • → 어떤 변화에 의해 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 함
    • SRP 원리를 적용하면 책임 영역이 확실해지기 때문에 한 책임의 변경에서 다른 책임의 변경으로의 연쇄작용에서 자유로울 수 있다
    • 코드의 가독성 및 유지보수에 있어서 유리합니다.
    • 객체 지향 프로그래밍의 5원칙 중 나머지 4원칙의 기초가 되는 원칙
  • Open Closed Principle, 개방 - 폐쇄 원칙
    • 확장에는 열려있고 변경에는 닫혀있어야 한다.
    • 개발 요구사항의 변경이나 추가사항이 발생하더라도 기존 구성요소를 수정하지 않고 확장해서 재사용할 수 있어야 한다
    • 재사용 코드를 만드는 기반이며 객제지향의 장점을 극대화하는 원리
  • Liskov Substitution Principle, 리스코프 치환 원칙
    • 자식 클래스는 항상 부모클래스를 대체할 수 있어야 한다. → 부모클래스 자리에 자식 클래스가 들어가도 동작에 문제가 없어야한다.
  • Interface Segregation Principle,. 인터페이스 분리 원칙
    • 클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안 된다.
    • 하나의 큰 인터페이스를 상속 받기 보다는 인터페이스를 구체적이고 작은 단위들로 분리시켜 꼭 필요한 인터페이스만 상속
  • Dependency Inversion Principle, 의존 관계 역전 원칙
    • 상위 모듈은 하위 모듈에 의존해서는 안된다. 둘 다 추상화에 의존해야한다.
    • 추상화는 구체적인 것에 의존해서는 안된다. 구체적인 것은 추상화에 의존해야한다


참고)

0개의 댓글