bash shell을 이용해 폴더 내 파일 한번에 이동하기(feat.자동화)

자동화

자동화라는 말을 많이 들어왔을 겁니다.
생산성을 위해선 필수적인 요소입니다.
우리는 자동화에 항상 신경써야 시간을 효율적으로 사용하여 몸값을 올릴 수 있습니다.
여러분의 시간이 곧 돈이기 때문이죠.

자동화를 다루는 내용만 빠르게 확인하고 싶으시면 하단의 bash shell script 부분 부터 읽으시면 됩니다.

문제점 파악

지난 포스트를 오랜만에 작성하다 보니 블로그를 쓰는데 개인적으로 불편한 점이 인지되었습니다.
다른 플랫폼과 달리 hexo 기반의 github io 를 이용한 블로그를 사용하면서 생긴 문제였는데요.

먼저 간단히 hexo를 이용한 github io 블로그를 사용하면서 생긴 불편함을 공유하겠습니다.

  1. 폴더 관리를 이원화 해야한다.
    • 새 글을 작성하기 위한 hexo 활용을 위한 폴더 -> private으로 관리하고 싶음
    • githubid.github.io -> 필수로 공개로 해야함
  2. hexo에서 제공하는 deploy 기능은 github으로 바로 force push를 해서 관리하기가 불편함

참고로 제가 deploy 하는 순서를 알려드리자면

1
2
3
4
hexo new post "제목" // -> 새로 글 쓸 파일 생성 -> 파일 내용 작성
hexo generate // _post에 작성된 파일을 긁어서 html파일로 변환해줌
hexo server // localhost에서 확인 가능
hexo deploy

저는 대안책으로 필수공개가 되어야 하는 githubid.github.io의 폴더를 직접 관리하면서 직접 푸쉬하는 방법을 생각했습니다.
가장 큰 이유는 readme가 매번 날아가기때문이었는데요.(이거 자동으로 세팅하는 방법이 있다면 알려주세요)
deploy 로 자동으로 push 할때 해당 파일이 생성이 안돼 덮어쓰면서 남기고 싶은 폴더 혹은 파일이 매번 사라진다는 단점이 있었습니다.
또 공개하고 싶지 않은 폴더 및 파일이 그대로 올라가는 문제가 있었습니다. .gitignore관리도 되지 않기 때문이죠.

이 문제를 해결하기 위해 전 포스트될 내용에 필요한 파일만 공개된 repo에 복사를 해서 관리를 하기로 마음 먹었고, 필요한 내용을 일일이 복사해서 넘겨주어야 하는 문제가 생겼습니다.

최소 4~5번의 복사 과정을 거쳐야 하는데 포스팅하는 주제가 늘어나면 폴더도 같이 늘어나 더 많은 작업을 해야했죠.글 쓴 뒤 생각해보니까 그냥 finder에서 마우스로 복사해도 되는거였어..

bash shell script

이쯤에서 이걸 shell script를 이용해 자동화하면 좋겠다는 생각을 합니다.

shell script를 간단히 소개해드리자면 결국 어떤 동작을 하는 작은 프로그램을 위한 파일을 미리 생성해 두는 겁니다.
스크립트를 작성해두고 필요한 순간에 해당 스크립트를 실행해 원하는 동작을 컴퓨터가 알아서 수행하도록 하는 것이죠.

bash shell script는 기본적으로 확장자로 sh를 사용합니다.
그리고 첫 줄엔
#!/bin/bash
가 들어갑니다(bash 의 위치)

기본적으로 프로그래밍을 조금 해봤다면 검색 몇번으로 활용법을 찾아보실 수 있을 거에요.

전 제가 필요한 부분만 빠르게 습득해서 아래와 같이 테스트 해봤습니다.

1
2
3
4
5
6
7
8
9
10
#!/bin/sh
lists=$(ls public)
for item in ${lists}
do
if [ $item != "copy.sh" ]
then
cp ./public/$item ../end/
echo "done : " $item
fi
done

위 코드를 해석해보자면
첫줄은 shell script 를 실행하기 위해 필수로 들어가는 부분이고,
둘째줄은 명령어 ls의 결과(현 위치 하위의 public이라는 폴더에 있는 폴더 및 파일 목록을 나열)를 lists라는 변수에 담아두는 작업입니다.

그 뒤로는 우리가 흔히 접하는 for문입니다.
for 뒤에 흔히 사용하는 {} 대신 dodone으로 원하는 내용을 감싸고 있다고 생각하시면 됩니다.
if문엔 thenfi 를 사용합니다.

간단히 해석해드리자면,
lists에 담은 결과들 중 이 파일의 이름인 copy.sh이라는 이름을 제외 시켜 루프를 돌립니다.
그 모든 파일을 임시로 지정해 놓은 현재 속한 폴더와 동일한 depth에 있는 end라는 폴더에 cp명령어를 이용해 복사시킵니다.

제가 원하는 동작이 제대로 됐는지 눈으로 바로 확인하기 위해 echo를 이용해 done :뒤에 어떤 파일인지 하나하나 출력해줍니다.

실행은 ./copy.sh 명령어를 사용합니다.
만약에 실행권한이 없다면

1
chmod +x copy.sh

를 이용해 실행권한을 줍니다.sudo를 써도 될 듯 하네요

1
2
3
4
5
6
7
8
9
10
11
done :  Diary
done : IT
done : archives
done : categories
done : content.json
done : css
done : index.html
done : js
done : page
done : resume
done : tags

위가 출력된 결과 입니다.
제가 포스팅 하고 있는 폴더들과 그 외 필요한 파일들이 잘 처리되었다고 출력되었습니다.
해당 폴더에서 확인해보는 것도 잊지 않아야겠죠?

제 작업이 실제 원하는 곳으로 잘 전달된건 여러분도 확인하실 수 있어요.
바로 이 포스트가 그 방법으로 올라왔기 때문이죠.

읽어 주셔서 고맙습니다.
다음에 또 다른 팁으로 돌아올게요 :)

Share 0 Comments

개발자용 새 맥북 초기 세팅

개발자가 새 맥북을 받았다면

이전에 사용하던 맥북에 용량문제가 생겨서 회사에서 새 맥북으로 교체를 받았습니다.
개인적으로 시뮬레이터, Xcode 등에서 시스템 용량을 많이 잡아먹기에 256으로는 조금 모자란 것 같습니다.
무려 이번에 새로 나온 맥북 16인치형 2019년 모델을 받았습니다.
메모리랑 CPU도 올려주면 더 좋았을텐데…

새 맥북을 받긴 했는데 이전과 달리 백업으로 전송하기가 꺼려졌습니다.
이유는 이전에 가지고 있던 모델이 회사 보안 정책상 카탈리나로 올리지 못하고 모하비 버전으로 사용하고 있었기에 혹시나 발생할 수 있는 충돌도 방지할겸, 오랜만에 새 제품을 쓰니 리프레쉬를 하자는 마음에 하나하나 새롭게 설치하여 사용해보자는 마음을 먹었습니다.

먼저 회사에서 제공 받은거니까 일을 위해서(돈을 받아야하니까) 가장 필요한 것은 회사 작업에 필요한 세팅이었습니다.

  • 개발 툴(Xcode, Paw)
  • 커뮤니티 툴(Slack, Zeplin)

여기에 개인적인 생산성을 위해 필요한 툴을 설치했습니다.

  • iTerm2
  • Tower
  • Visual Studio Code
  • Chrome

이렇게 하니 일단 회사에서 주어진 일 정도는 해결할 수 있게 되었습니다.

개인적인 기호를 위해 homebrew, oh-my-zsh을 이용해 iTerm에 테마를 입히고, 자잘한 세팅을 시작합니다.

  • ZSH_THEME=”agnoster”
  • plugins엔 기본적인 git에 zsh-syntax-highlighting, zsh-autosuggestions, fasd를 추가로 설정해줬습니다.

저는 vim 으로 작업하는걸 좋아해서 (익숙한 작업들만..) vimrc파일도 세팅을 해줍니다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if has("syntax")
syntax on
endif
set autoindent
set cindent
set nu
set hlsearch
set ts=4
set shiftwidth=4
set sw=1
set ruler

au BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "norm g`\"" |
\ endif

set laststatus=2
set statusline=\ %<%l:%v\ [%P]%=%a\ %h%m%r\ %F\

여기까지 기초 작업을 하니 일단 전 맥북과 환경이 거의 비슷해졌습니다.

이 글을 쓰려다 보니 필수로 설치해야되는게 기억 납니다.

  • node
  • hexo

그 외에 개인적으로 필요한 애플리케이션들이 있습니다.
여기까지 읽으신 분들은 느끼셨겠지만 낚이셨습니다. 또 오랜만에 다음 맥북을 받았을 경우 까먹지 않도록 기록을 남겨 놓는 글이었습니다.
제 블로그도 잘 포스팅 되는지 확인 해야 되거든요

추가로 또 중요하다고 생각되는 것들은 업데이트 될 수 있습니다.

여러분들의 맥은 어떻게 세팅되었는지 궁금하네요.
좋은 애플리케이션이나 생산성 향상을 위한 도구들 많이 추천 바랍니다.

고맙습니다 :)

Share 0 Comments

[후기]TDD-참관-후기

지난 8월 7일(화요일) 이규원님이 진행하시는 TDD참관에 참석하였습니다.

처음에 규원님에게 연락왔을때는 ‘와 진짜 진행하시는 구나!’라는 놀라움과 규원님과 약간은 사적으로 볼 수 있는 자리가 될 수도 있다는 설렘(TDD는 뒷전… ㅎㅎ)으로 꼭 참석하겠다는 의사를 전달했었습니다.

해당 회차(?)에 함께하게 된 인원은 당일에 처음 만난 이종호님과 저 이렇게 두명이었으며 규원님을 사이에 두고 규원님의 모니터를 함께 보며 참관행사가 진행되었습니다.

먼저 처음엔 TDD의 생각과 궁금한점들을 서로 공유하며 간단한 지식과 서로에 대한 정보를 주고 받았습니다.
이야기가 진행되면서 자연스럽게 코드로 대화할 내용이 이어지고, 본격적으로 실전을 경험하는 시간이 이어졌습니다.

실전이라는 표현을 사용한 이유는 규원님의 회사 코드를 TDD방식으로 이슈에 대해 기능을 정의하고 테스트 케이스와 코드를 수정하여 실제 운영되는 서비스에 반영하는 일련의 개발 프로세스를 직접적으로 보여주셨기 때문입니다.

약 1시간 반에 걸쳐 TDD에 대한 의견을 주고 받으며 실제 개발에 적용하는 모습을 보면서 TDD의 사실과 오해를 느낄 수 있었고, 실전에서 충분히 사용할 수 있다라는 확신을 갖게 되었습니다.

사실 저는 지난 1년간 코드스쿼드에서 프로그래밍 교육을 받으면서 pobi(박재성 마스터), JK(김정 마스터)에게 TDD교육을 받고 실제 프로젝트에 적용한 경험이 있기 때문에 TDD의 유용함과 필요성을 알고 있었습니다.

하지만 DB나 네트워크의 접근이 생기고, UI처리가 필요한 상황 등 프로젝트 규모가 커지면서 점점 TDD적용이 버거워지면서 큰 프로젝트 혹은 실전에선 어떻게 사용하는지 배우고 싶어 참관을 신청하였습니다.

이 부분에 대해서 규원님이 대답해주신 답변은 프로젝트의 모든 부분을 TDD로 100퍼센트 커버할 필요는 없다라는 것이었습니다.
100퍼센트 커버가 불가능하다기 보다는 투자하는 시간에 비해 효율이 떨어지는 부분이 생길 수 있기에 그런 부분은 과감히 TDD를 생략하고 확신이 필요한 부분에 집중한다는 것이었습니다. 대신 Functional Test를 도입하여 해당 부분을 보완해 전체 테스트 커버리지를 높이는 전략을 활용한다고 노하우를 전해주셨습니다.

1시간반은 정말 순식간에 지나갔습니다. 다행인건 그 후 저녁을 함께할 수 있는 엑스트라 타임이 있다는 것이었습니다. 참관행사에 참여한 셋이 함께 곱창에 소주 한 잔 걸치면서 1시간 반 동안 하지 못한 이야기를 주고 받으면서 좀 더 사적인 어쩌면 진솔한 대화의 장을 풀어나가면서 행사가 마무리 되었습니다.

규원님이 저희 둘에게 다른 사람에 비해 질문이 적다는 얘기를 해주셨는데, 종호님의 경우 1시간반 진행을 하면서 그동안 궁금했던 부분이 많은 부분 해소되어서였고, 저는 TDD에 대해선 코드스쿼드에서 배웠었고, 지금 회사에 들어온지 갓 1주일 지난 상황이었기에 코드 파악이 완전하지 않아서였던 것 같습니다.
그 부분은 좀 아쉬웠지만, 같은 건물에서 근무하고 저희 회사에선 Functional Test를 도입하기 위해 준비하고 있기 때문에 다음에 기회를 만들어 찾아뵙기로 후일을 기약했습니다.

TDD에 관한 이야기 혹은 이규원님과 대화를 나누고 싶은 분에게 이 행사를 추천 합니다.
행사는 당분간 더 진행하실 것 같아 링크(참관신청)를 남겨둡니다.

개발하는 모습을 집접 옆에서 보기때문에 TDD뿐 아니라 Tool사용 및 이슈관리 등 개발자에게 유용한 팁 등을 간접적으로 체험할 수 있기에 저에겐 특히 유용했던 것 같습니다. (블로그 링크로 좋은 정보도 직접 전달해 주시는 걸 보고 블로그 활성화에 대한 의지도 다시 생겼네요 ㅎㅎ)

간략히 참관행사에 대한 정보를 요약하자면:

  • 위 링크에서 참관 신청을 하면 댓글 순서대로 2명씩 초청됩니다.
  • 약 1시간 30분 정도 이야기를 주고 받으며 개발 과정을 보면서 TDD를 체험하실 수 있습니다.
  • 못다한 얘기 혹은 궁금한 사항들을 저녁식사자리를 이용해 추가로 더 나눌 수 있는 기회가 있습니다.

마치며

TDD를 잘 적용하기 위해선 좋은 설계가 필요하다는 것을 배웠습니다.
TDD를 통해 설계를 개선하기 보다 좋은 설계를 통해 TDD를 적용하는 것에 문제가 없도록 하는 것이 중요한 포인트라는 규원님의 조언은 결국 좋은 설계를 위해 끊임없이 생각하고 변화에 유연한 코드를 작성하는 것이 얼마나 중요한 것인지 깨닫는 계기가 되었습니다.

Share 0 Comments

Test-Driven-Development(TDD)

Test Driven Development

TDD란 테스트 케이스를 이용해 작은 단위로 요구사항을 정의하고 해당 테스트 케이스가 통과되도록 코드를 개선하여 빠르고 짧은 주기로 코드를 완성하는 방식으로 개발을 진행하는 방식입니다. 그 유명한 켄트 벡 할아버지(Kent Beck)에 의해 처음 소개되었으며, 현재 우리나라에도 꽤 전파되어 어떤 개념인지는 많은 개발자들이 이미 알고 있다고 생각합니다.

TDD의 핵심은 기능의 추가, 수정, 삭제 등 요구사항에 변화가 생겼을 경우 해당 요구사항에 맞도록 테스트 케이스를 정의하고 해당 테스트 케이스가 통과되도록 코드를 수정하여 빠르게 하나씩 완성시켜 나가는 것입니다.

TDD의 장점으로는 요구사항이 변경되어도 항상 테스트 케이스를 만족하는 코드를 만들기 때문에 사이드 이펙트(side effect)를 바로 감지할 수 있고, 안심하고 코드를 짤 수 있도록 개발자들에게 확신을 줄 수 있다는 것입니다.

단점으로는 테스트 케이스를 정의하여 작성하는 시간이 추가되고, 생각하지 못했던 테스트 케이스에 대해선 대응을 하지 못한채로 코드에 대해 확신을 가질 수 있기때문에 위험성이 완전하게 제거되지 않는 경우가 생길 수 있다는 것입니다.

TDD가 관심을 받고 있는 이유는 사이드 이펙트를 미리 감지하여 개발자의 실수를 줄여주고 코드에 확신을 가져 서비스를 지속적이고 안정적으로 운영 할 수 있도록 도와주기 때문입니다.

하지만 모든 팀에서 적용을 바로 하지 못하는 이유는 TDD를 프로젝트 중반에 도입하기엔 큰 무리가 따르고, 급한 일정 속에서 테스트 작성을 뒤로 미루는 상황이 발생하면서 나중에 건들 수 없는 상태가 되는 등 수 많은 변수가 발생하기 때문입니다.

따라서 TDD를 도입하기 위해선 프로젝트 초반부터 설계를 잘 하여 코드의 재사용성 및 의존성을 줄여 놓아 개발 일정에 차질이 생기지 않도록 미리 대비하고, 모든 팀원들이 TDD에 대한 인식이 확립되어 함께 노력하며 코드를 관리해야 가능하다고 생각합니다.

TDD방식이 팀의 개발문화로 자리잡는다면 새로 합류한 팀원이나 자신의 도메인이 아닌 부분을 서포트할때 코드의 사이드 이펙트를 바로 감지할 수 있어 좀 더 안정적으로 개발을 진행할 수 있다고 생각합니다.

TDD는 절대반지는 아니지만 안정적인 개발과 서비스를 위해 채택을 고려해보기엔 충분히 매력적인, 어쩌면 필수적인 방식이 아닐까 생각합니다.

Share 0 Comments

[iOS]UITabBarController와 UITabBar

iOS개발 공부를 하며 배운것들을 정리한 글입니다.
오류나 오타가 있다면 언제든 알려주시기 바랍니다 :)
환경은 Swift4 + Xcode 9.0 기반입니다.


앱을 개발할때 흔히 쓰이는 View Controller로 Tab이 있습니다.
여러 화면들을 Tab을 통해 전환하면서 다른 카테고리의 화면을 보여주는 방식에 주로 사용됩니다.
이해가 잘 안되는 분들은 아래 사진을 확인해보시기 바랍니다.

위 사진은 아이폰에 기본적으로 내장되어 있는 시계(Clock)앱 입니다.
화면의 아래쪽에 있는 Tab이 변경되면서 다른 화면을 보여주는 것을 확인할 수 있습니다.
이처럼 같은 앱이지만 다루는 주제가 화면마다 확연한 차이가 있는 경우이거나 같은 주제지만 인터페이스가 확연히 다른 경우에는 Tab 방식을 활용하는 것이 좋습니다.

이번 글에서는 이 Tab방식으로 앱을 개발하기 위해 필요한 클래스들에 대해 알아보려고 합니다.

UITabBarController

A container view controller that manages a radio-style selection interface, where the selection determines which child view controller to display.

위에 있는 설명을 살펴보면, UITabBarController의 핵심은 radio-style interface를 관리한다는 부분입니다.
radio-style이란 우리가 여러가지 선택할 수 있는 보기가 있을때 보기 중 하나만 선택할 수 있는 경우에 사용하는 방식입니다.
간단히 말하면 여러 하위 View Controller를 포함하고 있는 Container지만 선택권을 사용자들에게 넘겨 사용자들이 원하는 한가지 하위 View만을 보여주는 방식이라고 할 수 있습니다.
iOS만의 한가지 특이한 점으로는 UITabBarController를 사용한다면 Tab이 항상 화면 최하위에 위치 한다는 점입니다. 아마 한 손으로 사용하는 기기를 다루면서 편리하게 엄지손가락에 위치할 수 있도록 위치를 강제로 통일하는 것 같습니다.

TabBarController는 UIViewController를 상속받기 때문에 컨트롤러 자체가 내부 뷰 속성에 접근할 수 있는 하나의 뷰를 가지고 있습니다. 따라서 TabBarItem을 품고 있는 TabBar라는 뷰를 품고 있기에 각 탭별로 화면전환이 가능합니다.
아래 그림은 TabBarController가 어떤식으로 구성되어 있는지 잘 나타내 줍니다.

헷갈릴 수 있으니 위 그림에서 Navigation View 는 제외하고 생각해도 됩니다. 중요한 것은 각 View에 Layer가 있어서 구분되며, TabBar View를 통해 Tab을 선택한다면 위에서 여러 겹쳐져 있는 화면 중에 오직 가장 최상단에 올라와 있는 Custom View부분만 변경되면서 현재 어떤 Tab이 선택되었는지를 나타낸다는 것입니다.

UITabBar

A control that displays one or more buttons in a tab bar for selecting between different subtasks, views, or modes in an app.

위의 그림에서 확인되는 TabBar View에 해당하는 부분이며 UIView로, 사용자에게 탭들을 어떻게 보여주고 탭 클릭 시 어떻게 반응할 건지 (피드백을 어떻게 보여줄지) 알고 있습니다.
UITabBar는 보통 UITabBarController와 함께 사용하지만 혼자 쓰일 수도 있으며, 각 탭을 구분하는 버튼을 포함하고 있습니다. 각각의 버튼은 탭의 종류를 뜻하며 item이라고 합니다. TabBarItem은 TabBar에 최소 1개 이상입니다.
특이점은 종류가 6가지가 넘어간다면 처음 4가지만 표시되고 나머지는 the standard More item(보통 ∙∙∙) 이라는 버튼으로 표시됩니다.
TabBar의 Item들을 구성할때는 Interface Builder(Storyboard)를 활용하는 방식과 프로그래밍으로 직접 처리하는 방식 두가지가 다른 부분이 있기 때문에 링크(UITabBar)를 확인하시고 필요에 맞게 사용하시면 될 것 같습니다.

UITabBarItem

An item in a tab bar.

TabBarController의 TabBar중 한번에 하나만 선택되는 Radio Mode 각각의 대상이라고 할 수 있습니다.
각 아이템은 Badge를 추가하여 새로운 메시지의 개수를 표시하는 등 커스터마이징해서 원하는 형태로 활용이 가능합니다.

tvOS와의 주요 차이점

  • TabBar의 위치가 하단이 아니고 상단입니다. 또, 포커스가 벗어나면 자동숨김기능이 적용되어 사라집니다. 숨겨진 TabBar는 위쪽으로 swiping 하거나 Menu버튼을 누르면 다시 나타납니다.
  • TabBarController의 Tab이 개수만큼 전부 다 표현되며, iOS에서처럼 More표시로 변경되지 않습니다.

마치며

UITabBarController는 사용빈도가 꽤 높은 ViewController이라고 생각합니다.
따라서 자세히 공부하고 자주 사용해보는 것이 좋을 것 같습니다.

Share 0 Comments

[iOS]Xcode로 UI다루기 기초

이 글은 iOS앱 개발시 필요한 기본적인 UI를 다룰 수 있는 지식을 공부하면서 정리했습니다.
사진 및 주 내용은 Xcode 9 기반 애플 공식 문서를 참고하였습니다.

Xcode, Storyboard

먼저 아래의 내용을 설명하기에 앞서 UI가 무엇인지부터 간단히 정리하겠습니다.

UI : User Interface의 약어이며, 사용자와의 접점을 뜻한다.
즉, 사용자가 보는 화면을 정의한다고 생각하면 됩니다.

iOS 앱의 UI에 화면 요소들을 간단하게 컨트롤 하기 위해서 Apple은 Interface Builder라는 것을 제공하고 있습니다.
바로 오늘의 주인공 스토리보드(Storyboard)가 그 역할을 하고 있습니다.
UI를 변경하거나 확인하기 위해선 위에 말한 스토리보드파일을 열어야 합니다.
기본적으로 프로젝트를 생성하면 자동으로 생기는 Main.storyboard와 LaunchScreen.storyboard가 바로 스토리보드 파일입니다.
LaunchScreen.storyboard의 경우 앱이 처음 실행될때(Launching)뜨는 화면으로 그 화면의 UI를 변경하거나 확인할때 사용하면 됩니다.
그 외엔 Main.storyboard를 이용하면 됩니다. 아래 사진을 통해 기본적인 UI화면과 Xcode 에서 어느 위치에 있는지 확인할 수 있습니다.

위 사진에 명시되어 있는 명칭은 후에 구글링이나 커뮤니케이션을 할때 필요한 부분이니 잘 기억하시기 바랍니다.

기본화면에서 버튼을 추가해보겠습니다.

화면에 버튼을 추가하는 방법은 위의 사진을 토대로 Object library에서 버튼을 드래그해 원하는 곳에 배치시키면 간단히 성공하실 수 있습니다.
혹시 화면의 방향을 바꾸거나 여러 기기에 대응하는 화면을 확인해보고 싶다면 아래에 [View as: 기기명]이라고 씌여져 있는 Device configuration controls 부분을 클릭하면 아래와 같은 화면이 나타나기 때문에 다양하게 변경하면서 확인할 수 있습니다.

IBOutlet, IBAction

위에 간단히 버튼을 추가하고 다양한 기기에서 표현되는 것을 확인해보았지만 실제 프로그래밍을 할 때는 지금 당장 소스(코드)에서 해당 버튼에 접근할 수 있는 방법이 없습니다.
이유는 소스(코드)들과 UI가 현재는 따로 구분되어 있기 때문입니다.
이때는 Storyboard의 Interface Builder기능을 활용해야 합니다.
방법은 간단합니다. 아래의 사진처럼 해당 버튼 혹은 텍스트나 다른 화면 요소들을 원하는 Controller클래스가 있는 부분에 컨트롤(Ctrl)을 누른채 드래그 해서 올려놓기만 하면 자동으로 처리가 됩니다.

한가지 마무리 작업으로 Ctrl + 드래그를 마친순간 아래와 같은 팝업창이 뜨는데 해당 팝업창에 원하는 Connection 타입과 Name(프로퍼티 이름) 그리고 Type(프로퍼티의 타입)을 정의해줘야 합니다.

아래의 사진은 Button과 Label을 각각 IBAction과 IBOutlet에 매핑시킨 결과입니다.

IBOutlet과 IBAction은 Connection 타입 중 하나로 각각 프로퍼티와 메소드로 생성되어 화면 요소들을 컨트롤 할 수 있는 연결고리가 되는 것입니다.
이렇게 설정해놓은 경우 내부에 구현되어 있는 코드에 의해 Interface Builder기능이 적용되어 자동으로 화면 요소와 소스코드가 매핑되어 간단히 접근이 가능하다고 생각하면 됩니다.

여기서 한가지 짚고 넘어야할 부분은 IBOutlet과 IBAction은 똑같이 View(화면-Storyboard)와 Controller를 매핑시켜주지만 역할은 다릅니다.

위 그림처럼 IBAction의 경우 유저(사용자)를 통한 특정 이벤트를 감지해서 Controller에 알리는 역할을 하고, IBOutlet은 처리 결과를 View단에 알려서 원하는 동작을 이끌어 냅니다.

마치며

iOS의 UI를 다루는 방법은 Storyboard와 Interface Builder를 활용하는 방법만 존재하는 것은 아닙니다.
위의 방법은 개발시에도 눈으로 확인해가면서 편리하게 작업하도록 제공해주는 방식입니다.
다른 방법으로는 소스코드를 활용해 직접 UI를 다루는 방법이 있습니다. 이 경우엔 Storyboard와의 연결고리가 필요하지 않기 때문에 IBOutlet이나 IBAction등의 프로퍼티 혹은 메소드 없이 직접 각 필요한 기능을 포함하는 Protocol을 채택하여 처리할 수 있습니다.

두 경우 모두 사용하기 때문에 항상 둘 다 연습하고 잘 알고 있어야 합니다.
소스 코드를 활용하는 경우는 앞으로 다른 포스트를 통해 자주 등장할 예정이기에 이 글에선 Storyboard의 기초적인 활용 방법인 위의 내용을 끝으로 마치겠습니다.

Share 0 Comments

[iOS]프로젝트 템플릿

iOS의 프로젝트 템플릿

iOS 앱을 만들려면 프로젝트를 활용해서 프로그램 개발을 진행합니다.
프로젝트는 기존에 있는 프로젝트를 불러와서 수정하면서 활용해도 되고 새로운 프로젝트를 생성해서 진행할 수도 있습니다.
Xcode를 이용해서 새로운 프로젝트를 생성하게 되면([File] -> [New] -> [Project…]) 아래와 같은 창이 뜹니다.

기본이 되는 것은 Single View App 입니다.
무조건 Single View App 으로 만든 뒤에 하나씩 화면(View)들을 추가하고 UIKit의 View Controllers 클래스를 활용한다면 원하는 기능들을 얼마든지 사용할 수 있습니다.
다른 템플릿들은 단지 편의를 위한 보조 수단 이라고 생각하면 됩니다.
원하는 기능들을 활용하기 위해 필수적으로 사용하는 클래스라던가 화면들을 기본적으로 생성해줘서 개발시에 편리하고 빠르게 진행할 수 있도록 기본적으로 제공해주는 것들입니다.

아래의 간단히 설명을 보고 구현하고자 하는 앱에 알맞는 형태의 템플릿을 활용하여 사용하면 좋을 것 같습니다.

  • Single View App : 간단한 기본 화면 하나만 있는 템플릿
  • Game : 메탈/SpriteKit/SceneKit 기반 게임을 만드는 템플릿
  • Augmented Reality App: 증강현실(AR) 앱을 만드는 템플릿
  • Document Based App: 오피스처럼 문서 단위 저장 구조를 갖는 템플릿
  • Master-Detail App: 메일처럼 마스터 목록 화면과 디테일 상세 화면을 갖는 템플릿
  • Page-Based App: iBook처럼 여러 페이지를 책 넘김 효과를 갖는 템플릿
  • Tabbed App: Music처럼 하단에 탭바를 포함하는 템플릿
  • Sticker Pack App: iMessage 스티커 팩을 만드는 템플릿
  • iMessage App: iMessage와 연동하는 부가기능을 만느는 템플릿

마치며

만약 앱 개발이 처음이라면 각각의 템플릿을 만들어서 구조를 확인해보고 어떤식으로 클래스와 화면들이 구성되고 활용해야할지 감을 잡으신 뒤에 하나씩 구현해나가면서 비교해보는 것도 좋은 방법이라고 생각합니다.

Share 0 Comments

[Swift]변수와 상수

Swift의 상수와 변수

컴퓨터는 계산을 쉽게 하려는 의도에 따라 수학자들에 의해 발전하였기 때문에 수학적 용어들이 상당히 많이 존재합니다. 어떻게 보면 이러한 부분이 처음 개발세계에 입문시 포기하게되는 문턱이 생길 수 있는 포인트라고 생각합니다.
개인적으로 나름 개발에 입문하면서 희미하게나마 수학 기호들이 생각나는 사람들이 처음 상수와 변수를 접할 때 어떻게하면 이해가 쉬울까라는 생각으로 이 글을 정리했습니다.

수학적 탐구에 흥미가 없거나 프로그래밍이 완전 처음이 아니라면 맨 아래 요약 부분만 읽어보시고 넘어가셔도 실제 프로그래밍을 하면서 자연스럽게 익힐 수 있는 부분이니 참고하시기 바랍니다.

아래에 누군가는 싫어했던 방정식이라는 녀석이 있습니다.

$$ y = x + 3 $$

어떤가요?
이 수식 한줄은 보는 사람에 따라 다양한 생각을 하게 해줄겁니다.
이 식을 이용하여 오늘의 주인공 변수상수 그리고 대입 을 소개하려 합니다.

차근차근 살펴보도록 하겠습니다. 위의 식을 수학적으로 풀이하기에 앞서 무슨 의미인지 생각해보겠습니다.

y의 값은 x의 값에 3을 더한 수와 같다.

위의 의미를 이해하시나요?
x의 값에 따라 y의 값이 변경되는 전형적인 방정식 입니다.
아쉽게도 위의 x와 y는 조건이 부족하여 어떤 숫자가 올지 정해지지 않았습니다. 바로 이 부분이 키 포인트 입니다.
수학에서 숫자 3은 상수 입니다.
변하지 않고 고정된 값을 의미합니다.
반면 무슨 값이 들어올지 모르는 x와 y는 변수라고 말합니다.
즉 언제든 변경될 수 있는 값이라는 의미입니다.
그렇다면 우리는 왜 x와 y를 사용할까요?
사실 수학에서 x와 y는 일종의 약속된 문자입니다.
방정식을 풀기 위해서 식들을 나열하는데 긴 문장을 사용하기엔 번거롭고 통일된 문자를 사용해야 인식할 수 있기에 x, y, z등을 활용한 것입니다.
따라서 위 식은 아래와 같이 표현해도 아무 문제 없습니다.

결과 = 어떤값 + 3

위의 y는 결과고, x는 어떤값이라고 표현할 수 있기에 가능한 것입니다.
한가지 지켜야될 부분은 이후에 다른 식에 ‘결과’라는 값이 사용되려면 y대신 항상 ‘결과’ 라는 단어를 사용해야 한다는 것입니다.
x도 마찬가지로 ‘어떤값’이라는 단어를 사용해야죠.
반면, 3은 항상 3이라는 값을 가지고 있습니다. 예를 들어 5는 다른 상수 값입니다.

이제 프로그래밍 세계에서 살펴봅시다.

프로그래밍에서의 변수와 상수를 설명하기에 앞서 우린 대입이라는 단어를 먼저 아는 것이 유리합니다.
대입이라는 단어는 값을 할당 한다는 뜻입니다.

$$ x = 7 $$

수학에서 위의 식을 보면 x는 7과 같음을 알 수 있습니다.
그 얘기는 7 대신 x를 사용해도 결과는 같다는 말입니다.
y = 7 + 3 이라는 표현을 위의 식과 같이 y = x + 3 이라고 사용할 수 있다는 얘기입니다.
프로그래밍에서는 위의 x = 7과 같이 특정 값(7)에 대신 사용할 이름(x)을 붙이는 행위를 값을 할당한다고 표현합니다.
할당을 하게되면 그 이후엔 일일이 7이라는 값을 직접 사용하지 않고, 우리가 의미를 부여할 수 있는 알아보기 쉬운 단어나 문자를 이용하여 이름을 붙이고 그 이름을 가지고 데이터를 처리할 수 있도록 해줍니다.
위의 두 식을 보면 x는 7이라는 값 대신해서 사용하고, y는 x + 3을 대신해서 사용할 수 있습니다.
매번 x + 3을 사용하기 보다는 y라는 이름을 이용해서 활용할 수 있다는 의미죠.

위에서 배운 값을 할당 할 때에 프로그래밍에서는 두가지 방식으로 처리할 수 있습니다. 그게 바로 변수와 상수 입니다.

변수라는 개념은 어떤 값에 이름을 붙이되 대변하는 값이 변경될 수 있음을 의미합니다. 위에선 y나 x의 쓰임이 그렇습니다.
어떤 값을 넣느냐에 따라 같은 문자나 단어를 사용하더라도 대변하는 값이 달라진다는 의미입니다.

반면 프로그래밍시에 3이나 혹은 파이(3.141592…) 같은 특정한 값이자 변하지 않아야 되는 값(data)에 이름을 붙여 사용해야할 경우가 있습니다.
상수란 어떤 값을 사용하려 하는데 이 값은 변경되어선 안되고 항상 같아야 하는 경우, 우리는 그 값(data)을 특정한 이름에 할당해 사용하면서 그 이름의 값(data)은 변경하지 말자는 약속을 정해놓는다고 생각하면 쉽습니다.

위에서 배운 개념들을 활용하여 처음 방정식을 다른 방식으로 표현해보면

y = x + z (단, z는 3)
(결과라는 변수) = (어떤 값이라는 변수) + (3의 값을 할당한 상수)

라고 할 수 있습니다.

마지막으로 실제 프로그래밍에서는 어떻게 활용하는지 살펴보겠습니다.

1
2
3
var r = 3
let pi = 3.141592
r = 5

위에서 Swift를 기준으로(프로그래밍 언어마다 약속된 표현이 조금씩 다릅니다.) var는 변수를 선언할 때, let은 상수를 선언할 때 사용합니다.
var는 변수를 나타내는 영단어 Variable에서 나왔고, let은 ~하게 하다 라는 동사를 사용하여 3.141592를 pi라고 하자 라는 의미로 사용한 것 같습니다.(이 모든건 Swift라는 프로그래밍 언어를 만든 개발자 마음입니다.)

위와 같은 코드를 작성했다면 다음에 오는 코드에서 r과 pi라는 단어를 활용하여 각각 3과 3.141592라는 값을 대신 사용할 수 있습니다.

선언시에 사용한 약속어인 var와 let은 같은 이름(위에서는 r과 pi)당 최초 한번씩만 사용할 수 있습니다.
한번 선언한 뒤에는 선언시에 사용된 약속어 없이 r = 5 와 같이 새로운 값을 할당할 수 있습니다. 이 이후엔 r이 3이 아닌 5 값을 대체합니다.
반면, let으로 선언하여 상수가 된 pi는 이후에 pi = 1 과 같이 다른 새로운 값을 할당할 수 없다는 점을 알고 있어야 합니다.

마치며

위에 장황하게 수학으로 설명을 진행하여 오히려 더 어려워하시는 분들이 많을 수도 있을 것 같습니다.
어찌보면 간단히 짚고 넘어갈 수 있는 개념일지 모르지만 처음 프로그래밍을 배울 때 이해하기 힘든 부분일 수도 있다고 생각하여 곰곰히 생각해보고 정리하게 되었습니다.
더 깊이 들어가면 사실 모든 데이터는 특정한 메모리에 저장되고 그 메모리의 주소값을 참조하게 되는데 주소값을 일일이 외우고 다루기 힘들기 때문에 이름을 붙여서 활용한다고 할 수 있습니다. 이런 내용은 컴퓨터 내부 구조나 동작 방식에 대한 지식이 더해진 부분이기때문에 처음 프로그래밍 언어를 배울땐 일단 아래의 요약 내용을 토대로 활용법을 숙지한뒤에 어느 정도 개념 정리가 된 후 더 깊이 공부해 보실 것을 추천드립니다.

요약

  1. 우리는 프로그래밍을 하기 위해 숫자나 문자같은 어떤 데이터를 이용합니다.
  2. 데이터를 하나하나 적어가면서 활용하기엔 다 기억하기도 어렵고 관리하기도 힘듭니다.
  3. 따라서 관리하고 알아보기 쉽게 데이터에 대입(할당)이라는 과정을 통해 이름을 부여합니다.
  4. 데이터에 이름을 부여하면서 해당 이름에는 새로운 데이터로 변경이 가능한 변수와 처음 선언되면 데이터의 내용이 변할 수 없는 상수로 정할 수 있습니다.
  5. Swift에서는 var 키워드를 활용하여 변수로 선언하고, let 키워드를 이용하여 상수를 선언합니다.
  6. 위의 키워드는 처음 이름을 붙이는 과정에 한번만 선언해주고 그 뒤로는 이름만 이용하여 데이터를 처리합니다.
Share 0 Comments

iOS를 위한 기본지식

iOS 프로그래밍을 시작하기 위해서 필요한 지식들을 정리해 보았습니다.


필수환경

Xcode

Xcode란 macOS에서 사용할 수 있는 통합개발환경(Integrated Development Environment, 이하 IDE)입니다.
주로 macOS, iOS, watchOS, tvOS 개발을 위해 애플에서 개발됐으며, macOS에서 간단하게 App Store에서 다운받을 수 있습니다.
이미 기존 개발자라면 한번쯤을 들어봤을 이클립스(eclipse)나 Intellij:IDEA 를 연상하면 이해하기가 쉬울 것 같습니다.
간단히 개념을 설명하면 한가지 언어만이 아니라 여러 언어의 소스코드를 작성하거나 관리하는데 편의를 제공해주는 유용한 도구라고 할 수 있습니다.
하지만 각 IDE마다 특색이 있어서 특정 언어의 개발환경에 특화되어 좀 더 편리하게 최적화 되어 있는 편이며, Xcode의 경우 Objective-C나 Swift등을 활용하여 macOS, iOS, watchOS, tvOS등을 위한 프로그램을 개발 하는데에 좀 더 특화된 툴이라고 할 수 있습니다.

iOS

iOS를 이해하기 위해선 운영체제(Operating System, 이하 OS)를 먼저 이해해야 합니다.
간단히 정리하자면 하드웨어를 관리할뿐 아니라 응용 소프트웨어를 실행하기 위하여 실행되는 시스템 소프트웨어입니다. 보통 입출력과 메모리 할당과 같은 응용 프로그램과 컴퓨터 하드웨어 사이의 중재 역할을 합니다.
iOS는 애플(Apple)에서 만들었으며 현재 iPhone, iPad, iPod touch 등 많은 모바일 기기에서 사용되는 모바일 운영체제입니다. iOS UI(User Interface)의 특징은 기본적으로 멀티터치 제스처(multi-touch gestures)가 적용이 되어있다는 것입니다. 모바일 운영체제답게 터치스크린을 통해 디바이스와 사용자간의 communication을 가능하도록 한다고 할 수 있습니다.

iOS SDK

iOS개발을 위해선 iOS SDK가 필요합니다.
여기서 SDK란 Software Development Kit의 줄임말로, 소프트웨어 개발을 위한 툴(Tool)들의 모음이라고 할 수 있습니다.
SDK는 내부에 있는 툴(Tool)들을 활용하여 어플리케이션을 만들수 있도록 컴퓨터의 하드웨어, 운영체제등의 환경을 맞춰주어 소스가 컴파일되고 실행될 수 있도록 해주는 일련의 작업들을 세팅해주는 역할을 합니다. 흔히 우리가 개발자가 아니더라도 PC에서 Java환경을 이용하기 위해 JDK를 다운받는 것을 볼 수 있는데 JDK가 바로 Java의 SDK인 Java Development Kit 입니다.
이 글이 올라갈 iOS카테고리에는 iOS개발에 초점을 맞출 예정이기에 iOS SDK가 앞으로 꼭 필요한 툴 중에 하나라고 할 수 있습니다.
iOS SDK는 Mac 유저에게 무료로 제공하고 있으며, Windows에서는 사용할 수 없습니다. 요즘엔 Xcode에 포함되어 함께 Xcode를 설치했다면 자동으로 환경이 갖추어졌다고 할 수 있습니다.

Playground(플레이그라운드)

플레이그라운드는 놀이터라는 뜻 답게 소스코드를 작성하고 실행하면서 간단하고 쉽게 테스트할 수 있는 개발환경이라고 할 수 있습니다.
두 개의 Playground가 있는데, Xcode의 Swift 플레이그라운드가 있고, iPad에서 다운받아 사용할 수 있는 Playground 앱이 있습니다.
Xcode에서 Playground를 만들면 프로젝트를 만들때처럼 하나의 환경이 세팅이 되며, Swift소스 파일과 파일의 실행을 위한 환경설정파일등이 playground확장자를 가지는 폴더에 포함되어 생성됩니다.
장점은 따로 컴파일과 실행과정을 거치지 않고 소스를 수정하면 실시간으로 자동 실행하면서 결과를 보여줍니다.


프로그래밍 지식

컴파일과 실행

컴파일은 프로그래밍 언어를 사용하여 작성한 프로그램 소스파일을 컴퓨터가 인지할 수 있도록 Binary Code(0과 1로 이루어짐)로 변환해주는 작업을 의미합니다.
C, Java나 Swift등의 컴파일 언어는 실행하기 전에 컴파일을 해주어야 컴파일된 파일을 컴퓨터가 인식하여 정상적으로 실행이 가능합니다.
장점은 컴파일 과정에서 소스의 오류를 쉽게 파악할 수 있으며, 단점은 컴파일 과정이 필요하므로 시간이 더 필요하고 해당 소스가 아니라 컴파일된 소스를 이용하여 동작한다는 생각을 항상 생각해줘야한 다는 것이 있습니다.
실행은 프로그램을 동작하도록 하는 작업입니다.
프로그램이 동작하기 위해선 하드디스크등에 저장된 소스를 메모리에 올려 CPU에서 처리하는 작업이라고 할 수 있습니다.
이에 대한 자세한 설명은 Computer Science 카테고리에 따로 정리할 예정입니다.

스위프트(Swift)

스위프트는 애플에서 개발된 오픈소스 프로그래밍 언어입니다.
앞으로 Swift를 위주로 iOS개발에 관한 글을 올릴 예정입니다.

Hello World

프로그래밍을 처음 배울때 필수 코스(?)중 하나인 Hello World 찍기를 해보려면 아래의 소스코드를 작성해보면 됩니다.
간단한 실행테스트를 할 것이기에 플레이그라운드를 활용하여 작성할 수 있습니다.

1
2
3
4
5
import UIKit

var str = "Hello, iOS World"

print(str)


마치며

그동안 Java, JavaScript, Python 등을 배우고 앞으로도 사용하긴 할테지만 주 분야를 iOS로 정했고 꾸준히 공부하면서 발전할 것입니다.
블로그를 통해 공부한 내용을 공유하며 중간중간 다른언어와의 비교도 해보면서 Swift 및 iOS개발에 대해 함께 토론하고 공부해나가는 공간이 되었으면 좋겠습니다.

Share 0 Comments

[JS]함수형프로그래밍

이번 글에서는 자바스크립트의 함수형 프로그래밍에 대해 알아볼 예정입니다.
여러 자료를 찾아보고 공부하며 생각을 정리하여 쓴 글이라 오타와 오류가 있을 수 있습니다.
언제나 오타와 내용의 오류 지적은 환영입니다 :)

함수형 프로그래밍

함수형 프로그래밍을 위해선 크게 세가지 개념이 필요합니다.

  1. 순수함수(pure function)
    부작용(side-effect)이 없는 함수, 즉, 함수의 실행이 외부에 영향을 끼치지 않는 함수를 뜻 합니다. 따라서 순수한 함수는 스레드에 안전하고, 병렬적인 계산이 가능합니다.
  2. 익명함수(anonymous function)
    이름이 없는 함수를 뜻 합니다. 이는 함수명을 메모리에 할당하지 않을 수 있다는 장점이 있습니다.
  3. 고계함수(higher-order function)
    함수를 다루는 함수를 뜻 합니다. 함수형 언어에서는 함수도 ‘값(value)’으로 취급합니다. 예를 들어, 정수 1이나 인수를 제곱하는 함수나 동등한 입장에서 다룰 수 있습니다.
    정수를 함수의 인수로 전달할 수 있듯이 어떤 함수도 다른 함수의 인수로 전달할 수 있습니다. 마찬가지로 함수의 결과 값으로 정수를 반환할 수 있듯이 함수를 반환할 수도 있습니다.

자바스크립트의 함수형 프로그래밍

자바스크립트에서도 함수형 프로그래밍이 가능합니다. 그 이유는 자바스크립트가 다음을 지원하기 때문입니다.

  • 일급 객체로서의 함수
  • 클로저
  • Arrow function 등의 익명함수

함수형 프로그래밍의 특징 3가지와 밀접한 세가지 기능으로 각각 일급 객체로서의 함수는 고계함수의 특성, 클로저는 순수함수의 특성, 화살표함수등의 익명함수는 익명함수의 특성을 가지고 있습니다.


일급객체로서의 함수

함수가 일급 객체로 취급된다는 이야기 입니다.
특정 언어의 일급 객체 (first-class citizens, 일급 값, 일급 엔티티, 혹은 일급 시민)라 함은 일반적으로 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체를 가리킵니다.
함수에 매개변수로 넘기기, 변수에 대입하기와 같은 연산들이 여기서 말하는 일반적인 연산의 예에 해당합니다.
아래는 좀더 구체적인 일급객체의 특징을 정리한 것입니다.

  • 특정 언어의 일급 객체 특징
    • 변수나 데이터 구조안에 담을 수 있다.
    • 파라미터로 전달 할 수 있다.
    • 반환값(return value)으로 사용할 수 있다.
    • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
    • 동적으로 프로퍼티 할당이 가능하다.

가장 간단한 스칼라 타입인 정수(Integer)나 실수(Floating point number)의 경우 거의 모든 언어에서 항상 일급 객체에 해당합니다.

자바스크립트에서는 특별히 함수도 일급객체로 취급된다는 점이 함수형 프로그래밍이 가능한 이유입니다.
이런 경우 함수의 인자로 함수를 넘길수도 있고, 결과로 함수를 반환할 수도 있습니다.

클로저(Closure)

사실 클로저는 위에서 언급한 일급객체로서의 함수가 존재하지 않으면 성립할 수 없는 개념입니다.
리턴으로 함수를 통째로 반환할 수 있는 성질을 이용한 것으로, 이미 생명 주기가 끝난 외부 함수의 변수를 참조하는 함수를 클로저라고 합니다.

1
2
3
4
5
6
7
8
9
function 외부함수() {
var 외부함수의지역변수 = "something";
return function() { // 클로저
/* 외부함수의지역분수, 외부함수의 arguments와 arguments를 활용한 로직 */
}
}
var 사용할함수 = 외부함수();
/* 외부함수의 실행 컨텍스트가 끝남 */
사용할함수(); // 실행

위의 코드를 보면 외부함수의 호출이 이루어지고, 이 외부 함수에서 사용할함수가 반환됩니다.
반환된 함수가 클로저이고 사용할함수로 사용됩니다.
이렇게 최종 반환되는 함수가 외부함수의 지역변수에 접근하고 있다는 것이 중요한데, 이 지역변수에 접근하려면, 함수가 종료되어 외부 함수의 컨텍스트가 반환되더라도 변수 객체는 내부 함수의 스코프 체인에 그대로 남아있어야만 접근할 수 있습니다.
이 클로저가 자바스크립트의 함수형 프로그래밍에서 중요한 이유는 위에 언급했듯이 순수함수의 기능을 갖고 있기 때문입니다.
클로저는 참조되는 외부변수를 내부에 감싸고 참조만하면서 실행되는 시점과 상관없이 항상 일정한 결과값을 주기 때문에 이를 순수함수라 할 수 있습니다.
다만, 모든 클로저가 순수함수인것은 아닙니다.
클로저를 만들때 순수함수가 되도록 작성해주어야 사용자들이 원하는 대로 함수형프로그래밍 패러다임에 따라 동작하게 될 것입니다.

익명함수

익명함수는 사실 효율성에 초점이 맞춰져 있다고 생각합니다.(함수형 프로그래밍을 하려면 필수로 알아야한다고 생각)
주로 일급객체로서 함수를 다루다보면 리턴시 혹은 함수의 파라미터에 함수를 넣을때 굳이 변수로 따로 할당을 하지 않고 싶을때라던가 스코프를 나눌때 사용합니다.
함수형 프로그래밍에서 익명함수는 그 자체가 함수가 할당된 변수와 같다고 생각하고 사용하시면 됩니다.
사실 익명함수가 있기에 위에 나온 클로저라던가 일급객체로서의 함수가 더 효율적으로 활용된다고 생각합니다.


함수형 프로그래밍 활용

간단한 알고리즘 문제를 예로 들어보겠습니다. 클로저와 cache를 활용한 피보나치와 팩토리얼 함수가 있습니다.
이 두 함수는 초기값이 있고, 캐쉬를 활용하며, 재귀 호출을 활용한다는 공통점이 있습니다.
차이점은 내부의 산술식이 다르다는 것이죠.
그 공통점을 함수형 프로그래밍을 활용해 구현해보면 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var functional = function(cache, func) {
var calculate = function(n) {
var result = 0;
if (typeof(cache[n]) === 'number') result = cache[n];
else result = cache[n] = func(calculate, n);
return result;
}
return calculate;
};
var factorial = functional({'0':1}, function(func, n) {
return n * func(n-1);
});
var fibonacci = functional({'0':0, '1':1}, function(func, n) {
return func(n-1) + func(n-2);
});

console.log(factorial(10));
console.log(fibonacci(10));

위 코드를 간단히 설명하자면,
functional이라는 함수를 정의하여 각 계산에 필요한 함수를 입력하여 활용할 수 있도록틀을 만들고, factorial과 fibonacci라는 함수를 정의할때 기존에 있는 functional함수를 이용하여 각각 독립적인 로직을 갖는 구현체를 만드는 개념입니다.

좀 더 자세히 위의 코드를 분석하자면,
처음에 큰 그림이 되는 functional이라는 함수를 선언합니다. 이때 리턴값은 calculate라는 함수가 됩니다.
그 후 각각 factorial과 fibonacci라는 변수를 선언시 위의 functional함수에 인자로 원하는 캐쉬와 산술식을 넣고 실행합니다.
실행결과로 해당 factorial과 fibonacci 변수에는 각각 functional함수를 실행할때 리턴된 calculate함수를 할당받습니다.
calculate함수를 실행할땐 n이라는 변수 하나가 필요합니다.
따라서 각 함수를 실행시킬때 원하는 n 값을 입력하여 실행하면 우리가 원하는 결과값을 리턴받을 수 있습니다.


이 글을 쓰며 도움받은 레퍼런스

Share 0 Comments