프로그래밍 패러다임

happiyoung_·2024년 8월 22일

Intro

프로그래밍을 하는 방식에 있어 존재하는 트렌드를 살펴본다.
어떤 방식의 프로그래밍이 있을까?

Sequential Oriented Programming

순차지향프로그래밍 : 위에서 아래로 순서대로 실행

이를 지향하는 대표적인 언어로는 어셈블리어가 있다.

  • 함수의 개념이 존재하지 않음
  • 코드를 위에서 아래로 읽을 뿐
  • jmp라는 키워드를 만나면 프로그램의 실행 위치를 해당 주소로 옮기는 방식으로 코드 동작
add:
		subq    $8, %rsp
		leaq    16(%rsp), %rax
		movq    %rax, 0(%rsp)
		leal    0(%edi,%esi,1), %eax
		addq    $8, %rsp
		ret
main:
   		subq    $8, %rsp
    	leaq    16(%rsp), %rax
    	movq    %rax, 0(%rsp)
    	movl    $2, %edi
    	movl    $3, %esi
    	addq    $8, %rsp
    	jmp     add

Procedure Oriented Programming

절차지향프로그래밍 | 함수형 프로그래밍 : 함수실행흐름을 중심으로 실행

이를 지향하는 대표적인 언어로 C언어나 하스켈이 있다.

  • 프로시저는 절차로 번역되었지만 사실 함수를 의미한다.
  • 함수형 프로그래밍에서는 복잡한 문제를 개별 함수로 분해하고, 여러함수를 이용해 문제를 해결

아래 코드는 위의 어셈블리어를 함수형으로 바꾼것으로 논리적으로 동치이다.

int add(int a, int b){
	return a + b;
}

int main() {
	int a = 2;
	int b = 3;
	return add(a, b);
}

Object Oriented Programming

객체지향 프로그래밍 : 프로그램의 전체 목적에 부합하는 책임을 객체별로 나눠 실행

  • 객체에 어떤 메시지를 전달할 수 있게 된다.
  • 객체가 어떤 책임을 지게 된다.
  • 객체는 어떤 책임을 처리하는 방법을 스스로 알고 있다.

각 알맞는 객체가 알맞는 책임을 가지고 있는지를 살펴야한다.

여기서 캡슐화 의 의미가 나타난다.

전체로직은 분산되었고, 협력 객체들의 내부동작이 어떤지는 알 수 없게 되므로써 내가 어떤 요청을 했을때 이 객체가 알아서 업무를 잘 처리하고 데이터를 잘 돌려줄 것이라고 믿는 것이다. 그래서 협력객체가 어떻게 일을하는지 신경쓰지 않는다.

이것이 바로 캡슐화!

프로젝트의 객체가 가진 책임을 나눠가져야 한다는 것이다.

그렇다면 객체가 책을 다하고 있는지는 어떻게 판단할까?
이때 필요한 개념이 테스트 코드 이다.
이는 추후에 살펴보려고 한다.

class RestaurantChain {
	private List<Store> stores;
    
    public long calculateRevenue() {
    	long revenue = 0;
        for (Store store : stores) {
        	revenue += store.calculateRevenue();
        }
        return revenue;
    }
}

class Store {
	private List<Order> orders;
    private long rentalFee; // 임대료
    
    public long calculateRevenue() {
    	long revenue = 0;
        for(Order order : orders){
        	revenue += order.calculateRevenue();
        }
        return revenue;
    }
}

class Order {
	private List<Food> foods;
    private double transactionFeePercent = 0.03;
    
    public long calculateRevenue() {
    	long revenue = 0;
        for (Food food : foods) {
        	revenue += food.calculateRevenue();
        }
        return revenue;
    }
}

class Food {
	private long price;
    private long originCost;
    
    public long calculateRevenue(){
    	return price;
    }
}
    

Outro

객체지향 프로그래밍을 해야한다고 하여 객체지향 언어를 쓰는 것만으로 그 패러다임을 따라간다고 볼수는 없다. 각각이 지향하는 바가 무엇인지를 알고, 목표에 맞게 설계를 해야한다.

profile
해삐한 다영의 컴퓨터와 친해지기 프로젝트 🥰

0개의 댓글