관리 메뉴

김종권의 iOS 앱 개발 알아가기

[swift] 15. 객체지향 vs 함수형 본문

swift 5 문법

[swift] 15. 객체지향 vs 함수형

jake-kim 2020. 4. 20. 22:22

1. 정의

1) 객체지향언어 :

 - 데이터를 객체로 취급하고 처리 요청을 받은 객체가 자기 안에 있는 기능을 가지고 처리 - 추상화, 캡슐화, 상속, 다형성

 - 데이터를 기록하는 것을 강조

 

2) 함수형언어 :

-  최소한의 기능 : 데이터를 함수형(인풋과 아웃풋)으로 표현

-  불변성 목적 : 변경 가능한 상태를 최대한 제거 하려는 성격(같은 입력에는 항상 같은 출력)

 

 즉 객체지향은 상태를 기록하여 바꾸는 것을 강조, 함수형은 상태를 기록하지 않고 함수의 응용을 강조(대부분 람다 함수를 이용)

2. 비교

1) 함수형 언어는 side effet를 제거

   (* side effect : 반환값 이외에 호출된 함수 밖에서 관찰할 수 있는 애플리케이션 상태 변화.. 콘솔로그 띄우기)

즉, 프로그램을 더욱 쉽게 이해하고 더 쉽게 테스트 하기 위함, 즉 함수 자체는 최소한의 기능을 넣고 AOP와 같은 것처럼 분리하여 확인하는게 좋다는 취지

 

2) 객체지향언어에서는 일급객체, 함수형언어에서는 일급함수

 

3) 객체지향은 상호작용하는 객체들의 집합, 함수형은 상태 값을 지니지 않는 함수 값들의 연속

 

 * 일급 객체 : 다른 객체들에 적용 가능한 연산들(매개변수 넘기기, 변수 대입)을 모두 지원하는 객체

 * 일급 함수 : 함수를 객체로 보는 관점

 

3. 코드로 비교하는 객체지향 vs 함수형

게임에서 마린이란 캐릭터가 뮤탈에게 데미지를 받음

 객체지향 -> "수정" 마린 객체 상태가 존재하며 이 객체의 HP프로퍼티를 감소

 함수형 -> "대체" HP가 적은 마린을 새로 생성하여 이 리턴된 값을 사용

 

1) 객체지향

- balance라는 프로퍼티 고정 (상태저장)

- credit()은 출금, debit()은 입금 메소드

 

2) 함수형

- 출금(credit)과 입금(debit)할 때 기존의 객체의 상태를 바꾸는 것이 아닌 새로운 객체를 반환하여 이것을 사용

 

 

*예제 소스코드 출처 도서

 

4. 장단점 비교

1) 추상화 관점 - 함수형 승

 - 함수형은 높은 추상화(개발자가 문제 해결에만 집중 할수 있게끔함), 단 높은 추상화로 인해 구체적으로 함수 내부에 어려움

 - 객체 지향도 캡슐화와 같이 추상화를 할 수 있지만 함수형에 비해서 낮은 추상화

* 추상화가 높은 것의 의미 : 복잡한 것을 단순화하는 것 (또한 높은 추상화 수준을 위해 접근 제한자를 사용하여 복잡함을 줄이기 위해 private으로 선언하기도 함)

 

2) 재사용성 - 함수형 승

 - 함수형은 함수 단위의 코드 재사용이 더욱 쉬워짐 (더 작게 쪼개어 생각 가능)

 - 객체지향은 기본이 객체(=변수 + 메소드)라서 개발자 입장에서는 변수와 메소드를 동시에 고려해야 함

 

3) Multi core & Concurrency - 균등

 - 병렬처리는 변경 불가능한 데이터에서 Thread-safe제공 -> 함수형이 좋음 (단, 오래된 데이터를 사용할 수 있다는 단점)

 - 객체 지향은 데이터를 변경 가능하므로 최신 데이터를 사용할 수 있다는 장점 (단, Data Consistency유지하는 것이 어려운 단점)

 * 변경 불가능 데이터의 이점 : Thread들은 잠금(Lock), 동기화(Synchronize)작업이 중요함. 데이터가 변경되면 잠금, 동기화 문제를 따로 해결해야함

 

4) 간결성 - 함수형 승

함수는 side effect를 제거하는것이 원칙이므로, 함수는 같은 입력은 항상 같은 출력이 나오게끔함. 때문에 더욱 간결

 

5. 떠도는 단어

*순수함수(pure function) : Side Effect가 없는 함수(함수 실행이 외부에 영향을 끼치지 않는 함수)

 -> Thread safe, concurrency

*고계함수(higher-order function) : 함수 자체도 '값'으로 취급

*익명함수(anonymous fuction) : 이름이 없는 함수(람다식을 통한 구현)

 

* 번외) 코딩테스트는 객체지향? 함수형?

 코딩테스트는 절차형에 근접

 

Comments