#1 OOP(Object-Oriented Programming)

0_23·2022년 12월 25일
0

[Nomard Corders][OOP]

목록 보기
1/3
post-thumbnail

이번 포스트는 OOP에 대해서 정리해보는 포스트를 작성한다.
OOP에 대해 들어가기전에 '함수형 프로그래밍'에 대해 알아햐 한다. '함수형 프로그래밍'은 코드 작성 '스타일' 이라고 할 수 있다. 즉, 개발자가 함수형 프로그래밍을 배우고 해당 컨셉과 아이디어를 좋아한다면 해당 개념을 어떤 프로그래밍 언어든 바로 적용해서 사용할 수 있다. 그저 코드를 작성하는 '스타일'이기 때문이다!

물론 Clojure나 Scala와 같이 아예 함수형 프로래밍으로 설계된 언어들도 있다. 이러한 언어들은 빌트인 기능이 있어서 함수형 코드를 작성하기 쉽다. 아무튼 무슨언어로 코드를 작성하든 함수형 프로그래밍을 배워두면 도움이 될 것이다! 함수형 프로그래밍을 배우면 프로그래밍 문제를 해결할 때 유용한 새로운 관점과 접근 방식을 얻을 수 있다. 이것은 일종의 코드를 쓰고 설계하는 새로운 관점 또는 사고 방식을 배우는 것으로 하루 아침에 완성되는 것이 아니다.

함수형 방식의 코드는 코드가 클린해지고 버그가 쉽게 숨겨지지 않기 때문에 버그 자체가 발생하기 어렵다. 하지만 함수형 프로그래밍을 배우는 것 또한 어렵다. 이는 컨셉이 이해하기 어려워서가 아닌 함수형 프로그래밍에 대한 많은 설명들이 purity, immutability, side effectsr 같은 개념의 정의에만 집중하기 때문이다. 이러한 개념들의 정의만 할 뿐 정작 개발자들에게 '왜' 더 좋은 건지 설명하지 않는다.

함수형 프로그래밍은 실제로 코딩을 하면서 동기가 될만한 '경험'을 하지 않는한 잘 하려고 하지 않고 다른 이들에게 전파가 힘들기 때문이다. 먼저 함수형 프로그래밍으로 작성된 코드와 아닌 코드를 비교하면서 어떻게 다르고, 어떤 장점이 있는지, 무엇이 더 좋은지 알아보자.

'명령형(imperative) 코드'와 '선언형(declarative) 코드'간의 차이를 먼저 살펴보자. '선언형 코드'를 작성하면, 원하는 결과를 표현하기 위해 코드가 작성된다. '명령형 코드'를 작성하면, 원하는 결과를 얻기 위해 필요한 지침에 따라 코드가 작성된다.

자주 사용하는 '선언형 코드'의 예시를 살펴보자. 바로 그것은 선언형 언어인 CSS이다. 예를 들면 CSS로 배경색을 tomato색으로 변경하고 싶으면 이를 위해

'background-color : tomato;' 만 적으면 된다. 보다시피 원하는 결과를 얻기위한 단계를 작성하지 않았다. 내가 직접 body 요소를 가져오고, 존재하는지 확인하고, 스타일에 엑세스하고, 배경색을 재정의하는 등의 작업을 할 필요가 없이 원하는 결과값을 브라우저에게 말하면, 브라우저가 이를 어떻게 해낼지 알아내기 때문이다. 만약 그렇게 작업을 했다면 그건 '선언형 코드'가 아닌 '명령형 코드'이다. 즉, '선언형 코드'는 원하는 '결과값'을 선언하는 것이고, '명령형 코드'는 그 결과값에 '어떻게' 도달하느냐에 관한 것이다. 명령형 그리고 선언형을 둘다 비교하면서 분석해보자. 예시에서는 '선언형 코드' 형태의 함수를 갖고 있으면서 명령형 코드인 JavaScript를 사용할 것이다.

텍스트 문자열에서 공백을 제거하고, 그 부분에 💖으로 대체하는 함수를 만들 것이다. 명령형 코드에서 이를 해결하는 방식은 다음과 같다.

코드를 살펴보면 먼저 최종 결과를 보유할 변수를 'result'라는 변수를 만들었다.그 다음 지우려는 텍스트의 각 문자 내부를 살펴보고, 문자가 공백인지 여부에 따라서 결과 문자열에 💖를 추가하고 있다. 완료 후 결과값인 'result' 변수를 리턴한다. 보다시피 이 코드는 '명령형 코드'이다. 요구사항을 충족하는데 필요한 모든 단계를 하나씩 작성하고 있다.

이번에는 동일한 함수인데 선언형 코드인 코드를 살펴보자.

여기서는 모든 문자열이 갖고있는 'replaceAll'이라는 메서드를 사용하고 있다. 첫번째 인수는 바꾸고 싶은 텍스트이고, 두번째 인수는 이를 무엇으로 바꿀 것인가를 뜻한다.

이처럼 명령형 코드로 작성한 함수와 동일한 결과를 갖지만, 읽기가 더 쉽고 함수가 무슨 역할을 하는지 이해하기 편하다. 어쩌면 replaceAll 함수의 내부 작업에서는 앞서 작성한 명령형 코드가 있을 수 있다.

그래서 모든 선언형 코드는 명령형 코드 위에 쓰여진다는 말할 수 있다. 그러나 명령형 코드 대신에 명령형 코드 방식을 피할 수 있는 함수등을 활용할 수 있다.

명령형 방식에서 코드가 길어지는 것 외에 또다른 문제점은 요구사항의 구현이 개발자에게 달려있기 때문에 코드를 원하는 대로 작성하다 보면 버그나 실수가 더 생길 수 있고, 함수가 정확히 무엇을 하려고 하는지 한줄 한줄 자세히 읽어야 한다. 이로인해 팀 동료들 또한 해당 코드를 이해하기 더 어려울 수 있다.

마지막 코드 예시는 모든 홀수를 제거하고 정리된 배열을 반환하는 함수로 예시를 들어보도록 하겠다. 명령형 코드는 다음과 같이 작성된다.

그러나 선언형 코드 버전은 .filter를 사용하며 다음과 같이 작성된다.

.filter 메서드의 첫번째 인수는 함수이다. 함수형에서는 자주 쓰이는 방식인데, 함수를 인수로 보내고 때로는 함수를 값으로 받기도 한다. .filter 함수는 조건을 통과하는 모든 요소를 포함하는 배열을 반환한다.

조건은 첫번째 인수에 있는 함수로 표현되며, 이 함수는 항목 배열의 각 항목에 대해 호출된다. 해당 함수가 true를 반환하면 결과 배열에 항목이 추가되고 false를 반환하면 항목은 사라지게 된다. 보다시피 배열에 필요한 필터가 무엇인지 설명했을 뿐 '어떻게' 적용되는지는 중요하지 않는다.

이상 함수형 프로그래밍에 대한 설명이었다.

0개의 댓글