프로그래밍을 작성할 때의 관점 및 방법론
프로그래밍 언어별로 지원하는 프로그래밍 패러다임이 다르다.
하지만 최근 대부분의 프로그래밍 언어는 여러개의 패러다임을 갖는데, 이를 "멀티 패러다임 언어"라고 부른다.
파이썬은 세 가지 패러다임(함수형, 명령형, 객체지향 (클래스기반))을 지원하는 언어이다.
다중 패러다임 프로그래밍 언어 - 위키백과
멀티패러다임 언어를 사용해야하는 이유
※ (참고)대표적인 프로그래밍 패러다임과 언어
OOP(Object-Oriented Programming) - 객체지향(파이썬, 자바...)
IP(Imperative Programming) - 명령형(C, C++...)
DP(Declarative Programming) - 선언형(SQL...)
FP(Functional Programming) - 함수형(하스칼, 스칼라...)
RP(Reactive Programming) - 반응형(RxJava...)
※ RP 는 선언형 방식을 지향하고 함수형 언어의 도구들을 활용한다.
등등등
함수형 프로그래밍은 하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식이며, 자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임을 의미한다. 함수형 프로그래밍이란?
함수형 프로그래밍은 프로그래밍 언어나 방식을 배우는것이 아니라 함수로 프로그래밍하는 사고를 배우는것이라고 할 수 있다. 즉, 새로운 계산방법을 배우는 것처럼 사고의 전환을 필요로 한다. 다양한 사고방식으로 프로그래밍을 바라보면 더욱 유연한 문제해결이 가능해진다.
※ 명령형과 선언형의 프로그래밍 비교
Q. 여기가 선릉역인데 위코드까지 어떻게 가야할까요?
(명령형)A. 10번 출구로 나와서 직진하세요. 세 번째 코너에서 스타벅스를 끼고 좌회전 하세요. 첫 번째 골목길에서 우회전 하세요. 다음 신호등을 지나 직진하세요.
(선언형)A. 위코드 주소는 강남구 테헤란로 427 입니다.
※ 어떻게(HOW)에 대한 것은 추상화 하고 무엇을(WHAT)에 집중하는 방식
선언형 프로그래밍이란?
장점
단점
파이썬으로 함수형프로그래밍 하기
파이썬에서 함수형으로 프로그래밍하기(영상) - 하원호
고차 함수는 1급 함수의 부분 집합(Subset)이다.
리액트의 고차 컴포넌트(HOC)는 컴포넌트를 사용하여 위의 조건을 만족하는 컴포넌트를 말한다.
# 변수나 데이터에 할당 할 수 있어야 한다.
def print_hello():
print("hello!")
a = print_hello # print_hello 함수를 a라는 변수에 저장
a()
# hello!
# 객체의 인자로 넘길 수 있어야 한다.
def introduce(name):
return "hello, my name is" + name
def goodbye(name):
return "bye bye, " + name
def who_i_am(func, name):
return func(name)
who_i_am(introduce, "hanbin")
# hello, my name is hanbin
who_i_am(goodbye, "hanbin")
# bye bye, hanbin
# 객체의 반환값으로 반환할 수 있어야 한다.
def test_hasher(data):
return "hashed" + data
def get_hasher():
return test_hasher # test_hasher함수를 반환한다.
hasher = get_hasher()
hashed_data = hasher("hanbin")
print(hashed_data)
# hashed hanbin
@Override
public void mainButtonAction() throws IOException {
if(!isEmptyUserName()) doJoinProcess(duplicateCheck());
else setUserNameCheck("닉네임이 공백입니다.");
}
위 코드는 함수로만 코드가 구성되어있다. 추상화 수준이 높다고 할 수 있다.
// 관심사 : Peer의 주소생성
private String getLocalhost() {
return "localhost:"+ (5500 + (int)(Math.random()*100));
}
위 코드는 '+' 같은 연산기호나 (int) 형변환이나 Math.random() 같은 API 사용을 담고 있다. 구체적인 세부 구현사항을 담은 것이다. 이런 함수는 추상화 수준이 낮다고 말할 수있다.
mainButtonAction() 함수는 추상화 수준이 높다. 반면 getLocalhost() 함수는 추상화 수준이 낮다.
이렇듯, 하나의 함수는 하나의 추상화 수준을 가져야 한다.
하나의 함수 안에 높은 추상화 수준과 낮은 추상화 수준이 공존해서는 안 된다. 추상화 수준이 다른 코드가 같은 함수 안에 사용되면 혼란스러워진다.
또한, 추상화 수준이 높은 함수는 위에, 추상화 수준이 낮은 함수는 아래에 작성해야 한다. 이를 내려가기 규칙이라 부른다.