이카's
article thumbnail

프로그래밍 패러다임

paradigm

 

 

사전에 정의 되어있는 것만 봐도 이해하기 힘든 단어이다. 이걸 어떻게 하면 쉽게 소개를 할까? 고민을 하다가 한 문장이 마음에 갔다.

프로그래머에게 프로그래밍의 관점을 갖게 해주는

사실 이 한 문장에 다 포함되어 있는 것 같다. 앞으로의 내용은 이 문장을 바탕으로 설명 해보려고 한다.

패러다임은 아래와 같이 있다.

  • 절차적 프로그래밍 (PP, Procedure Programming)
  • 객체지향 프로그래밍 (OOP, Object Oriented Programming)
  • 함수형 프로그래밍 (FP, Functional Programming)

이것 뿐만이 아니라 많은 프로그래밍 패러다임이 있지만, 이 3가지만 다루고자 한다.

 

함수형 프로그래밍(FP) & 선언형 프로그래밍(IP)

 

선언형 프로그래밍

무엇을 풀어내는가에 집중하는 프로그래밍.

예를 들어, 웹 페이지는 선언형인데 웹페이지는 제목, 글꼴, 본문, 그림과 같이 "무엇"이 나타나야하는지를 묘사하는 것이지 "어떤 방법으로" 컴퓨터 화면에 페이지를 나타내야 하는지를 묘사하는 것이 아니기 때문이다. 선언형 프로그램은 목표를 명시하고 알고리즘을 명시하지 않는 것이다. - 위키백과

위키백과에 따른 정의를 해석하자면, 선언형 프로그래밍은 무엇이라는 단어에 초점이 되어있다. 또한 개발자가 알고리즘을 명시하지 않고, 목표를 명시한다는 것이다.

예를 들어 커피 100잔을 주문한다고 가정하자.

선언형 프로그래밍이라면, 커피 100잔을 만드는 것이 포커스이다.

  • 세부적인 내용(요구사항)은 사전에 준비된 상태입니다.
  • 카페사장명령만 내리는 것만 가지고 커피 100잔(결과물)을 만든다.

여기서 선언형을 위해 명령형 단계가 사전에 준비되어 있어야 한다는 것이 대전제로 깔린다.

function sqrt (arr) {
  return (arr.map(x => x ** 2));
}

위 코드에서 볼 수 있듯이, 결과만 기술하고 내용은 기술하지 않는 프로그래밍 방법이다. 장점으로 의도에 집중한 프로그래밍이라는 것고, 프로그램은 함수로 이루어진 것이다. 라는 뜻을 가지고 있다.

 

함수형 프로그래밍

함수형 프로그래밍은 선언형에서 파생된 프로그래밍 패러다임이다. 예를들어 정수 최대값을 찾으려고 한다라고 생각해보자

const list = [1,2,3,4,5]
const fp = list.reduce((max, num) => num > max ? num : max, 0)

함수형 프로그래밍은 순수 함수를 블록처럼 쌓아 로직을 구현하고 고차 함수를 통해 재사용성을 높인 프로그래밍 패러다임입니다. 특히, 자바스크립트에서는 함수형 프로그래밍을 많이 선호하는데, 함수가 일급 객체이기 때문입니다.

 

순수함수

출력이 입력에만 의존하는 것

const pure = (a, b) => {
  return a + b
}

pure 함수 처럼 파라미터 a, b에만 영향을 받고, 다른 전역 변수에 영향을 주지 않는 함수

 

일급 객체

  • 변수, 메서드에 함수를 할당할 수 있다.
  • 함수 안에 함수를 매개변수로 담을 수 있다.
  • 함수가 함수를 반환할 수 있다.

 

객체지향 프로그래밍

사실 아직도 이해가 안가는 부분이 많은 것이 이 부분이다. 현재 내가 이해하고 있는 객체지향은 단순히 컴퓨터의 절차적으로 문제를 처리하고, 결과를 도출하는 것이 아니다. 이를 다른 시각으로 바라본 패러다임이다. 즉, 독립적으로 기능을 가지고, 이 독립적인 코드들이 협력하여 하나의 결과로 도출하는 것이 객체지향이라고 생각한다.

class List {
  private int[] arr = new int[];
  public List(arr) {
      this.arr = arr;
  }

  public getArr() {
    return arr.toString();
  }
}

자바코드로 간단하게 짜봤다. 클래스 List에 생성자를 만들고, getArr()메서드로 배열을 반환하는 예제이다.

 

객체지향의 4가지 특징

객체지향은 크게 4가지 특징이 있다.

  • 추상화
    • 핵심적인 개념, 기능을 간추려 내는 것을 의미
      즉, 어떤 사물의 성질, 특징, 공통성, 본질과 같은 추상적인 개념을 파악하고 정의하는 것을 말한다.
  • 상속
    • 상위 클래스의 특징을 하위 클래스가 상속받아 재사용하거나 기능을 추가하는 것을 말한다. 반복적인 코드를 최소화하고 공유하는 속성과 기능을 쉽게 접근하여 사용을 편하게 할 수있다.(재사용성 증가)
  • 다형성
    • 하나의 클래스나 메서드가 다양한 방법으로 동작하는 것을 말한다. 자바에서는 대표적으로 오버로딩, 오버라이딩이 있다.
    • 예를들어 toString() 메서드는 오버라이딩 하라고 권하고 있다.
  • 캡슐화
    • 객체의 속성과 메서드를 하나로 묶고 일부를 외부에 감추어 정보 은닉을 하는 것을 말한다.

 

오버로딩

같은 이름ㅇ르 가진 메서드를 여러 개 선언하는 것을 말한다.

컴파일 중에 발생하는 정적 다형성이다.

 

오버라이딩

주로 메서드 오버라이딩을 말하고, 상위 클래스에서 상속받은 메서드를 하위 클래스가 재정의 하는 것을 말한다.

런타임 중에 발생하는 동적 다형성이다.

 

Referance

참고 자료
CS전공지식노트
위키백과

반응형

'Language > Java' 카테고리의 다른 글

SOILD 원칙  (0) 2023.06.07
디자인 패턴 & 패러다임 모음 - Java  (0) 2023.05.30
옵저버 패턴(Observer) - Java  (2) 2023.05.30
전략 패턴(Strategy) - Java  (0) 2023.05.30
팩토리 패턴(Factory) - Java  (0) 2023.05.30
profile

이카's

@Edan Cafe ☕

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!