메서드와 고차함수는 어떻게 다를까

일어나 개발해야지·2024년 3월 1일

iOS 글쓰기모임

목록 보기
2/12

Intro

Front-End로 다시 커리어를 시작한지도 근한달
퇴근후 iOS 공부를 놓지않으리라 다짐했었는데
프로젝트 파일은 손도 못대고, 알고리즘만 풀고있다... ㅋㅋㅋㅋ
그리도 늘고 있다는 느낌이 있으니 끄나풀은 잡고 있는걸로 ..
알고리즘을 풀다보니 고차함수를 자주 사용하게됬고
때로는 메서드라고 표현하면서 내 안에서 두가지 개념이 구분되지못하고 있다는 점을 알게됬다.

1.고차함수와 메서드가 헷갈리는 이슈

보통 고차함수라고하면 map, filter, reduce가 많이 언급되고
그 외에도 flatMap, compactMap,sorted, forEach 등의 고차함수 들이있다.
그리고 메서드는 append,remove, count,contains, uppercased 등이 있다.

고차함수에 대해서 생각하면서 메서드와는 어떤게 다른걸까를 고민한적이 있다.
이를 테면 uppercased는 문자열을 대문자로 변환하는 함수를인데
이 친구는 메서드라고 부르는게 익숙한데 고차함수라고는 부르면 안되는걸까 ?
반대로 map은 고차함수라고 불리지만 메서드라고 부르면 안되는걸까 ?그런 고민이였다.
역할을 떠올렸을때 값을 전달받아서 변환해주는 역할을 한다는데는
공통점이 있다는 생각때문이였다.

미리 결론을 이야기하자면 메서드와 고차함수는 구분되는 개념이다.
내가 이해한 과정은 아래와 같다.

메서드

메서드는 객체의 인스턴스를 필요로 하는 함수이다.
즉, uppercased은 str 필요로 하는 함수이다.

let str = "hello"
let uppercasedStr = str.uppercased() // "HELLO"

고차함수

고차함수는 함수를 값처럼 다루는 함수이다

let numbers = [1, 2, 3, 4, 5]

// map 메서드는 각 요소에 제곱을 적용하여 새로운 배열을 생성
let squaredNumbers = numbers.map { $0 * $0 } // [1, 4, 9, 16, 25]

2.헷갈리는 지점

메서드는 어떤 value를 필요로 하는 함수
이 인스턴스는 결국 값이니까 메서드는 값을 필요로한다고 이해

그런데 고차함수의 경우 함수를 값처럼 다룬다고 하지만,
numbers라는 배열을 받고있고 이 또한 함수라기 보다는 배열인 데이터라고 보여지기 때문에
메서드와 고차함수의 구분이 모호하다고 생각

다시한번 메서드

메서드는 특정한 객체에 속한 함수
uppercased는 str이라는 객체에 속해있고, str의 상태를 변경하는 함수
특정한 객체에 종속되어 있고 해당 객체의 인스턴스를 필요로 한다.(이해됨)

let str = "hello"
let uppercasedStr = str.uppercased() // "HELLO"

다시한번 고차함수

고차함수는 함수를 값처럼 다루는 함수(이해안됨)
배열을 받아서 각 요소에 action을 적용 후, 새로운 배열로 반환
고차함수는 함수를 다루는데, 객체에 종속되지 않고 다른 함수를 인자로 받거나 반환한다.
하지만... 아직 내눈에는 numbers라는 객체에 속한것처럼 보이는 ..

let numbers = [1, 2, 3, 4, 5]

// map 메서드는 각 요소에 제곱을 적용하여 새로운 배열을 생성
let squaredNumbers = numbers.map { $0 * $0 } // [1, 4, 9, 16, 25]

함수를 값처럼 다룬다는 건 어떤 의미일까?

numbers.map { $0 * $0 }은 map은 numbers 배열에 속한 함수가 아니다.
map은 배열을 받아들이고, 각 요소에 Action을 적용한다.
그렇게 지정한 Action을 적용해서 새로운 배열을 반환한다.
그렇게 클로저로 함수를 다룬다.

3.결론 (공통점과 차이점)

메소드란

메소드는 str이라는 객체에 속해서 정해진 동작을 수행해서 str을 변환한다.
클래스나 구조체 안에 정의되어 있는 내장 함수를 의미한다.

고차함수란

고차함수는 number라는 객체를 받아서 클로저를 적용하고,
이 클로저의 내용은 사용자가 지정하기 때문에
이 부분을 함수를 값처럼 다룬다고 표현한다..!

차이점

파라미터로 받은 내용을 변환한다라는 점에 집중하면 구분이 어려울 수 있지만
정해진 Action을 수행할것인지, Action을 커스텀할 수 있는지에 집중하면 차이점이 보인다.
때문에 Action을 커스텀할 수 있는 고차함수는 유연성이 높고 다양한 상황에 대응할 수 있다고 평가된다.

공통점

메소드와 고차함수는 모두 함수이다.
함수를 인자로 받거나 반환할수있는 메서드가 있다면 고차함수라고 할수 있다.

2개의 댓글

comment-user-thumbnail
2024년 3월 1일

메서드와 고차함수는 겹치는 부분이 있어 보입니다

메서드와 고차함수는 같은 분류법에 따른 결과가 아닌 거 같아요

메서드는 객체와 관련된 함수이고
(https://ko.wikipedia.org/wiki/%EB%A9%94%EC%84%9C%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%84%B0_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D))

고차함수는 인자로 함수를 받는 함수니까요
(https://ko.wikipedia.org/wiki/%EA%B3%A0%EC%B0%A8_%ED%95%A8%EC%88%98)

고차함수도 메서드가 될 수 있는 거죠
List의 map, filter, reduce 등등은 List 객체의 정적 메서드면서 고차함수인 것이죠

답글 달기
comment-user-thumbnail
2024년 3월 2일

요즘 불경기에 취업하셨다니..! 축하드립니다~~ 💪🏻
좋은 표현일지는 모르겠지만, 어떤 요소(객체, 함수 등)가 대상이 되는지가 중점이 되는 것 같네요!

답글 달기