개요
어떤 문제를 코딩으로 해결하는 접근 방법은 한 가지만 존재하지 않는다. 같은 문제라도 단순히 A의 실행이 끝나면 B를 실행하도록 하는 방법이 있는가 하면, 실생활의 사물에 빗대어 서로 상호작용하는 것처럼 만드는 방법도 있다. 이렇게 프로그램을 개발하는 방법들을 프로그래밍 패러다임 이라고 부른다. 이번에는 각각의 패러다임이 지니는 특징과 지켜야할 원칙 등을 알아보도록 하겠다.
분류
프로그래밍 패러다임은 크게 명령형(Imperative), 선언형(Declarative)으로 나뉘고, 또 명령형은 절차지향(Procedural), 객체지향(Object-Oriented) 등의 하위 집합으로, 선언형은 함수형(Functional), 논리형(Logic) 등으로 나뉜다. 각각의 소분류에서 대표적인 패러다임 몇 가지만 소개하겠다.
절차형 프로그래밍
개념
절차적 프로그래밍 패러다임(Procedural Programming Paradigm)은 가장 원시적인 접근법으로, 문제 해결에 필요한 절차들을 차례대로 해결해 나가도록 구성하는 패러다임이다.
특징
- 과정이 그대로 코드로 구현되어있기 때문에 가독성이 좋고, 실행 속도가 빠르다.
- 겹치는 부분이 많은 두 개의 비슷한 로직이라도 모두 처음부터 끝까지 구현되어있어 모듈화 하기가 어렵고, 때문에 유지 보수가 어렵다.
대표 언어
- C, C++
객체 지향 프로그래밍
개념
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 상태와 행위로 이루어진 객체로 만들어, 그 객체끼리 상호작용을 하며 문제를 해결하도록 구성하는 패러다임이다.
특징
- 객체 지향 프로그래밍의 특징 4가지:
- 캡슐화: 객체의 속성(= 데이터)와 메서드(= 데이터를 처리하는 행위)를 하나로 묶고, 외부에는 그 세부 내용을 공개하지 않음으로 데이터의 직접 접근을 막는 것. 자바의 퍼블릭과 프라이빗
- 상속성: 다른 클래스가 가진 속성와 메서드를 받아 재사용하거나, 필요한 것을 더 추가할 수 있는 것. 자바의 익스텐드
- 추상화: 복잡한 객체로부터 핵심적인 개념이나 기능을 간추려내는 것. 자바의 인터페이스와 임플리먼트
- 다형성: 같은 메서드가 상황에 따라 다른 기능을 수행하는 것. 자바의 오버로딩과 오버라이딩
- 오버로딩: 같은 이름을 가지지만 다른 매개변수(갯수나 타입)를 받는 메서드를 여러 개 만들어, 같은 클래스에서 같은 메서드를 호출해도 다른 매개변수를 받을 때 다른 기능을 수행할 수 있도록 만드는 것.
- 커피 메이커라는 클래스의
커피_줘()
라는 메서드는 커피콩만 받으면 아메리카노를, 커피콩과 우유를 받으면 라떼를 준다.
- 커피 메이커라는 클래스의
- 오버라이딩: 다른 클래스로부터 받은 메서드를 다시 만들어, 다른 클래스에서 같은 메서드를 호출할 때 다른 기능을 수행할 수 있도록 만드는 것.
- 커피 메이커를 상속받은 아메리카노 메이커와, 라떼 메이커는
커피_줘()
라는 같은 이름의 메서드를 가지고 있지만, 실행하면 각각 아메리카노와 라떼를 준다.
- 커피 메이커를 상속받은 아메리카노 메이커와, 라떼 메이커는
- 오버로딩: 같은 이름을 가지지만 다른 매개변수(갯수나 타입)를 받는 메서드를 여러 개 만들어, 같은 클래스에서 같은 메서드를 호출해도 다른 매개변수를 받을 때 다른 기능을 수행할 수 있도록 만드는 것.
- 위의 특징들 덕분에 모듈화가 쉽고, 때문에 유지보수가 쉽다.
- 설계에 많은 시간이 소요되며, 처리 속도가 다른 패러다임에 비해 느리다.
설계 원칙
위에서 언급한 특징을 지니게 하려면 다섯 가지 설계 원칙을 지켜야 하는데, 이 다섯가지 원칙의 영어 이니셜을 따와 SOLID 원칙이라고 부른다.
Single Responsibility Principle(단일 책임 원칙, SRP)
모든 클래스는 각각 하나의 책임만 가져야 한다는 원칙이다. 각각 기능A와 기능B를 위해 만들어진 클래스1과 클래스2가 있다고 할 때, 기능B의 수정이 클래스2에서 일어난다 해도 클래스1에서는 수정이 일어나지 않도록 설계하는 것이다.
Open Closed Principle(개방 폐쇄 원칙, OCP)
수정에는 닫혀있고, 확장에는 열려있도록 해야 한다는 원칙이다. 어떤 기능을 추가할 때 기존 코드를 수정하지 않고도 추가할 수 있게 설계하는 것이다.
Liskov Substitution Principle(리스코프 치환 원칙, LSP)
상위 클래스를 상속받은 하위 클래스는 상위 클래스의 자리에 대신해 들어가도 문제없이 작동할 수 있도록 만들어야 한다는 원칙이다.
Interface Segregation Principle(인터페이스 분리 원칙, ISP)
하나의 일반적인 인터페이스보다, 구체적인 여러 개의 인터페이스를 만들어야 한다는 원칙이다. 인터페이스를 너무 범용적으로 만들어서 사용하지도 않는 메서드를 구현하지 않도록, 인터페이스를 작고 구체적이게 설계하는 것이다.
Dependency Inversion Principle(의존 역전 원칙, DIP)
상위 패키지가 변하기 쉬운 하위 패키지를 의존하지 않도록 만들어야 한다는 원칙이다. 인터페이스는 상위 패키지에, 그 구현체는 하위 패키지에 두어 인터페이스가 하위 패키지에서 구현되도록 설계하는 것이다. 이렇게 만들면 하위 패키지에 수정이 필요해도, 하위 패키지를 직접 수정하지 않고 새로운 패키지를 만들어 갈아 끼울 수 있다.
대표 언어
Java, C# 등
함수형 프로그래밍
개념
문제를 작게 나누고 그 작은 문제를 해결하는 함수들을 연결하는 것으로 문제를 해결하는 패러다임이다.
예를 들어, 입력값 x와 y를 받아 x^y의 값을 반환하는 기능을 구현한다고 하자.
- 절차형 프로그래밍은 x값을 받아 저장해놓고 y값을 받아 x^y의 계산 값을 반환하는 방식이다.
- 함수형 프로그래밍은 x값을 받아 x^?를 계산하는 함수를 만들고, 그 반환된 함수를 실행시켜 나머지 y값을 받아 계산해서 값을 반환하는 방식이다.
특징
- 순수 함수로만 이루어져 있다. 순수 함수란, 출력이 입출력에만 의존하고, 다른 저장된 값을 사용하지 않는다는 것을 의미한다.
- 부수 효과가 없다. 부수 효과란, 함수가 다른 저장된 값을 사용해 그 값이 바뀌면 반환 값이 바뀌는 것을 의미한다.
- 고차 함수로 로직을 구현한다. 고차함수란 함수 자체를 값처럼 매개변수로 받아 로직을 생성하는 함수를 말한다.
- 고차 함수를 쓰기 위해선 언어가 일급 객체라는 특징을 가져야 한다.
- 변수나 메서드에 함수를 할당할 수 있다.
- 함수 안에 함수를 매개변수로 담을 수 있다.
- 함수가 함수를 반환할 수 있다.
- 자바는 함수형 인터페이스를 제공함으로 함수형 프로그래밍을 가능케 한다.
- 고차 함수를 쓰기 위해선 언어가 일급 객체라는 특징을 가져야 한다.
- 작은 문제를 해결하기 위한 함수를 작성하여 가독성을 높이고 유지보수를 용이하게 해준다.
- 부수 효과가 없는 순수 함수로 이루어져있어, 스레드에 안정성을 보장하고, 때문에 병렬처리를 동기화 없이 진행할 수 있다.
구현 언어
- 클로저(Clojure), 스칼라(Scala) 등
예상 질문
- 객체 지향 언어에 대해 설명해주세요.
흐름
1. 객체 지향이 어떤 환경에서 사용되는 언어인지 설명 2. 해당 환경에 대해 설명답변
1. 객체 지향 언어는 자바나 자바스크립트와 같이 객체 지향 프로그래밍 환경에서 사용되는 프로그램 언어를 말합니다. 2. 객체 지향 프로그래밍은 프로그래밍 방법론의 하나로, 프로그램을 속성과 행위로 이루어진 객체로 나눠 객체끼리 상호작용을 통해 문제를 해결해 나가도록 설계하는 방법입니다.- 객체 지향 언어의 특징과 장단점을 설명해주세요.
흐름
1. 객체 지향 언어 특징 4가지 설명 2. 장점 설명 3. 단점 설명답변
1. 객체 지향 프로그래밍의 특징으로는 캡슐화, 상속성, 추상화, 다형성이 있습니다. 캡슐화란 객체의 속성와 행위의 일부를 외부에 감추는 것이고, 상속성은 다른 객체의 속성과 행위를 받아와 사용하거나 재정의 함으로 재사용성을 높이는 것, 추상화란 복잡한 시스템으로부터 핵심적인 기능만 간추려내는 것, 그리고 다형성은 객체나 그 행위가 상황에 따라 다르게 동작하는 것입니다. 2. 장점은 코드를 객체로 모듈화함으로 재사용이 쉽고, 따라서 생산성이 향상됩니다. 또, 캡슐화라는 특성 덕에 유지보수가 쉽습니다. 3. 하지만 단점은 설계에 시간이 오래 걸린다는 점, 또 처리 속도가 상대적으로 느리다는 점이 있습니다.- 객체 지향 프로그래밍에서 지켜야할 5가지 설계 원칙에 대해 설명해주세요.
흐름
1. SOLID 원칙 설명 2. S 설명 3. O 설명 4. L 설명 5. I 설명 6. D 설명답변
1. 객체 지향적으로 설계하려면 SOLID 원칙을 지켜야합니다. SOLID 원칙은 5가지 원칙의 앞글자를 따온 단어인데, 단일 책임 원칙, 개방 폐쇄 원칙, 리스코프 치환 원칙, 인터페이스 분리 원칙, 그리고 의존성 역전 원칙입니다. 2. 단일 책임 원칙은 하나의 클래스는 하나의 책임만 맡아, 수정이 일어나는 이유도 그 책임에 대한 것이어야 한다는 것입니다. 3. 개방 폐쇄 원칙은 수정에는 닫혀있고, 확장에는 열려있어야 한다는 것입니다. 4. 리스코프 치환 원칙은 상위 객체를 상속받은 하위 객체는 상위 객체 자리에 대신 들어가도 문제 없어야 한다는 것입니다. 5. 인터페이스 분리 원칙은 하나의 범용적인 인터페이스를 만들어 쓸 데 없는 메서드를 구현시키는 것보다 작게 나뉜 구체적인 인터페이스를 사용하는게 더 낫다는 것입니다. 6. 의존성 역전 원칙은 잘 변하지 않는 상위 객체는 변하기 쉬운 하위 객체에 의존하면 안된다는 것입니다.- 함수형 프로그래밍에 대해 설명해주세요
흐름
1. 패러다임 대분류 중 어느 것에 속하는지 설명 2. 프로그램 구현 방법에 대해 설명 3. 특징 설명 4. 장점 설명 5. 단점 설명답변
1. 함수형 프로그래밍은 선언적 프로그래밍 패러다임에 속하는 방법론입니다. 2. 함수형 프로그래밍은 문제해결에 필요한 로직을 "순수 함수"라는 부수효과가 없는 작은 함수로 나눠 블록처럼 쌓아 구현하는 방식으로 설계합니다. 3. 함수형 프로그래밍은 함수가 함수를 매개변수로 받고 함수를 반환값으로 내보낼 수 있는 "고차 함수"를 통해 재사용성을 높입니다. 4. 함수형 프로그래밍으로 설계된 함수는 외부에 영향을 받지 않으므로 동작을 예측하기 쉽고, 스레드끼리 상태를 공유하지 않아 동시성 프로그램을 작성하기 쉽습니다.- 순수 함수, 고차 함수에 대해 설명해주세요.