클로저

클로저는 코드의 블럭입니다. 일급시민(first-citizen)으로, 전달인자, 변수, 상수 등으로 저장, 전달이 가능합니다.  
함수는 클로저의 일종으로, `이름이 있는 클로저`라고 생각하면 됩니다.


소스코드


기본 클로저 문법

{ (매개변수 목록) -> 반환타입 in
    실행 코드
}


클로저의 사용

// sum이라는 상수에 클로저를 할당
let sum: (Int, Int) -> Int = { (a: Int, b: Int) in
    return a + b
}

let sumResult: Int = sum(1, 2)
print(sumResult) // 3


함수의 전달인자로서의 클로저

클로저는 주로 함수의 전달인자로 많이 사용됩니다. 함수 내부에서 원하는 코드블럭을 실행할 수 있습니다.

let add: (Int, Int) -> Int
add = { (a: Int, b: Int) in
    return a + b
}

let substract: (Int, Int) -> Int
substract = { (a: Int, b: Int) in
    return a - b
}

let divide: (Int, Int) -> Int
divide = { (a: Int, b: Int) in
    return a / b
}

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var calculated: Int

calculated = calculate(a: 50, b: 10, method: add)

print(calculated) // 60

calculated = calculate(a: 50, b: 10, method: substract)

print(calculated) // 40

calculated = calculate(a: 50, b: 10, method: divide)

print(calculated) // 5

//따로 클로저를 상수/변수에 넣어 전달하지 않고, 
//함수를 호출할 때 클로저를 작성하여 전달할 수도 있습니다.

calculated = calculate(a: 50, b: 10, method: { (left: Int, right: Int) -> Int in
    return left * right
})

print(calculated) // 500



다양한 클로저표현

클로저는 다양한 모습으로 표현될 수 있습니다.

  • 함수의 매개변수 마지막으로 전달되는 클로저는 후행클로저(trailing closure)로 함수 밖에 구현할 수 있습니다. 
  • 컴파일러가 클로저의 타입을 유추할 수 있는 경우 매개변수, 반환 타입을 생략할 수 있습니다.
  • 반환 값이 있는 경우, 암시적으로 클로저의 맨 마지막 줄은 return 키워드를 생략하더라도 반환 값으로 취급합니다.
  • 전달인자의 이름이 굳이 필요없고, 컴파일러가 타입을 유추할 수 있는 경우 축약된 전달인자 이름($0, $1, $2...)을 사용 할 수 있습니다.


소스코드



클로저 매개변수를 갖는 함수 calculate(a:b:method:)와 결과값을 저장할 변수 result를 먼저 선언해둡니다.

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

var result: Int


후행 클로저

클로저가 함수의 마지막 전달인자라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있습니다.

result = calculate(a: 10, b: 10) { (left: Int, right: Int) -> Int in
    return left + right
}

print(result) // 20


반환타입 생략

calculate(a:b:method:) 함수의 method 매개변수는 Int 타입을 반환할 것이라는 사실을 컴파일러도 알기 때문에 굳이 클로저에서 반환타입을 명시해 주지 않아도 됩니다. 

대신 in 키워드는 생략할 수 없습니다.

result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) in
    return left + right
})

print(result) // 20

// 후행클로저와 함께 사용할 수도 있습니다
result = calculate(a: 10, b: 10) { (left: Int, right: Int) in
    return left + right
}

print(result) // 20


단축 인자이름

클로저의 매개변수 이름이 굳이 불필요하다면 단축 인자이름을 활용할 수 있습니다. 단축 인자이름은 클로저의 매개변수의 순서대로 $0, $1, $2... 처럼 표현합니다.

result = calculate(a: 10, b: 10, method: {
    return $0 + $1
})

print(result) // 20


// 당연히 후행 클로저와 함께 사용할 수 있습니다
result = calculate(a: 10, b: 10) {
    return $0 + $1
}

print(result) // 20


암시적 반환 표현

클로저가 반환하는 값이 있다면 클로저의 마지막 줄의 결과값은 암시적으로 반환값으로 취급합니다.

result = calculate(a: 10, b: 10) { $0 + $1 } print(result) // 20 // 간결하게 한 줄로 표현해 줄 수도 있습니다 result = calculate(a: 10, b: 10) { $0 + $1 } print(result) // 20


축약 전과 후 비교

//축약 전
result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) -> Int in
    return left + right
})

//축약 후
result = calculate(a: 10, b: 10) { $0 + $1 }

print(result) // 20


관련문서

* The Swift Programming Language - Closures

* 일급시민(first-citizen)





by yagom

facebook : http://www.facebook.com/yagomSoft

facebook group : https://www.facebook.com/groups/yagom/


p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓ 블로거에게 공감은 큰 힘이 됩니다 ↓↓↓ 


'Swift > 기본문법' 카테고리의 다른 글

상속  (0) 2017.06.29
프로퍼티 - Property  (2) 2017.06.26
클로저 - Closure  (0) 2017.06.22
클래스, 구조체, 열거형 비교  (0) 2017.06.19
열거형 - Enumerations  (0) 2017.06.15
클래스  (0) 2017.06.12
Posted by yagom

댓글을 달아 주세요


오늘의 주제

1. Singleton Pattern 


마흔 일곱 번째 시간입니다.^^

지난 번에는 파일을 저장하고 로드하는 것을 해 보았습니다.
이번에는 파일에서 로드해 온 자료를 다른 객체들과 공유하여 사용하고 싶을때 사용해 볼만한 방법을 가지고 왔습니다~

물론 Objective-C에서만 쓰이는 방법이 아니지만, iOS 개발 할 때에도 유용하게 쓰일 수 있는 방법이라 이렇게 또 소개를 해 드립니다.
싱글톤 패턴이라고 흔히 이야기들을 하는데요, 무엇인지 한 번 알아보도록 합니다~


# 싱글톤 패턴이란?

한 프로그램에서 특정한 용도의 객체 하나를 생성해서 공용으로 사용하고 싶을 때 주로 사용하는 방법입니다.

주로 환경설정, 로그인 정보, 유저 정보 등을 한 번 객체에 생성해 두고 여러 객체에서 공유해서 데이터를 쓸 수 있는 방법이죠.

즉, 프로그램이 실행되고 끝날 때 까지 특정용도를 가지는 단 하나의 객체를 만들어 놓고 쓰게 되는 것입니다. 물론 임의로 해제해 주지 않는다면요 :)

말로만 이렇게 떠들어 대니 잘 감이 안오시죠?ㅎㅎㅎ

그런데 일단 static 이라는 녀석에 대해서 조금 알아보실 필요가 있습니다.

static이 어떤 녀석인지 정확히 알고 계신분은 바로 따라오셔도 좋습니다~

모르는 분들은 프로그래밍 언어 기본서에 보면 나와있을거구요, 포털 검색을 통해서도 많이 나올거예요^^~

자, 그럼 실습을 시작해 봅니다~
 

# 실습

지난 번에 만들었던 프로젝트를 그대로 사용합니다~

여러 객체간에 데이터를 공유하는 것을 실습해 볼 것이므로, 화면을 옮겨다녀 보는게 효과적일 것 같네요~

뷰 컨트롤러를 하나 더 만들어 줍니다 ㅎ


자, 그리고 이렇게 지난 번에 했던 것 처럼 새로운 뷰 컨트롤러에도 화면을 구성해 줍니다~



자, 이번엔 싱글톤 클래스를 생성하도록 할게요~




NSObject를 상속받는 SingletoneObject라고 이름을 지었어요. 사실 Singleton이 맞는 표현인데, 제가 자꾸 Singletone이라고 쓰네용 +_+


자, 이렇게 새로 생성된 클래스의 헤더에 와서요~

이런저런 것들을 작성합니다.

지난번에 파일에서 읽고 쓰기 했던 것들도 여기로 옮겨올 거구요, 공통적으로 쓰고 불러올 NSString 객체 포인터도 하나 만들어 줬구요~ 


자, 헤더에서 property로 던져줬으면 구현파일에서 synthesize로 받아주는거 잊지 않으셨죠?ㅎ

그리고 지난 번에 파일저장 메소드 구현했던 부분에서 복사해와서 붙여넣고 살짝 손봐줍니다 ㅎㅎㅎ


파일에서 불러오기도 마찬가지구요 :~)


자, 그리고 가장 핵심부분!!!

싱글턴 객체를 만들어주는 부분입니다.

static이라는 처음보는 녀석이 등장했죠? 주석으로 간략하게 설명을 써놓긴 했지만, 이해가 힘드시다면 검색을 해 보시는 것을 강력추천합니다 ^^; 



자, 이렇게 싱글톤 클래스까지 완성을 했습니다~

이제 이 녀석을 어떻게 사용하게될지 궁금하지 않으세용?ㅎㅎㅎ

제가 앞으로 어떻게 진행할지 감이 오는 분들도 분명 계실거 같아요 ㅎㅎ

음... 일단 오늘은 여기까지 쓸건데요 ㅎㅎ 한 번 써보고 싶은 분들은 마음껏 써보세요~

컴퓨터 폭발 안합니다~ 


으히히, 여튼 다음에 또 만나용~ :-)





by yagom

facebook : http://fb.yagom.net

twitter : http://twitter.yagom.net ( @yagomsoft )

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 손가락 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 




Posted by yagom

댓글을 달아 주세요

  1. 컴맹 2012.09.16 05:37  댓글주소  수정/삭제  댓글쓰기

    오~ 멀티쓰레드까지 신경써주시는군요.^^
    오늘도 많이 배우고 갑니다.
    좋은 강좌감사합니다.~~

  2. 시우아빠 2012.11.20 11:49  댓글주소  수정/삭제  댓글쓰기

    멀티쓰레드` 갑자기 튀어나와서 ㅋㅋ 검색해봤습니다.^^
    역시 공유 객체의 경우 저렇게 보호를 해줘야 하겠네요
    좋은 내용 많이 배워 갑니다.

  3. 디지시스 2013.04.25 16:04  댓글주소  수정/삭제  댓글쓰기

    에잇 왜 추천은 한번밖에 안되는걸까요

  4. Hide 2013.11.28 15:25  댓글주소  수정/삭제  댓글쓰기

    야곱님 사랑해요


오늘의 주제

1. Class? Object? 


다섯 번째 시간입니다.^^

이제까지는 정말 Objective C를 배웠다고 하지도 못할 정도로 아주 기초적인 내용을 다루어 보았습니다.
지난 번에는 실수 표현방법에 대해 알아보았습니다.
조금 도움이 되셨는지요??
나중에 언젠가는 꼭 필요한 날이 올테니 알아두시길~!^^ 
지금부터 몇 번에 걸쳐 포스팅할 내용들(클래스, 메소드, 인스턴스 등등)의 내용만 이해를 하신다면,
"나 Objective C 70%는 이해했어" 라고 말하실 수 있을거예요.
정말 중요한 것이니 몇 번을 보고, 다른 싸이트를 검색하고, 직접 계속 생각하며 익히도록 하세요~!
iOS Dev 포스팅의 클래스와 객체 챕터를 인용하여 조금 더 설명을 추가하여 보았습니다.

힘겨운 발걸음을 한 번 떼어 볼까요?
스따뚜~~~~~~~~~~~~

Objective-C는 '객체지향언어'입니다.

객체지향언어는 객체지향 프로그래밍을 지향하는데요...

아.. 처음 보는 분들은 도무지 무슨말인지, 뭔소린지 도통 모르시겠죠?ㅎㅎ

사실, 모든 것을 시작을 할 때 기초를 탄탄히 다지고 하는것도 좋지만 전 지금 여러분들이 프로그래밍에 대한 지식이 전무하다고 생각을 하고 진행해 볼 생각입니다.

일단, 머리아프게 생각하지 맙시다..ㅎㅎ

지금 기초부터 정말 탄탄히 다지고 싶은분들은..

객체지향언어, 객체지향 프로그래밍, Objective-C, 객체, 인스턴스, 메소드, 클래스에 대해서 역사부터 차근차근 공부하고 오시길 바랍니다. 그러면 조금 더 이해가 잘 갈 수도 있어요^^

하.지.만...

공부하고 되돌아 오시는 분들은 그렇게 많지 않을 것 같네요.ㅎㅎ

하다가 분명히 지칠 것 같아요^^..

그냥 간단간단하게 알아두고 차근차근 한 번 생각하며 나가 봅시다~

일단 저만 믿고 와보시라니까요^^~


# Object와 Class란?

클래스. 우리나라 말로 바꿔보면, 등급? 교실? 종류? 도대체 뭘까요? 흠... 그냥 클래스입니다. 뭐 어떻게 표현할 방법이 없네요 ㅋㅋㅋ
굳이 하나 정하자면 종류??? 
Object란..? 
한글로 하면 객체입니다.

그렇다면 객체란 무엇일까요??
우리는 객체를 '내 차(My Car)'라고 생각해 봅시다.
여기석 클래스라는 녀석도 등장을 하는데, 클래스는 공장의 '생산라인'이라고 생각합시다.
공장의 생산라인에서는 똑같이 생긴 차량을 우리가 필요한 만큼 만들어 냅니다. 
이것이 클래스와 객체간의 관계입니다.

 



그림에서 보는 것과 같이..(발로그려서 죄송...ㅋㅋ) 생산라인에서 똑같이 생긴 자동차를 뽑아냅니다.
하지만 차량마다 번호가 다르고 탑승하는 사람도 제각각입니다.
이처럼 클래스는 어떠한 객체가 가지는 특정 모양에 대한 내용을 담고 있습니다.
그리고 객체는 찍혀나온 녀석이고, 우리는 그 안에 객체마다 클래스 형식에 맞춰 내가 원하는 내용들을 채워 넣을 수 있습니다. 
 

다른 방법으로 표현하면 클래스는 붕어빵을 찍어내는 쇠로된 틀이고,
오브젝트는 그 틀에서 찍혀나오는 붕어빵으로도 비유할 수 있겠습니다.
또한, 붕어빵에 넣어주는 앙금에 따라 팥앙금을 가지는 붕어빵이 될 수도, 피자맛 붕어빵이 될 수도 있죠.
겉모양은 같은데 말예요^^


또 다른 방법으로 설명해보면...
사람을 하나의 클래스로 본다면, 
우리 하나하나는 객체인 것입니다.
그리고 우리는 한 명 한 명 다른 이름을 가지고 있고, 피부색도 다르고, 성격도 다르고, 직업도 다르지요?
전부 사람이라는 같은 틀 안에서 우리는 각각 개성을 가지는 객체가 되는 것이지요^^

강아지도 강아지라는 클래스에서 나오는 객체이지만
종에따라서 색도 크기도 성격도 가지가지 입니다.
 
이제 프로그래밍에서 우리는 창조주가 되는 거에요.
사람의 틀을 가지는 클래스를 만들 수 있고, 
그 틀에는 인종, 성격, 생각 등 다양한 내용을 채울 수 있는 공간을 만들어 두는거죠.

그 후에 우리는 우리가 창조해 놓은 틀(클래스)를 이용해서 사람을 하나하나 찍어내어 만듭니다.
사람 하나를 만들어 놓고,
이름이라는 특징에는 야곰 이라고 채워 넣고
인종이라는 특징에는 황인종을 채워 넣고
외모라는 특징에는 잘생기고, 키크고...
성격이라는 특징에는 사랑스럽고 멋지고 센스있고 착하고 젠틀하다 라는 내용을 채워넣곸ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
생각이라는 특징에는 프로그래밍, 프로그래밍, 프로그래밍... 뭐 이딴것들을 채워 넣습니다.
이렇게 해서 야곰이라는 이름을 가진 객체가 탄생하는 것입니다.
하지만 이 틀(클래스)는 영원불변 하므로 언제든지 이 틀을 사용하여 또다른 사람을 만들어 낼 수 있는 것입니다.
이렇게 따지면 장동건, 원빈, 이승기... 뭐 다들 저랑 같은 틀에서 나온 사람이라 이거죠^^ㅋㅋㅋㅋㅋㅋㅋ
 

조금 이해가 가시나요? 이해가 지금 당장 가지 않으셔도 좋습니다~!
그냥 읽어두세요!!
걱정하실 필요 없구요~ 서서히 시간이 지나고 가끔씩 제가 클래스니 변수니 이런말을 무의식중에 할 때 마다 한 번씩 와서 다시 봐주세요^^ 이해가 잘 안가시면 구글에서 검색해 보시면 도움이 되는 자료들이 많을 거예요~
 
그리고 인스턴스(Instance) 또는 인스턴스변수라는 이름도 종종 보게 되실텐데요, 이녀석은 다름이 아니라 객체를 지칭하는 말입니다. 인스턴스 = 객체라고 생각하시면 됩니다.
 
그럼 여기서 대충 클래스, 객체(인스턴스)의 관계에 대하여 알아보았습니다. 책에서 보면 원론적인 내용들이 굉장히 많아서 헷갈리는 경우도 많고, 요거만 보다가 지쳐 쓰러지는 경우도 있으니.. 일단 여기서 잠시 접어둡시다~ 사실 이게 다예요^^;

정 더 궁금하시다면... 대충 흝어보고 오세요~
http://ko.wikipedia.org/wiki/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
http://ko.wikipedia.org/wiki/%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8B%B0%EB%B8%8C-C
http://www.webdoor.org/xe/135
http://kldp.org/node/108983
별 내용은 없을거예요~

객체지향언어는 왜 사용하는지, Objective-C는 왜 C랑 다른지... 등등은 C를 배우지 않으신 분들이 아니라면 굳이 여기서 설명해 드릴 필요는 없을 것 같아요^^
다음 번 정도에 객체지향언어의 특징과 왜 객체를 사용하는지 정도에 대해서 간략히 설명해 드릴게요. (만약 제가 깜빡하고 안하면 댓글 남겨주세요..ㅎㅎ)

by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓
Posted by yagom

댓글을 달아 주세요

  1. 초보자. 2012.05.31 22:06  댓글주소  수정/삭제  댓글쓰기

    잘읽었습니다. 많은 도움이 됬습니다. 감사합니다.

  2. 우왕굿! 2012.07.11 12:07  댓글주소  수정/삭제  댓글쓰기

    정말 쉽게이해할수있었습니다!! ㄱㅅㄱㅅ

  3. 혁고 2012.07.13 09:23  댓글주소  수정/삭제  댓글쓰기

    주인님 주인님
    제가 이 글을 보고 이해하려 노력중인데요
    대충 이해가 되는것같긴한데 결과적으로 못한듯

    이글에서 클래스를 통해 찍어내는 객체마다 인스턴스변수가 다 다를거라고 하셨던거같은데 맞나욤?
    클래스를 통해서 찍어내는 객체가 무엇을 말하는지 이해가 안돼요!! 구체적으로 결과물을 알려주신다면 감사
    제가 c만 조금알고 이번에 아이폰프로그래밍강좌를 듣고있는데요
    좀 뭔가 매치가 안되는듯,, ㅜㅜㅜㅜ






    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.07.14 15:57 신고  댓글주소  수정/삭제

      안녕하세요 혁고님.
      처음부터 이해하려고 애쓰실 필요 없습니다..^^
      물론 기초와 개념이 중요하긴 하지만 처음부터 깊게 이해하실 필요 없습니다.
      일단
      http://blog.yagom.net/20
      이 글을 5번 정독 해 보시고 정 이해가 안된다 하시면 뒷 부분 이어서 보시고, 나중에 제가 클래스니 객체니 얘기를 할 때 한번 씩 다시 돌아오셔서 보시면 됩니다.

      그리고 구체적인 예가 필요하다고 하시면
      http://blog.yagom.net/23
      여기를 한 번 참고 해 봐 주세요~^^*

      그리고 C와는 다른 개념들이 아주 많습니다.
      초보의 입장에서 C랑 비교하고, C의 기준에서 이해하려고 하면 굉장히 힘들거예요. Objective-C는 Objective-C 있는 그대로 받아들이시기 바랍니다. ^^

      자주 들러주세요~ 고맙습니다 :-)

  4. chosamong 2012.08.24 21:10  댓글주소  수정/삭제  댓글쓰기

    C도 모르고 Obj-c도 모르기 때문에
    이해는 부족
    다만 감사의 마음을 폭풍 댓글로 호응중 ^^

  5. Sori_Park 2014.02.13 17:14  댓글주소  수정/삭제  댓글쓰기

    매번 좋은 강의 감사드려요^^
    안드로이드쪽 하다가 iOS 넘어왓는데
    yagom님 덕분에 낯설지 않게,
    이해하기 쉽게 배울 수 있는 것 같아요.

  6. 초보 2014.02.17 17:09  댓글주소  수정/삭제  댓글쓰기

    정말 잘 읽었습니다. R은 배우고 있는데 프로그래밍 지식이 전무한데 ㅠㅠㅠ
    도움이 많이 되었습니다.


오늘의 주제

1. iOS Application의 화면구조
2. View Controller
3. 화면에 보이지 않는 Object 종류 알아보기

일곱 번째 시간입니다.

지난번에는 Object에 대하여 조금 알아보았습니다~

오늘은 iOS App의 화면구조와 아직 배우지 못한 몇몇 객체들에 대해 알아봅시다...ㅎㅎ

자 이제 본론으로 고고 ^^

# iOS Application의 화면구조

우리가 iOS를 사용할 때 보이는 화면구조에 대해서 조금 먼저 알아볼 필요가 있겠습니다.
일단 최고로 상위에 있는 녀석이 UIWindow입니다.
지난 번에 설명드렸듯이 iOS는 하나의 윈도우창으로 이루어져 있습니다. 즉 하나의 화면 안에서 모든 것들이 이루어지는것이라는 말이죠. 즉, 컴퓨터로 생각해 보면 하나의 모니터가 있고, 그 모니터 안에 여러개의 창을 띄워놓고 작업하지요? 그것과 같습니다.
한 화면 안에서 여러개의 창을 띄워놓을 수 있습니다.
그 하나하나의 창을 우리는 View로 표현 할 수 있습니다.
헷갈리시나요?
일단 아래의 그림을 봅시다.
하나의 UIWindow안에 View가 여러개 존재하여 보여질 수 있습니다.
View가 각자의 영역을 가지고 보여질 수도 있고, 곂쳐져 보여질 수도 있습니다.
이래도 솔직히 감이 안옵니다 ㅎㅎ
또 아래의 그림으로 가봅시다.


[##_http://blog.yagom.net/script/powerEditor/pages/1C%7Ccfile2.uf@131957454EBAB4AE1F41BC.png%7Cwidth=%22500%22%20height=%22750%22%20alt=%22%22%20filename=%222.png%22%20filemime=%22image/jpeg%22%7C_##]

실질적인 어플리케이션의 화면입니다.
화면 최상단에는 Status Bar, 즉 상태바가 있지요.
상태바를 보여줄지 안보여줄지는 개발자의 선택입니다.
일단 이 어플리케이션에는 상태바가 보이네요.
상태바도 하나의 뷰로 생각할 수 있습니다.
우리는 상태바를 보이게 할지 안보이게 할지, 또 상태바의 스타일은 어떤식으로 표현할지 등을 정할 수 있습니다. 
화면에 보면 일단 메인뷰(UIView)가 존재하고 메인뷰 크기만큼의  이미지뷰(UIImageView)가 존재합니다. 이미지뷰로 배경화면을 깔아 놓았고 그 위에 버튼들로 구성된 화면입니다.
버튼(UIButton)도 View의 종류중에 하나입니다. 화면에 보이는 거의 모든것이 View에서 상속받은 것인데요, 상속이라는 것은 뭐 일단을 설명하지 않겠습니다.ㅎㅎ
지금 보다시피 지금 이 화면(UIWindow)에는 하나의 뷰(UIView)위에 이미지뷰(UIImageView)하나가 얹어져 있고, 버튼(UIButton) 5개로 이루어진 윈도우입니다.
위에 설명이 잘 이해가 안가시면... 지난 번 포스팅을 한 번 더 보고 오시는것은 어떨까요?ㅎ
 


아래 화면을 보시면 하나의 윈도우 위에 상태바가 존재하고 메인 뷰 위에 배경을 씌운 이미지 뷰 하나, 그위에 여러 View들로 이루어져 있습니다.
사용자의 선택을 받기 위한 버튼들, 제목표시를 위한 라벨, 입력받기 위한 텍스트필드와 텍스트뷰가 존재합니다. 지난 번에 설명해 드린 것을 참고하시면 어떤 역할을 하는지 대충 감이 오시겠죠?ㅎ


이렇게 화면에 많은 뷰들로 구성이 되어있는데 이 많은 뷰들을 어떻게 관리를 해 줄 것인가??
그런 생각이 드실거예요. 뷰들이 화면에 어떤 모양으로 보여지게 될지는 뷰 자체적으로 결정을 합니다. 하지만 사용자의 입력을 받거나 사용자의 행동에 따라 화면을 어떻게 바꿔줄지 또는 어떤 동작을 하는지는 Controller라는 녀석이 결정을 하게 됩니다.
헷갈리기 시작하시는 모습이 눈에 선합니다 ㅎㅎ
컨트롤러라는 녀석들은 화면에 보이질 않는 추상적인 녀석들이니까요..^^
그럼 거기에 대해서 조금 더 알아볼까요?

# View Controller

이제 컨트롤러 중에서 가장 많이 보게 될 View Controller에 대하여 알아봅니다.
일단 iOS의 동작이 어떤 순서로 이르어 지는지 먼저 살펴봅시다.


iOS는  MVC모델을 기반으로 합니다.
Model - View - Contorller 의 준말입니다.뭐 무슨말인지는 나
중에 이해하게 되실거예요~

Model은 데이터를 저장하는 곳, View는 화면에 보이는 것, Controller는 View와 Model을 관리하는 객체라고 보시면 됩니다.
무슨말인지 잘 감이 안잡히시죠? 괜찮습니다~
어쨋든 Controller라는 녀석이 대부분의 모든것을 주관한다라고 생각해 두세요.
그리고 View Controller는 화면에서 일어나는 것들의 처리를 맡아서 처리한다고 생각하시면 되겠지요?
즉, 컨트롤러들은 일처리를 열심히 하는 일꾼이고, 뷰들은 컨트롤러가 쏴주는 명령과 데이터로 화면에 보여주는 아바타 꼭두각시들입니다. ㅎㅎ
정리가 좀 되실라나요?


# 화면에 보이지 않는 Object 종류 알아보기
그럼 이제까지 화면에 보이는 녀석들을 좀 봤으니 화면에 보이지 않는 녀석들과 컨트롤러 들에 대하여 한 번 알아보도록해요~
 

이름 : Tap Gesture Recognizer
설명 : 화면에 직접적으로 보이지는 않지만 앱 내부에서 열심히 동작하는 녀석들 중에 하나가 Recognizer 녀석들입니다. Recognize하면 알아차리다 라는 뜻이죠? 말 그대로 Tap, 즉 우리가 터치하는 것들을 알아차리고 프로그램에 전달하는 녀석입니다. 이녀석이 사용자가 어디를 탭했다 또는 몇 손가락으로 터치를 했다 라고 전달해 주면 어플이 그에 알맞는 동작을 할 수 있게되는거죠^^ 이녀석은 Recognizer중에 화면을 터치하는 것을 감지해 주는 녀석입니다.
클래스 : UITapGestureRecognizer

이름 : Pinch Gesture Recognizer
설명 : Pinch 하면 집게죠 ㅎ 즉, 손가락을 집게처럼 오므리거나 벌리는 동작을 말합니다. 화면을 확대 축소 할때 주로 쓰이는 동작이죠? 그 동작을 사용자가 하면 시스템에 알려주는 역할을 합니다.
클래스 : UIPinchGestureRecognizer

이름 : Rotation Gesture Recognizer
설명 : 손가락으로 동그랗게 돌리는 것을 인식하여 시스템에 전달해 주는 역할을 합니다.
클래스 : UIRotationGestureRecognizer


이름 : Swipe Gesture Recognizer
설명 : Swipe하면 쓸어내다 이런 뜻이죠. 화면을 쓸어내듯이 미는 동작을 감지합니다. 밀어서 잠금해제 뭐 이런 동작이요 ㅎ
클래스 : UISwipeGestureRecognizer


이름 : Pan Gesture Recognizer
설명 : 쉽게말해서 드래그 하는 동작을 잡아냅니다 ㅎ
클래스 : UIPanGestureRecognizer


이름 : Long Press Gesture Recognizer
설명 : 말그대로 길~~~~~~~~게 누르고 있는 동작을 인식하여 시스템에 알려줍니다~!
클래스 : UILongPressGestureRecognizer


이름 : Object
설명 : 이녀석이 우리가 말하는 객체의 원형이라고 볼 수 있겠네요. 인터페이스 빌더에서 사용할 수 없는 커스텀 객체를 구성 할 수 있습니다.
클래스 : NSObject


이름 : External Object
설명 : 문서 외부에서 끌어오는 객체를 위한 Placeholder, 즉 자리를 차지하게 해주는 인터페이스 빌더의 요소입니다.
클래스 : 


이름 : View Controller
설명 : 드디어 뷰컨트롤러네요 ㅎㅎ 이녀석이 뷰에서 일어나는 일들을 감지하고 어떤 동작을 하고 어떤 변화를 줄지 결정하고 수행하는 역할을 하는 녀석입니다. 아까도 말씀드렸죠? 뷰는 꼭두각시 아바타일 뿐, 요녀석이 조종사입니다 ㅎㅎ
클래스 : UIViewController


이름 : Table View Controller
설명 : iOS보면 목록들을 쭈욱 나열할 수 있는 테이블을 볼 수 있습니다. 사실 테이블이라고 하면 잘 감이 안오시겠지만, 아이폰 설정에 들어가면 설정 메뉴 목록이 섹션별로 나뉘어서 쭈욱 목록이 나오는 것이 테이블입니다. 그 테이블 화면에 나올 것들과 테이블 열(Row)를 눌렀을 때 어디로 이동하게 될지 정해주는 역할을 해요~
클래스 : UITableViewController


이름 : Navigation Controller
설명 : iOS화면 상단에 보면 제목과 뒤로가기버튼, 메뉴 버튼 등이 존재하는 바가 존재하지요? 그것을 네비게이션 바 라고 지난번에 설명을 드렸는데, 그녀석이 뒤로가기 버튼이나 메뉴 버튼을 눌렀을 때 어떤 동작을 취할지 명령을 내리는 컨트롤러 입니다. 아이폰 설정화면 상단에 보면 네비게이션 바가 있지요^^
클래스 : UINavigationController


이름 : Tab Bar Controller
설명 : 탭바를 통제하는 녀석입니다. 그 유명한 카카오톡 화면 아래에 보면 메뉴들을 보여주는 탭바가 존재하지요? 그 탭바를 눌렀을 때 어떻게 동작을 하게될지 결정하는 녀석입니다.
클래스 : UITabBarController


이름 : Page View Controller
설명 : iPad에서만 동작하는 녀석입니다. 말그대로 페이지처럼 동작하는 뷰들을 관리합니다.
클래스 : UIPageViewController

이름 : Search Bar and Search Display Controller
설명 : 아이폰에서 검색할 때 쓰이는 검색바와 그 검색 결과창에 어떤 것을 검색해서 표현해 줄지 결정하고 명령하는 녀석입니다.
클래스 : UISearchDisplayController


이름 : GLKit View Controller
설명 : 지난 번에 설명드렸던 GLKView를 관리하는 녀석입니다. 3D 사용을 위한 Open GL ES를 사용하는 뷰에 대한 조종을 합니다.
클래스 : GLKViewController


 이렇게 해서 IB의 Library에서 볼 수 있는 객체들에 대해 알아보았는데요, 사실 객체의 종류는 수도 없이 많습니다. IB에서 볼 수 있는 객체들은 일부에 불과해요..^^
화면에 보이지 않는 객체들은 수도 없이 많습니다.
하지만 걱정하지 마세요~
저와 함께 차근차근 신나게 알아보도록 해요~
일단 지난번과 이번에 본 것들은 아~ 이런것들이 있구나 하는 정도로 알아두시고 (물론 다 기억하시면 시야가 넓어지는 좋은 일이 생기지요..^^) 이후에 진행되는 내용들에서 잘 기억이 나지 않거나 이해가 가지 않는 부분이 생기면 돌아와서 한 번쯤 돌아보시는 것도 좋을 것 같아요.

오늘은 iOS화면구성과 iOS 동작에 대한 내용 아주 초큼, 그리고 화면에 보이지 않는 객체들을 일부분 살펴보았습니다.

혹시나 올바르지 못한 내용을 발견한 고수분들은 의견주세요^^*

다음에는 무엇을 해볼까요?ㅎ
이 블로그의 주인은 여러분들입니다. 여러분들이 해보고 싶은 것들을 댓글로 말씀해 주시면 준비해 보도록 하겠습니다^*^

이론만 하기는 너무 힘드시죠?ㅎ
다음 번에는 한 번 실전에 들어가 보도록 할까 합니다~
고된 여행을 떠날 준비가 되셨나요?ㅎ

다음에 뵙도록 해요^~^
 


by yagom

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기 


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? ^~^ 사랑합니다~ ↓↓↓ 

Posted by yagom

댓글을 달아 주세요

  1. 말썽쩡 2011.12.12 19:46  댓글주소  수정/삭제  댓글쓰기

    감사해요 막막했는데 이렇게 설명을 잘해주시다니 ㅋㅋ 잘봤어요 ^^

  2. 옥탑방원순이S 2012.03.03 09:58  댓글주소  수정/삭제  댓글쓰기

    진짜 신나게 읽었습니다.
    다음번 실전도 너무 재밌을 것 같아요 ^_^
    정리해서 책으로 내셔도 될 것 같아요~~~
    잘 봤습니다 ^_^

  3. 블루아빠넹 2012.04.20 09:13  댓글주소  수정/삭제  댓글쓰기

    정말 잘 보고 있습니다.
    친절한 포스팅 너무 감사하구요.
    앞으로도 꾸준한 포스팅 부탁드려요~!!

  4. 봇짱 2012.06.17 19:51  댓글주소  수정/삭제  댓글쓰기

    쉬운 설명 감사합니다.
    정말 잘 보고 갑니다.

  5. 자몽주스 2012.06.25 13:40  댓글주소  수정/삭제  댓글쓰기

    이제야 아이콘들이 어떤기능들을 하는지 알것 같아요 정말감사합니다.

  6. SODA 2012.06.27 16:13  댓글주소  수정/삭제  댓글쓰기

    죄송한데 IB가 무엇을 말하는 건가요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.27 17:21 신고  댓글주소  수정/삭제

      google에서 Xcode IB라고 검색하시면 제가 답변해 드리는 것 보다 훨씬 속시원한 답을 얻으실 수 있을 것 같아요 ^^*

  7. 딴또 2013.03.06 08:43  댓글주소  수정/삭제  댓글쓰기

    좋은 강의 정말 감사합니다.

  8. ios 개발자 될놈.. 2013.05.08 19:04  댓글주소  수정/삭제  댓글쓰기

    야곰님 앞으로도 쭉,!!

  9. ryan 2014.06.17 09:38  댓글주소  수정/삭제  댓글쓰기

    아 글 너무 잘 읽고 있습니다. 안드로이드를 조금 만지다가 Swift 가 나왔다고해서 이참에 iOS도 배우고 있는 중인데요. 설명을 너무 잘 해주셨네요. Swift 에 관련된 강좌는 하실 계획이 없으신지요? :)

  10. 동기 2017.03.17 14:55  댓글주소  수정/삭제  댓글쓰기

    책을 안 사서 무작정 하고 있는데 이런 좋은 글들 때문에 서점이 망하지 않을까 우려가 되네요...ㅎㅎㅎ 감사합니다 잘 보고 있습니다!! 댓글을 웬만해선 귀찮아서 안 다는데 너무 감사해서 댓글 달고 갑니다 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2017.03.17 16:05 신고  댓글주소  수정/삭제

      안녕하세요 동기님!
      덧글 고맙습니다 :) 너무 예전 자료라 많이 도움이 될지는 잘 모르겠습니다^^; 종종 들러주세요~

  11. 김성욱 2017.03.28 10:36  댓글주소  수정/삭제  댓글쓰기

    잘 봐씁니다. 감사합니다.