프로그래밍 패러다임 (programming paradigm)
프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론이다.
객체지향 프로그램이과 함수형 프로그래밍을 예로 들어보자.
- 객체지향 프로그래밍 : 상호작용하는 객체들의 집합
- 함수형 프로그래밍 : 상태 값을 지니지 않는 함숫값들의 연속
Java의 프로그래밍 패러다임
jdk 1.8 이전의 자바는 객체지향 프로그래밍을 지원했었지만,
이후로는 함수형 프로그래밍 패러다임을 지원하기 위해 람다식, 생성자 레퍼런스, 메서드 레퍼런스를 도입했다.
추가로 선언형 프로그래밍을 위해 스트림(stream) 표준 API도 추가했다.
선언형 프로그래밍과 함수형 프로그래밍
선언형 프로그래밍(declarative programming)은 '무엇을' 풀어내는가에 집중하는 패러다임이다.
또한, 함수형 프로그래밍은 선언형 패러다임의 일종이다.
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
//순수함수 reduce()
Integer result = list.stream().reduce((a, b) -> a + b).get();
//메서드 레퍼런스 사용 -> Integer::sum
Integer result2 = list.stream().reduce(Integer::sum).get();
위의 reduce()는 '배열'을 받아서 누적한 결과값을 반환하는 순수 함수이다.
함수형 프로그래밍은 위와 같은 작은 '순수 함수'들을 여러개 쌓아 로직을 구현하고 '고차 함수'를 통해 재사용성을 높인 프로그래밍 패러다임이다.
순수 함수
순수 함수 : 출력이 입력에만 의존하는 함수
public int sum(int a, int b){
return a + b;
}
위의 함수(메서드)는 입력(매개변수) a, b에만 의존한다.
만약 a, b가 아닌 다른 전역 변수 c 등이 이 출력에 영향을 주면 이는 순수 함수가 아니다.
고차 함수 : 함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 것을 말한다.
객체지향 프로그래밍
객체지향 프로그래밍(Object-Oriented Programming) : 객체들의 집합으로 프로그램의 상호작용을 표현하며 데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 활용하는 방식을 말한다.
객체지향 프로그래밍 예시
객체 Accumulator를 만들어서 내부에 선언된 getMax() 메서드를 활용하여 최대값을 구한다.
(아래 절차지향 프로그래밍 예시에서 같은 내용의 코드를 다룬다.)
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Accumulator accumulator = new Accumulator();
int result = accumulator.getMax(list);
System.out.println("max : " + result);
}
}
class Accumulator{
public int getMax(List<Integer> list){
return list.stream()
.mapToInt(Integer::intValue)
.max()
.orElse(0);
}
}
객체지향 프로그래밍의 특징
객체지향 4대 특성(캡슐화, 상속, 다형성, 추상화)
2024.02.02 - [Computer Science/프로그래밍 이론] - [CS] 객체지향 4대 특성(캡슐화, 상속, 다형성, 추상화)
객체지향 5원칙 SOLID
2024.02.02 - [전체 글 보기] - [CS] SOLID : 객체지향 설계 5 원칙
절차형 프로그래밍
절차형 프로그래밍은 로직이 수행되어야 할 연속적인 계산 과정으로 이루어져 있다.
진행되는 순서대로 코드를 짜기만 하면 되기 때문에 가독성이 좋고, 객체지향 프로그래밍에 비해 실행 속도가 빠르다.
단점으로는 모듈화하기 어렵고, 유지보수성이 떨어진다는 점이 있다.
절차지향 프로그래밍 예시
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
int max = Integer.MIN_VALUE;
for(int i = 0; i < list.size(); i++){
max = Math.max(max, list.get(i));
}
System.out.println("max : " + max);
}
}
가장 좋은 프로그래밍 방법?
가장 좋은 프로그래밍 방법은 뭘까? 언제나 "무조건 가장 좋은" 건 없다. 비즈니스 로직이나 서비스 특성에 따라 패러다임을 정하는 게 좋다. 또한, 패러다임을 한 가지로 정하지 않아도 된다. 하나의 서비스 내에서 로직에 따라 여러 패러다임을 조합하여 각 패러다임의 장점을 취해 개발하는게 좋다.
'컴퓨터 공학 > 프로그래밍 이론' 카테고리의 다른 글
[CS] SOLID : 객체지향 설계 5 원칙 (0) | 2024.02.02 |
---|---|
[CS] 객체지향 4대 특성(캡슐화, 상속, 다형성, 추상화) (0) | 2024.02.02 |
[Computer Science/디자인 패턴] 전략 패턴(strategy pattern) (0) | 2024.01.25 |
[Spring Boot] DispatcherServlet - 스프링부트의 동작 구조 (0) | 2024.01.22 |
[Spring / 스프링 부트 핵심 가이드] 디자인 패턴 정리 (0) | 2023.10.01 |