본문 바로가기
프로그래밍 개발/프론트엔드 개발자 기본 지식

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

by Jinseok Kim 2022. 4. 28.
반응형

객체지향 프로그래밍

 

  • 객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.
  • 객체 지향 프로그래밍은 컴퓨터 프로그램을 “객체(Object)"들의 모임으로 파악하고자 하는 프로그래밍의 패러다임 중에 하나입니다. 각 “객체(Object)" 들은 서로 메시지를 주고 받을 수 있으며 데이터를 처리할 수 있습니다.

 

 

 

 

 

객체지향 프로그래밍의 장단점

 

- 장점

 

1. 코드 재사용이 용이

남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있습니다.

 

2. 유지보수가 쉬움

절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 존재하기 때문에 해당 부분만 수정하면 됩니다. 

 

3. 대형 프로젝트에 적합

클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러 명, 여러 회사에서 프로젝트를 개발할 때 업무 분담하기 쉽습니다.

 

 

단점

 

1. 처리 속도가 상대적으로 느림

2. 객체가 많으면 용량이 커질 수 있음

3. 설계시 많은 시간과 노력이 필요




 

 

객체지향 프로그래밍에서의 클래스와 인스턴스(객체)

 

  • 클래스 : 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것으로 객체를 만들기 위한 메타정보라고 볼 수 있습니다.
  • 인스턴스(객체) : 클래스에서 정의한 것을 토대로 실제 메모리에 할당된 것으로 실제 프로그램에서 사용되는 데이터입니다.

 

 

 

 

객체 지향 프로그래밍에서 추상화 

 

  • 추상화는 추상 클래스나 추상 클래스가 갖는 추상 메서드를 의미하기보다는 클래스를 설계하는 것 자체를 의미합니다.즉, "공통의" 속성이나 기능을 묶어 이름을 붙이는 것입니다.
  • 객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념입니다. 정리하면 추상화는 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법이라 할 수 있습니다.

 

 

 

 

객체지향 프로그래밍에서의 캡슐화

 

캡슐화의 목적 2가지

 

1. 코드를 재수정 없이 재활용합니다.

2. 접근 제어자를 통한 정보 은닉합니다.

 

  • 절차 지향 프로그래밍에서도 라이브러리를 통해서 변수와 함수를 재활용할 수는 있었지만, 코드의 수정이 일어났을 때 영향 범위를 예상하기 어려운 문제가 있었습니다.
  • 그러나 객체 지향 프로그래밍에서는 캡슐화를 통해 객체가 외부에 노출하지 않아야할 정보 또는 기능을 접근제어자를 통해 적절히 제어 권한이 있는 객체에서만 접근하도록 할 수 있기에 코드의 수정이 일어났을 때 책임이 있는 객체만 수정하면 되기에 영향 범위를 예측하는데 수월해졌습니다.
  • 뿐만 아니라 관련된 기능과 특성을 한 곳에 모으고 분류하기 때문에 객체 재활용이 원활해졌습니다. 객체 지향 프로그래밍에서 기능과 특성의 모음을 "클래스"라는 "캡슐"에 분류해서 넣는것이 캡슐화다. 객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶습니다.



 

 

객체지향 프로그래밍에서의 상속

 

  • 절자 지향 프로그래밍에서도 "라이브러리"를 통해서 남이 짜놓은 소스 코드를 가져와 사용할 수 있었지만 자신의 의도에 맞게 수정하게되면 다른 라이브러리가 되어 버전에 따라 동작하지 않을 수 있고 불필요한 코드의 수정작업을 해야했습니다. 이런 문제를 해결하기 위해 상속 이라는 것을 도입하였습니다
  • 상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것입니다.
  • 기존 상위클래스에 기능을 가져와 재사용할 수 있으면서도 동시에 새로운 하위 클래스에 새로운 기능도 추가할 수 있습니다. 이렇게 코드의 중복을 없애줍니다.



 

 

객체지향 프로그래밍에서의 다형성

 

  • 다형성이란 상속과 연관있는 개념으로 한 객체가 상속을 통해 기능을 확장하거나 변경하여 다른 여러형태(객체)로 재구성 되는 것을 말합니다.
  • 다형성을 사용하면 같은 이름의 속성을 유지함으로서, 속성을 사용하기 위한 인터페이스를 유지하고, 메서드 이름을 낭비하지 않습니다.
  • 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것이다. 즉 오버라이딩(Overriding), 오버로딩(Overloading)이 가능하다는 얘기입니다.
  •  

오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것.

오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.




 

 

정리

 

  • 결국 객체 지향 프로그래밍(OOP)는 어떤 대상을 추상화(Abstraction)하여 공통점을 찾고, 그것을 캡슐화(Encapsulation)해 한 군데에 모아 객체를 만들고, 새로운 객체가 상속(Inheritance)받아 재사용이 가능하게 만들어 줍니다. 상속(Inheritance)받은 객체는 다형성(Polymorphism)을 통해 기능을 수정 또는 추가하여 재사용할 수 있습니다.

 

참고: https://brunch.co.kr/@clay1987/193

 

웹개발 상식 : 객체지향 프로그래밍이란?

OOP, 객체지향 프로그래밍에 대한 알기쉬운 개념설명 | OOP (Object Oriented Programming / 객체지향 프로그래밍) 이란? -  개발자들이 가장 쓸데없이 어렵게 써놓은 용어들 중 하나가 바로 객체지향 프로

brunch.co.kr

 

 

 

 

함수형 프로그래밍

 

 

 

  • 함수형 프로그래밍은 객체지향 프로그래밍과는 다릅니다.
  • 함수형 프로그래밍은 계산을 수학적 함수의 조합으로 생각하는 방식을 말합니다. 이것은 일반적인 프로그래밍 언어에서 함수가 특정 동작을 수행하는 역할을 담당하는 것과는 반대되는 개념으로, 함수를 수행해도 함수 외부의 값이 변경될 수 없습니다.
  • 함수형 프로그래밍은 이름처럼 함수를 기반으로 돌아갑니다. 사실 자바스크립트가 완벽하게 함수형 프로그래밍을 할 수는 없지만 그 스타일을 따라할 수 있습니다.

 

 

 

함수형 프로그래밍의  원칙

 

  • 입출력이 순수해야합니다. - 순수함수(Pure function)
  • 부작용(부산물)이 없어야합니다. - 불변성(Immutablility)
  • 함수와 데이터를 중점으로 생각합니다.

 

  • 입출력이 순수하다는 것은 반드시 하나 이상의 인자를 받고, 받은 인자를 처리하여 반드시 결과물을 돌려주어야한다는 겁니다. 인자를 제외한 다른 변수는 사용하면 안 됩니다. 받은 인자만으로 결과물을 내어야 하며 이러한 함수를 순수함수(Pure function)라고 부릅니다.
  • 자바스크립트는 this라는 개념 때문에 (this를 어쩔 수 없이 사용해야하는 상황) 순수함수를 사용하기 힘듭니다.  그래도 최대한 비슷하게 할 수는 있습니다.
  • 부작용이 없어야한다는 것은, 프로그래머가 바꾸고자하는 변수 외에는 바뀌어서는 안 된다는 뜻입니다. 원본 데이터는 불변성(Immutablility)이 원칙입니다. 그래서 데이터 변경이 불가능하기 때문에 기존 데이터의 복사본을 만들어 주는 도구들이 필요합니다. 자바스크립트에는 이미 Array.map, Array.reduce등 데이터 복사본을 만들기 위한 함수들을 제공하고 있습니다.
  • 함수형 프로그래밍에서는 프로그래머가 모든 것을 예측하고 통제할 수 있어야합니다.반복문 대신에 재귀함수를 사용하는 것을 예를 들 수 있습니다. (참고: https://velog.io/@tilsong/%EC%9E%AC%EA%B7%80-%ED%95%A8%EC%88%98%EB%8A%94-%EC%96%B8%EC%A0%9C-%EC%8D%A8%EC%95%BC-%ED%95%A0%EA%B9%8C)
 

재귀 함수는 언제 써야 할까?

재귀 함수

velog.io

 

 

 

 

대표적인 함수형 프로그래밍 함수들은 배열에 있는 메소드인 mapfilter와 reduce입니다

 

var arr = [1, 2, 3, 4, 5];
var map = arr.map(function(x) {
  return x * 2;
}); // [2, 4, 6, 8, 10]

 

처음에 배열(arr)을 넣어서(입력), 결과(map)를 얻었습니다(출력). arr도 사용은 됐지만, 값은 변하지 않았고, map이라는 결과를 내고 아무런 부작용도 낳지 않았습니다. 바로 이런 게 함수형 프로그래밍에 적합한 함수, 순수함수입니다.

 

 

 

 

 

근데 충분히 map이라는 함수를 따로 만들 수 있습니다.

 

var arr = [1, 2, 3, 4, 5];
var condition = function(x) { return x % 2 === 0; }
var ex = function(array) {
  return array.filter(condition);
};
ex(arr); // [2, 4]

 

하지만 위의 ex함수는 순수함수가 아닙니다. 바로 condition 변수가 인자로 받지 않은 변수를 사용했기 때문입니다.

 

 

 

 

 

위의 ex함수를 순수함수로 바꾸려면

 

var ex = function(array, cond) {
  return array.filter(cond);
};
ex(arr, condition);

 

condition 변수 또한 인자로 받으면 됩니다. 이렇게 하면 쉽게 에러를 추적할 수 있으며. 인자가 문제였거나, 함수 내부가 문제였거나 둘 중 하나이기 때문임을 알 수 있습니다.

 

 

 

 

 

반복문을 사용하지 말라고 하면 보통이라면 1부터 10까지 더할 때 이렇게 많이 합니다.

 

var sum = 0;
for (var i = 1; i <= 10; i++) {
  sum += i;
}

 

 

 

 

 

함수형 프로그래밍에서는 다음과 같이 합니다.

 

function add(sum, count) {
  sum += count;
  if (count > 0) {
    return add(sum, count - 1);
  } else {
    return sum;
  }
}
add(0, 10); // 55

 

add 안에서 add를 또 호출하는 것이 복잡해보이지만 한 번 실행 결과를 잘 생각해보면 이렇게 함수형으로 표현하면 장점이, 코드의 재사용성이 매우 높아집니다. 한 번 함수로 만들어놓으면 언제든지 add 함수를 다시 쓸 수 있습니다.

 

 

 

 

 

reduce 메소드를 쓰면 좀더 함수형 프로그래밍다운 방법입니다.

 

var arr = [1,2,3,4,5,6,7,8,9,10];
arr.reduce(function(prev, cur) {
  return prev + cur;
}); // 55

 

 

 

 

정리

 

  • 함수형 프로그래밍은 순수 함수(pure function) 를 조합하고 공유 상태(shared state), 변경 가능한 데이터(mutable data)부작용(side-effects) 을 피하여 소프트웨어를 만드는 프로세스입니다.
  • 모든 데이터는 변경이 불가능 해야합니다.
  • 함수는 순수 함수로 만든다. 인자를 적어도 하나 이상 받게 만들고, 데이터나 다른 함수를 반환해야 합니다.
  • 루프보다는 재귀를 사용합니다.
반응형

댓글