TIL 106 | 객체지향 프로그래밍과 함수형 프로그래밍

hyounglee·2021년 1월 8일
0

CS

목록 보기
1/5
post-thumbnail

코어 자바스크립트를 공부하면서 객체지향형 프로그래밍, 함수형 프로그래밍 이라는 말이 자주 등장하는데, 설명에 사용되는 개념도 어렵고 모호해서 항상 찝찝한 기분이 들었다. 제대로 개념을 이해하고 넘어가야 하는 CS 기초 중의 기초.. 확실하게 짚고 넘어가보자.

텍스트로 공부하기 전에 반드시 아래 유튜브를 시청할 것을 강력히 권고합니다...!

[얄팍한 코딩사전] 객체지향 프로그래밍이 뭔가요?
[얄팍한 코딩사전] 함수형 프로그래밍이 뭔가요?

객체지향 프로그래밍(OOP)

주요 키워드

# 상속 # 추상화 # 캡슐화 # 다형성

컴공과 교수님들의 비유

_상태나 메소드_를 의미하는 밀가루 반죽과 팥이 _클래스_라는 붕어빵 틀에 찍혀서 _객체_라는 붕어빵이 나오는 것이다.

객체지향이란 어떤 프로그래밍 방식, 즉 방법론이다. 데이터와 기능이 클래스로 **'캡슐화'**된 컴퓨터 자원의 묶음을 객체라고 한다.

이전에는 하나하나 명령어를 줘 가면서 코드를 짜야 했다면 객체지향 프로그래밍에서는 클래스라는 틀이 생겨서 안에 재료만 넣으면 객체가 탄생하는 것이다!

캡슐화

객체 지향은 기본적으로 캡슐화를 통해서 한 곳의 변화가 다른 곳에 미치는 영향을 최소화한다. 내부 구조는 private으로 감춰놓고, 외부에서 조작할 수 있는 명령어만 public으로 공개해두는 것이다. 캡슐화를 하면 바깥으로부터 발생하는 오류를 방지할 수 있고, 남이 만든 클래스의 객체들도 일일이 뜯어보지 않고도 제공되는 기능을 그대로 사용할 수 있다. 데이터를 private로 감춰두는 것을 은닉성이 있다고 한다.

상속

하나의 클래스가 가진 특징(데이터, 함수)을 그대로 다른 클래스에 물려주는 것을 의미한다.

추상화

객체에서 공통된 속성과 행위를 추출하는 것을 추상화라고 한다.

추상 클래스

추상 메소드를 하나라도 포함하는 클래스를 추상 클래스라고 한다. 추상 클래스로는 객체를 만들 수 없다. 자식 클래스들의 공통분모 역할만을 위한 클래스이다. 메소드의 선언부에 abstract 키워드를 붙이면 추상 메소드가 된다. 추상 메소드의 구체적인 구현은 하위 클래스에서 오버라이딩 해야 한다.

미완성의 설계도라고 생각하면 된다.

package org.opentutorials.javatutorials.abstractclass.example1;
abstract class A{
    public abstract int b();
    //본체가 있는 메소드는 abstract 키워드를 가질 수 없다.
    //public abstract int c(){System.out.println("Hello")}
    //추상 클래스 내에는 추상 메소드가 아닌 메소드가 존재 할 수 있다. 
    public void d(){
        System.out.println("world");
    }
}
public class AbstractDemo {
    public static void main(String[] args) {
        A obj = new A();
    }
}
// 출처 : 생활코딩

다형성

부모 클래스에서 정의된 메소드의 작업이 자식 클래스에서 다른 것으로 대체될 수 있는 것, 즉 override 되는 것을 의미한다.

interface

자식 클래스는 보통 하나의 분모로만 상속받을 수 있으나, interface는 다른 부모로부터 상속된 자식 클래스들에게 공통의 카테고리를 만들 수 있다고 생각하면 된다. 즉 다중 상속의 기능을 구현할 때 인터페이스를 사용한다.

인터페이스는 추상 메서드만 가질 수 있고, 일반 메서드는 가질 수 없다. 인터페이스의 메서드는 무조건 추상 메서드이기 때문에 굳이 abstract을 입력하지 않아도 자동으로 인식한다.

상속은 물려받는 것, 인터페이스는 장착하는 것이다.

추가

  • 객체지향 프로그래밍은 모듈 재사용 등으로 인해 확장 및 유지보수에 용이하다.

  • 자바스크립트는 프로토타입 기반으로 객체지향 프로그래밍을 할 수 있다.

  • 객체 지향 디자인 패턴을 찾아보면 크고 어려운 문제를 세련되게 해결하는 방법들을 찾아볼 수 있다.

  • 객체 지향 프로그래밍은 앞서 말했듯 방법론이기 때문에 객체 지향 언어라고 불리는 언어에서만 객체지향 프로그래밍이 구현이 가능한 것은 아니다.

함수형 프로그래밍

주요 키워드

# 순수함수 # 객체 # 선언형 # 값 # 모듈화

객체지향과 마찬가지로 함수형 프로그래밍은 프로그래머들이 일하는 패러다임을 제공한다. 함수형 프로그래밍은 객체지향과 대립하는 관계는 아니다.

함수형 프로그래밍에서 함수의 대략적인 특징은 아래와 같다.

  1. 인풋과 아웃풋이 있다.
  2. 외부 환경으로부터 철저히 독립적이다. 외부 요인을 참조하지 않고 오로지 주어진 작업을 수행한다.
  3. 같은 인풋에 있어서는 항상 동일한 아웃풋이 나온다. 즉 순수 함수이다.

함수형 프로그래밍이 주목받게 된 이유는 변수로 인한 부작용 문제로부터 자유롭기 때문이다. 즉 프로그램 내 상태가 변경되지 않는다. 함수형 프로그래밍은 함수의 동작에 의한 변수의 부수적인 값 변경을 원천적으로 배제한다. 외부 변수를 사용하더라도 그 본체에 접근해서 변경하는 것이 아니라 인자로 넣어서 사본으로 복사하여 작업하기 때문에 부작용이 없는 것이다.

그렇다면 어떻게 아무 변수도 사용하지 않고 고정값만 쓰면서 소프트웨어를 만들 수 있을까? 아무런 상태 변화를 일으키지 않는다는 것은 아니다. 모든 것을 100% 함수형 기준에 맞추는 것은 어렵다. 하지만 적어도 일정 단위의 작업에 대해서는 부수효과 없이 안정적이고 예측가능한 프로그램을 짜는게 함수형 프로그래밍이다.

대표적 특징

함수형 프로그래밍은 '선언형'이다.

함수형 프로그램은 인풋만 똑같으면 절대 다른 요인에 의한 변수가 없다. 따라서 어떤 함수에 어떤 인자를 넣으면 무조건 같은 결과를 예측할 수 있을 것이다.

명령형에서는 변수에 대해서만 'A is B' 식으로 생각하고, 함수는 이걸 처리하는 행위적인 개념으로만 생각했다. 이제는 함수도 변수처럼 생각할 수 있어야 하는 것이다.

즉 함수를 값으로 바라보고 프로그래밍하는 것이다.

함수도 '값'이다.

함수가 순수 함수라면, 함수가 인풋으로 하는 일은 일정하기 때문에 여의주만 물려주면 하늘로 승천하는 이무기처럼, **언제든지 인자만 붙여주면 그 인자로써 절대 예측 가능한 결과값을 내게 될 상태라는 '값'**으로 함수를 바라볼 수 있는 것이다.

함수를 값으로 바라보는 목적은 무엇일까?

고계함수

함수를 값으로 볼 수 있다면, 함수도 다른 함수에 인자로서 넣어줄 수 있을 것이다. 우리에게 익숙한 콜백 함수를 의미한다. 인자로 다른 함수를 받아 결과값을 내보내는 함수를 고계함수라고 한다. 다른 함수를 반환하는 함수 역시 고계함수이다.

커링

자바스크립트는 함수형 프로그래밍을 위해 만들어진 함수형 특화 언어는 아니다. 함수형 프로그래밍을 위해 만들어진 언어들을 보면 '커링'이라는 기법을 사용할 수 있다.

여러 인자를 받는 함수에 일부 인자만을 넣어서 나머지 인자를 받는 다른 함수를 만들어낼 수 있는 함수형 프로그래밍 기법을 '커링'이라고 한다. (부분함수)

자바스크립트에서도 bind 함수나 Lodash 같은 라이브러리를 사용해서 커링을 제대로 사용할 수 있다.

리액트에서는?

리액트의 class형 컴포넌트는 객체지향 프로그래밍, function형 컴포넌트는 함수형 프로그래밍 방법론을 따랐다고 말할 수 있는 것인가...?

profile
(~˘▾˘)~♫❝ 쉽게만 살아가면 재미없어 빙고 .ᐟ ❞•*¨*•.¸¸♪

2개의 댓글

comment-user-thumbnail
2021년 1월 18일

유인동 슨새임 강의나 책 한번 살펴보시져

1개의 답글