오늘의 주제

Objective-C의 상수와 스위프트의 상수


안녕하세요 야곰입니다.

Objective-C를 쓰다가 스위프트로 넘어왔을 때 고민되었던 부분 중의 하나인 스위프트의 상수에 관해 이야기해 보려 합니다.


혼자 프로젝트를 진행하다 보면 상수의 필요성을 많이 느낄 수 없을지 모르지만, 누군가 협업을 하게 된다면, 혹은 미래 또는 과거의 나와 협업(?)을 하게 된다면 상수의 필요성을 많이 느끼게 됩니다. 바꾸면 안 되는 데이터를 실수로 바꿔서 난감했던 경험이 없나요? 혹시 그런 적이 있다면 상수의 필요성에 대해서는 많이 공감하실 것으로 생각됩니다.


* 오해가 생길 소지의 표현들이 있어서 처음 발행 이후 조금 수정하였습니다. 좋은 의견 주신 과니님 고맙습니다 :)


사라진 const


사실 저는 Objective-C에서 특별한 경우가 아니면 const를 많이 사용하지 않았습니다(반성).


그런데 스위프트에서는 전역이든 지역이든 데이터를 저장할 공간(변수 또는 상수)에는 var 또는 let을 사용하여 변수인지 상수인지 명확히 명시해 주어야 하므로 상수에 대한 고민을 많이 하게 되었습니다.


사실 지역상수가 필요한 경우에 const 키워드를 쓰는 귀찮음 때문에 상수를 많이 사용하지 않았는데 스위프트에서는 var 또는 let을 선택해야 하는 시간이 조금 걸렸지만, 지금은 큰 시간 들일 필요 없이 자연스럽게 상수를 많이 사용하고 있습니다. 또, 혹시라도 상수로 사용해야 하는 경우임에도 변수로 선언하고 사용한다면 Xcode에서 변수 대신 상수를 사용하는 게 어떻냐는 경고를 보여줍니다. 




[Xcode의 경고]


지역상수


지역상수를 사용하는 경우에는 사실 Objective-C와 크게 다를 바 없이 사용할 수 있습니다. 상수의 이름을 지어주는 명명법도 크게 다를 바 없습니다. 

상수로 사용할 변수 앞에 const를 붙여 쓴 것처럼 let을 사용하여 상수를 선언하여 사용하면 됩니다.



// Objective-C
const NSInteger someConstant = 100;


// Swift
let someConstant: Int = 100



전역상수


전역상수를 사용할 때 조금 더 생각해보아야 할 것들이 있습니다. 저는 처음 스위프트를 사용할 때 별생각 없이 Objective-C에서 사용하던 것과 같은 명명법으로 전역상수를 사용했습니다.


// Objective-C NSInteger const  YGSomeGlobalConstant = 100;


// Swift
let YGSomeGlobalConstant: Int = 100


그런데 Objective-C에서 'YG'와 같이 접두어(prefix)를 붙이는 것은 Objective-C에는 네임스페이스(name space)가 없기 때문인데, 스위프트에는 이 단점을 극복했다는 것에 대한 생각이 문득 스쳤습니다.


Objective-C에는 네임스페이스가 없어서 전역변수를 선언하고 사용할 때 꽤 골치가 아팠습니다. 귀찮기도 아주 귀찮았죠. 이름도 매우 길어지기만 했습니다. 열거형(enum)은 정수밖에 지원하지 않기 때문에 다른 타입의 값들은 관련된 상수끼리 묶어 쓰기도 어렵기도 했지요.


// Objective-C의 상수들... // 네임스페이스가 없기 때문에 // 연관된 상수들을 접두어를 사용하여 표현합니다 // 요일 상수들 NSString *const YGWeekMonday = @"MON"; NSString *const YGWeekTuesday = @"TUE"; NSString *const YGWeekWednesday = @"WED"; NSString *const YGWeekThursday = @"THU"; NSString *const YGWeekFriday = @"FRI"; NSString *const YGWeekSaturday = @"SAT"; NSString *const YGWeekSunday = @"SUN"; // 네트워킹 관련 상수들 NSTimeInterval const YGNetworkingTimeoutInterval = 10.0f; NSUInteger const YGNetworkingMaxRetryCount = 3; NSString *const YGNetworkingBaseURLString = @"https://abc.com";


정말 보기만 해도 정신이 없습니다. 또, 실수로 복사 붙여넣기를 하다가 중복된 값을 넣었다면 컴파일 오류가 발생하지 않기 때문에 실수를 찾아내기도 매우 어려워집니다.


스위프트에서는 이런 전역 상수들을 조금 더 멋진 방법으로 표현해 볼 수 있습니다. 타입 내부에 다른 타입을 정의하는 방법으로 네임스페이스를 사용할 수 있습니다. 더군다나 네임스페이스 덕분에 접두어는 더 이상 스위프트에서 사용하지 않습니다.


// Week라는 구조체 타입 내부에
// 여러 타입 상수를 선언
struct Week {
    static let mon: String = "MON"
    static let tue: String = "TUE"
    static let wed: String = "WED"
    static let thu: String = "THU"
    static let fri: String = "FRI"
    static let sat: String = "SAT"
    static let sun: String = "SUN"
}

// 실제 사용시 Week.mon // "MON" Week.sat // "SAT"


처음에 이렇게 선언해 보았습니다. 그런데 만약 복사 붙여넣기를 하다가 실수로 중복된 값을 넣는다면...? 가령 "SUN"을 넣어야 하는데 "SAT"를 넣어버렸다면? 이때는 중복 값이 들어있는지 확인할 수 없습니다. 물론 의도적으로 다른 이름의 상수에 같은 값을 넣을 수도 있지만 그렇지 않은 경우에는 낭패입니다.


그래서 이렇게 개선해 봅니다.


// 열거형의 연관 값(associated value)을 사용하여
// 상수처럼 사용
enum Week: String {
    case mon = "MON"
    case tue = "TUE"
    case wed = "WED"
    case thu = "THU"
    case fri = "FRI"
    case sat = "SAT"
    case sun = "SUN"
}

// 실제 사용시 Week.mon.rawValue // "MON" Week.sat.rawValue // "SAT"



이렇게 사용하면 열거형 내부의 연관 값이 중복되는 경우에 컴파일오류가 발생하게 됩니다. 그래서 미리 실수를 발견하기도 좋습니다.


또, 위의 Objective-C로 선언했던 네트워킹 관련 상수를 스위프트에서 선언한다면 이렇게 바꿔볼 수 있을 것 같습니다.


// Objective-C NSTimeInterval const YGNetworkingTimeoutInterval = 10.0f; NSUInteger const YGNetworkingMaxRetryCount = 3; NSString *const YGNetworkingBaseURLString = @"https://abc.com";
// 사용 YGNetworkingTimeoutInterval // 10.0


// Swift
struct Networking {
    static let timeoutInterval: TimeInterval = 10.0
    static let maxRetryCount: Int = 3
    static let baseURL: URL? = URL(string: "https://abc.com")
}

// 사용

Networking.timeoutInterval // 10.0


이처럼 꼭 열거형의 연관 값을 사용하지 않고 용도에 맞게 구조체의 타입 상수(static let)로 사용해도 좋습니다. 


상수뿐만 아니라 전역변수, 전역함수(메서드) 등에도 충분히 응용할 수 있습니다.


또한 구조체 내부에 다른 타입(구조체, 클래스, 열거형) 등등 몇 단계를 걸쳐 내부 타입을 정의할 수 있기 때문 연관된 값을 타입의 타입의 타입까지 여러 번에 걸쳐 정의도 가능합니다.



struct CalendarItem {
    typealias Year = Int
    typealias Day = Int
    
    enum Week: String {
        case mon = "MON", tue = "TUE" //...
    }
    
    enum Month: Int {
        case jan = 1, feb, mar //...
    }
    
    static let startYear: Int = 1970
    static let startMonth: CalendarItem.Month = .jan
    
    struct Date {
        var day: Day = 1
        var weekDay: CalendarItem.Week = .mon
        var month: CalendarItem.Month = .jan
        var year: Year = CalendarItem.startYear
    }
}

var userBirthday: CalendarItem.Date userBirthday = CalendarItem.Date.init(day: 10, weekDay: .tue, month: .mar, year: 2017)



마치며


같은 Cocoa 플랫폼 위에서 코드를 작성하는데도 불구하고 역시나 언어의 특성을 살려 새로이 구조를 설계하기는 쉽지 않습니다 하핳


무언가 두서없이 써내려간 느낌입니다만, 잘 이해가 가지 않거나 궁금한 점이 있다면 댓글 남겨주세요 :D





by yagom

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

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


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

RSS Feed 받기   


Posted by yagom

댓글을 달아 주세요


오늘의 Tip

1. CocoaPods이란?

2. CocoaPods 설치

3. Pod 설치

4. Pod 찾아보기


안녕하세요 야곰입니다.

오늘은 코코아팟에 대한 이야기를 해보려고 합니다.


# CocoaPods이란?


iOS 및 macOS, tvOS 등 애플 플랫폼에서 개발을 할 때, 외부 라이브러리를 관리하기 쉽도록 도와주는 의존성 관리 도구들이 있습니다. CocoaPods는 애플 플랫폼을 위한 의존성 관리도구의 일종입니다. 애플 플랫폼에서 사용할 수 있는 의존성 관리 도구의 대표적인 예로는 [CocoaPods], [Carthage], [Swift Package Manager] 등이 있습니다.


더 자세한 설명은 이미 써두신 분들이 많아 링크를 드립니다.


CocoaPods에 대해 설명하고 있는 문서 링크


# CocoaPods 설치 및 Pod 설치


가장 빠른 것은 아래 영상을 보고 따라하는거예요.






영상을 보기 싫은 분들을 위해 텍스트 설명


# CocoaPods 설치


쉽습니다. 별로 할 게 없어요. 맥을 사용하고 있다면 터미널을 열어서 명령어 한 줄만 입력하면 됩니다.

아무 반응이 없더라도 기다리세요. 설치가 되고 있습니다. 처음에 꽤 오래 걸립니다. 그러니 차분히 기다리세요.


sudo gem install cocoapods


# Pod 설치


CocoaPods를 통해 가져올 수 있는 라이브러리를 Pod이라고 할 수 있습니다. 


먼저 현재 내가 진행하고 있는 프로젝트 폴더에 Podfile 이라는 이름의 파일을 생성합니다. 이 Podfile을 통해 CocoaPods이 라이브러리 의존성을 파악하게 됩니다.


원하는 라이브러리는 cocoapods.org에서 검색해 보는 것이 가장 쉽고 빠릅니다. 검색하여 찾은 라이브러리의 pod spec을 복사하여 Podfile에 붙여넣어줍니다.


파일을 저장한 후 터미널에서 (프로젝트 경로에서)아래 명령어를 입력해줍니다.


pod install


그러면 기존 프로젝트 파일 외에 워크스페이스 파일이 별도로 생성되는데, 이제 그 워크스페이스 파일로 작업을 진행하면 됩니다.



# Pod 설치


그러면 도대체 쓸만한 Pod은 어디서 찾을까요?


일단 CocoaPods를 통해 제공되는 라이브러리는 모두 cocoapods.org에서 찾아볼 수 있는데요, 

UI를 미리 보고 싶다면 cocoacontrols.com도 추천합니다.

각종 UI/UX 라이브러리들이 모여있고, 미리보기, 라이센스 확인도 모두 가능합니다.




Download Source를 선택해 들어가면 대부분 github 페이지로 이동합니다.

github 페이지의 README 파일에 보면 대부분 cocoapods을 통해 설치할 수 있는 pod 정보도 설명이 되어있습니다.




그런데 더 놀라운 곳이 있습니다! 양이 너무 많아 무얼 써보아야 할지 모르지만~ 

[Awesome iOS]에 많은 라이브러리 목록이 있습니다. 

UI만 또 모아놓은 곳도 있구요~ [Awesome iOS UI]


이제 손쉽게 라이브러리를 검색하고 의존성 관리도 손쉽게 해보세요!








by yagom

facebook : https://facebook.com/yagomsoft

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


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

RSS Feed 받기   


Posted by yagom

댓글을 달아 주세요

  1. jinhongstar 2018.02.23 11:27  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야공(야곰)님!!

    swift 책 도 잘봤고,

    덕분에 도움이 잘 됬습니다.

    가끔 이렇게 꿀팁영상 보면서 도움을 많이 받고 있습니다.

    감사합니다 ^^

  2. 분당조승우 2018.12.17 19:24  댓글주소  수정/삭제  댓글쓰기

    야곰님 좋은 팁 나눠주셔서 정말 감사해요~

오늘의 주제

1. 스위프트란 어떤 언어인가?


안녕하세요, 야곰입니다. 


스위프트에 대해 몇 번의 포스팅을 통해 전해드릴 예정입니다. 우왕 짝짝짝!


우리가 알아볼 스위프트는 미국의 유명가수 테일러 스위프트가 아니라 스위프트 검색하면 각종 스위프트 정보가… 가수, 자동차, 작가, 자전거 등등… 꽤 최근에 만들어진 프로그래밍 언어를 이야기 합니다. 



[스위프트 로고]


사전에서 Swift라는 단어를 검색해보면 신속한, 빠른, 칼새 등등의 의미가 나옵니다. 위에 보이는 스위프트 로고 또한 칼새의 형상이죠? 애플에서 스위프트라는 이름의 의미를 직접적으로 발표하지는 않았지만 이 포스팅을 읽고나면 왜 스위프트라는 이름을 썼을지 생각해 볼 수도 있을 것 같습니다. 스위프트라는 언어는 어떤 언어인지, 스위프트에 왜 스위프트라는 이름이 붙게 되었는지 한 번 살펴볼게요 :)


스위프트의 역사

사람의 언어가 시대에 따라 필요한 것들이 바뀌는 것처럼 프로그래밍 언어도 시대의 요구에 맞게 점점 발전합니다. 새로운 언어가 탄생하기도 하고, 기존의 언어에 새로운 기능이 추가되면서 버전 업데이트를 하기도 하죠. 스위프트는 이제 막 발돋움을 시작한 언어이지만, 짧은 시간 안에 많은 변화들을 겪어 왔습니다.


처음의 스위프트는 2010년 크리스 래트너(Chris Lattner)<애플의 핵심 프로그래머 중 한 명이었으나 이제는 애플을 떠나 자동차 회사인 테슬라로 옮긴다고 발표가 났습니다>를 필두로 한 애플의 프로그래머들이 개발을 시작했습니다. 


Objective-C, Ruby, Python, C#, Rust, Haskell, CLU 등 기존의 언어와 신생언어의 많은 부분을 참고하여 만들었습니다. 그리고 2014년 9월 정식 발표된 이후 스위프트는 현재도 계속 발전 중에 있습니다. 또한, 현재는 모든 사항들이 오픈소스로 공개되면서 세계의 수많은 프로그래머들이 협력하여 언어를 발전시키고 있습니다. 스위프트의 굵직굵직한 변경사항은 친절한 예제와 함께 스위프트 공식 블로그(https://swift.org/blog/)에서 확인할 수 있습니다.


지금까지 스위프트가 어떻게 발전되어 왔는지 간략히 살펴볼까요?



버전 1.0

애플은 2014년 6월 처음으로 스위프트의 존재를 발표하고 베타버전을 배포했습니다. 그리고 1.0 버전을 2014년 9월 Xcode 6와 함께 공식 배포합니다. 기존의 프로그래밍 언어의 기능을 대부분 갖추었으며, 안전한 코딩을 위한 안전장치 등 새로운 기능 덕에 많은 프로그래머의 관심을 받았습니다.

버전 1.1

애플은 한 달 만인 2014년 10월 1.1 버전을 발표합니다.

버전 1.2

이듬해 봄인 2015년 4월에 스위프트 1.2 버전을 발표했는데 이 시기는 스위프트 문법의 1차 대 혼돈기입니다. 1.0과 1.1에 비해 문법 변화가 많았습니다.

버전 2.0

애플은 2015년 9월 WWDC에서 스위프트 2.0 버전을 발표했습니다. 2차 대 혼돈기였던 이 시기는 1.X 버전 대와 차이가 컸으나 이후로는 버전별 변화가 적어 1차 안정기라 볼 수 있습니다.

버전 2.1

2015년 10월 발표된 스위프트 2.1 버전은 2.0 버전과 비교했을 때 약간의 편의사항 추가와 버그수정 및 안정화 등에 초점을 둔 마이너 업데이트였습니다

오픈소스 전환

애플은 2015년 12월 스위프트를 오픈소스로 전환하여 공개했습니다. 이제 다른 플랫폼에서도 자유롭게 스위프트를 사용할 수 있습니다. 자세한 내용은 스위프트 오픈소스 공식 사이트(https://swift.org)에서 확인해 볼 수 있습니다. 또, 스위프트 발전에 기여하고 싶다면 Swift Programming Language Evolution 페이지(https://github.com/apple/swift-evolution)에 수정제안을 할 수도 있습니다. 

버전 2.2

2016년 3월 스위프트 2.2 버전을 발표했습니다. 향후 3.0 업데이트가 있을 예정이라 변화가 크지는 않았습니다.

버전 3.0

2016년 9월 스위프트 3.0 버전을 발표했습니다.



현재(2017년 1월) 우리가 사용하는 스위프트의 버전은 3.0.1 버전이지만, 올 해 중으로 4.0 버전을 발표한다는 소식이 전해지기도 합니다. 버전이 업데이트 될 때 마다 새로운 문법이 생겨나기도 하고, 삭제되기도 했습니다. 그래서 이제껏 새로운 버전에 대해 자주 확인해 보아야 하는 수고로움이 있었지만 반대로 생각해 본다면 그만큼 빠른시간 안에 강력한 모습으로 변모하고 있다고 생각할 수도 있습니다. 새로 개발된 언어가 프로그래머들에게 쓰이고 사랑받으려면 많은 시간이 필요함에도 불구하고 스위프트는 오픈소스로 전환하여 많은 프로그래머들의 요구를 수용함으로써 빠른 시간안에 프로그래머들이 원하는 언어로 바뀌어 가고 있으며 더욱 많은 사랑은 받고 있다는 것도 눈여겨 볼 점입니다.



스위프트의 특징

애플이 최초에 스위프트를 발표했을 때 스위프트 언어의 특성을 Safe, Modern, Powerful 이라고 발표했습니다. 그러나 오픈소스로 전환되면서 특징을 Safe, Fast, Expressive로 변경하여 발표했습니다. 더불어 애플은 ‘스위프트는 보다 직관적이고 배우기 쉬운 언어’라고 스위프트를 소개했습니다. 먼저 애플이 발표한 스위프트의 언어적 특성을 항목별로 정리해 보았습니다.

안전성(Safe) 

스위프트는 안전한 프로그래밍을 지향합니다. 소프트웨어가 배포되기 전에, 즉 프로그래밍을 하는 중에 프로그래머가 저지를 수 있는 실수를 엄격한 문법을 통하여 미연에 방지하고자 노력했습니다. 때론 너무 강제적이라고 느껴질 수 있지만 문법적 제재는 실수를 줄이는 데 도움이 됩니다. 버그를 수정하거나 실수를 찾아내는 시간을 절약할 수 있습니다. 옵셔널이라는 기능을 비롯하여 guard 구문, 오류처리, 강력한 타입통제 등을 통해 스위프트는 안전한 프로그래밍을 구현하고 있습니다.

신속성(Fast) 

스위프트는 C 언어를 기반으로 한 C, C++, Objective-C와 같은 프로그래밍 언어를 대체하려는 목적으로 만들어졌습니다. 아직은 부분적으로 미흡하지만 성능 또한 C 언어 수준을 목표로 개발되었습니다. 그래서 스위프트는 성능을 예측할 수 있고 일정한 수준으로 유지할 수 있는 부분에 초점을 맞춰 개발되었습니다. 실행속도의 최적화 뿐만 아니라 컴파일러의 지속된 개량을 통해 더 빠른 컴파일 성능을 구현해 나가고 있습니다.

더 나은 표현성(Expressive) 

지난 수십 년 간 컴퓨터 과학 분야는 발전해왔습니다. 이와 함께 성장한 수많은 프로그래밍 언어는 제 각각의 문법 별로 다양한 장단점이 있었습니다. 스위프트는 이를 참고해 더 사용하기 편하고 보기 좋은 문법을 구사하려 노력했습니다. 개발자들이 원하던 현대적이고 세련된 문법을 구현할 수 있었죠. 그러나 지금의 스위프트가 끝이 아닙니다. 계속된 업데이트를 통해 더욱 보기좋고 쓰기좋은 언어로 발전해 나갈 것입니다.


스위프트는 여러 가지 프로그래밍 패러다임을 채용한 다중 패러다임 프로그래밍 언어입니다. 크게 보면 스위프트는 명령형 프로그래밍 패러다임, 객체지향 프로그래밍 패러다임, 함수형 프로그래밍 패러다임, 프로토콜 지향 프로그래밍 패러다임을 지향합니다. 정확하게는 명령형과 객체지향 프로그래밍 패러다임을 기반으로 한 함수형 프로그래밍 패러다임과 프로토콜 지향 프로그래밍 패러다임을 지향합니다. 결과적으로 스위프트에서 가장 강조하는 부분은 함수형 프로그래밍 패러다임과 프로토콜 지향 프로그래밍 패러다임입니다. 기존의 C 언어는 명령형 혹은 절자적 프로그래밍 패러다임을 채용했으며, C++, Java 등의 언어는 명령형 프로그래밍 패러다임과 객체지향 프로그래밍 패러다임을 동시에 채용한 다중 프로그래밍 패러다임 언어입니다. 스위프트는 여기에 함수형 프로그래밍 패러다임과 프로토콜 지향 프로그래밍 패러다임을 더한 언어라고 생각하면 됩니다.



스위프트로 무엇을 할 수 있을까?

많은 분들이 iOS/macOS 애플리케이션을 제작하기 위해 마련된 Cocoa Touch/Cocoa 프레임워크와 스위프트 언어를 동일시 하기도 합니다. 그렇지만 스위프트와 iOS 및 macOS 프로그래밍은 엄연히 다릅니다. 스위프트를 안다 하여 무작정 iOS 프로그래밍을 할 수 있지는 않습니다. 스위프트가 iOS와 macOS용 앱 등 애플 서비스의 앱 개발에 사용할 수 있는 언어로 추가된 것 뿐입니다. 이는 자바 프로그래머가가 모두 안드로이드 앱을 만드는 건 아니라는 점과 같습니다.

현재의 스위프트로는 무엇을 할 수 있을까요?


[애플의 개발자 컨퍼런스인 WWDC 2016 중 장면 발췌]



iOS/macOS/tvOS/watchOS 등 애플 플랫폼에서 동작하는 애플리케이션 제작

스위프트 제작의 최초목적이 애플의 플랫폼을 위한 애플리케이션 제작을 위한 것이었기 때문에 당연히 애플 플랫폼을 위한 애플리케이션 제작에 사용할 수 있습니다.


웹서버용 애플리케이션 제작


[IBM사의 웹서버 프레임워크 Kitura의 로고]


스위프트 언어를 사용하는 웹서버 애플리케이션 제작용 프레임워크가 생겨나는 추세입니다. 대표적으로는 IBM의 Kitura(http://www.kitura.io/)와 퍼펙트리소프트의 Perfect(http://perfect.org/)라는 프레임워크가 있습니다. 앞으로 스위프트를 위한 다양한 프레임워크가 생겨날 것으로 예상됩니다.

리눅스, 맥 등에서 사용할 프로그램 제작

스위프트를 공식적으로 컴파일 할 수 있는 환경은 현재 애플 플랫폼과 리눅스(Ubuntu) 환경 뿐입니다. 그렇기 때문에 우리가 사용하는 PC 환경 중에서는 맥이나 리눅스 등에서 간단히 사용할 프로그램을 제작해 볼 수 있습니다.



스위프트는 오픈소스이기 때문에 미래에 다른 플랫폼에서 스위프트를 위한 컴파일러를 제공하게 된다면 다른 곳에서도 스위프트를 사용할 수 있게 됩니다. MS에서 윈도우 애플리케이션을 제작하기 위해 스위프트를 사용할 수 있도록 제공하거나 구글에서 크롬북 등에서 동작할 애플리케이션 제작을 위해 스위프트를 사용할 수 있도록 제공해 준다면 스위프트로 더 다양한 플랫폼의 애플리케이션 제작도 충분히 가능하게 된다는 뜻입니다.




스위프트 사용 환경

스위프트는 오픈소스로 전환된 이후 매킨토시 컴퓨터 및 macOS 외의 다른 환경, 즉 리눅스 및 윈도우 등에서도 사용할 수 있습니다. 그렇지만 아직까지는 스위프트의 문법을 익히고 연습하기에는 애플에서 공식 지원하는 Xcode의 플레이그라운드와 REPL(Read-eval-print-loop)이 가장 편리합니다. 그 외에 웹에서 손쉽게 스위프트 문법을 익히고 실행할 수 있게 서비스를 제공하는 곳도 있습니다.


Xcode(플레이그라운드)


[Xcode 아이콘]


Xcode는 macOS에서 동작하는 애플의 통합개발환경입니다. Xcode는 맥 앱스토어에서 무료로 내려받아 설치할 수 있습니다. Xcode로는 맥용 애플리케이션 제작부터 iOS, watchOS, tvOS 등의 애플리케이션 제작, 프레임워크 및 라이브러리 제작 등등 다양한 프로그래밍을 할 수 있습니다. Xcode의 기능 중 하나가 플레이그라운드입니다.



[플레이그라운드 아이콘]

플레이그라운드(Playground)는 별도의 프로젝트 생성 없이 스위프트 코드를 실행할 수 있는 스위프트 코딩 환경입니다. 기본 문법 연습에서부터 복잡한 코드 테스트까지 다양한 기능을 수행할 수 있습니다. 스위프트를 맛보고 문법 연습을 하기에 더할 나위 없이 좋은 도구입니다. 


REPL

[REPL 사용화면]


스위프트는 인터프리터 언어에서 주로 사용되는 REPL(Read-eval-print-loop)으로도 코드를 실행할 수 있습니다. 물론 스위프트는 인터프리터 언어가 아닌 컴파일 언어지만 기존의 인터프리터 언어의 REPL과 거의 비슷하게 사용할 수 있습니다. REPL은 간단한 코드를 직접 입력하여 바로바로 결과를 볼수있는 환경과 편의를 제공해주는 툴입니다. 
맥에서 스위프트의 REPL을 사용하려면 Xcode가 설치된 macOS의 터미널Terminal 애플리케이션을 실행하면 됩니다. 더 정확히 말하자면 Command line tools for Xcode가 설치되어 있어야 합니다(Xcode가 설치되지 않았을 때는 따로 설치해주어야 합니다. Xcode를 설치하면 자동으로 설치되는 도구입니다). /Application/Utilities 폴더에 위치한 터미널 애플리케이션을 실행하고 swift 라고 명령어를 입력하면 Swift REPL이 실행됩니다. 

    


[IBM Swift Sandbox]


스위프트 코드를 macOS 환경이 아닌 다른 환경에서도 쉽게 테스트할 수 있도록 몇몇 웹사이트에서 플레이그라운드 또는 REPL과 유사한 환경을 제공합니다. 스위프트 코드 작성 및 실행도 할 수 있고, 자신이 작성한 코드를 다른 사람들과 공유를 할 수도 있어서 매우 유용합니다. 대표적으로 IBM이 웹에서 스위프트를 작성하고 실행할 수 있는 페이지를 제공합니다. (https://swiftlang.ng.bluemix.net)


모바일 환경


[iPad용 Swift Playgrounds]


App Store에서 Swift Playgrounds를 검색해보면 아이패드에서 스위프트 코드를 작성하고 테스트해 볼 수 있는 애플리케이션(https://itunes.apple.com/app/swift-playgrounds/id908519492?mt=8)을 찾을 수 있습니다. 직접 자신만의 코드를 작성할 수도 있으며, 게임을 활용한 튜토리얼을 따라 문제를 해결해 나가며 스위프트를 익힐수도 있습니다. 또, 플레이그라운드를 활용하여 바로 결과들을 확인할 수 있는 여러가지 템플릿들도 제공이 되고 있으므로 재미있게 스위프트를 배워볼 수 있습니다.


리눅스

[우분투 로고]


스위프트 코드를 리눅스에서 작성하고 컴파일 할 수 있습니다. 스위프트 다운로드 페이지(https://swift.org/download/#linux)에서 리눅스용 스위프트 패키지에 관한 안내를 찾아볼 수 있습니다. 해당 패키지에는 스위프트 컴파일러를 비롯하여 관련 툴이 포함되어 있습니다.


마치며

애플이 스위프트는 배우기 쉬운 언어라고 발표하였지만 다른 프로그래밍 언어를 알고있는 분들 중 스위프트를 처음 접하는 분들은 조금 어려움을 느낄수도 있습니다. 기존 언어의 프레임에 갖힌 개념들 때문입니다.

사람의 언어가 시대에 따라 필요한 것들이 바뀌는 것처럼 프로그래밍 언어도 시대의 요구에 맞게 점점 발전합니다. 프로그래밍 언어의 기본은 그 뿌리가 비슷하기 때문에 문법의 모양새는 크게 다르지 않아보이지만 세부적인 기능과 개념들은 매우 다를 수 있습니다. 또, 각각의 언어가 지향하는 목표점들도 조금씩 상이합니다. 그래서 새로운 언어를 배울 때에는 기존의 언어에서 배웠던 개념에 자꾸 끼워 맞추려는 노력보다는 처음 배워간다는 마음가짐으로 그 언어의 특성들을 있는 그대로 받아들이는 자세도 중요할 것 같습니다.

크레이그 페더리기(Craig Federighi) 애플 소프트웨어 엔지니어링부 시니어 부사장이 2015년에 The Next Web에서  인터뷰 중 “개발자들이 사용하는 주 언어가 스위프트가 됐으면 좋겠다”, “스위프트를 처음 개발할 때 모바일 앱부터 클라우드까지 어디서든 쓰일 수 있는 언어가 될 수 있도록 신경썼다”라고 말했습니다. 그리고 결과적으로 “스위프트는 향후 20년간 쓰일 주류 언어가 될 것”이라고 말하기도 했습니다. 

이번에 스위프트라는 언어에 대해 간단히 알아본 여러분은 어떻게 생각하시나요? 저는 개인적으로 스위프트에 대해 알아가면 알아갈수록 정말 매력적인 언어라는 생각을 하게 됩니다. 크레이그 부사장의 말이 현실화 될 것 같기도 해요 :) 

다음 포스팅에서는 스위프트의 기초 문법에 대해 알아보겠습니다. 추운 날씨 감기 조심하시고 다음 번에 또 뵈어요~


* 본 글의 일부내용은 필자의 저서 [스위프트 프로그래밍](2017, 한빛미디어)(http://book.naver.com/bookdb/book_detail.nhn?bid=11445773)에서 요약, 발췌하였음을 알립니다.





by yagom

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

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

twitter : http://www.twitter.com/yagomSoft ( @yagomsoft )

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

RSS Feed 받기   


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

스위프트 시작하기  (0) 2017.05.08
Swift - 프로토콜, 익스텐션  (0) 2017.03.07
Swift - 구조체 클래스  (0) 2017.02.28
Swift - 함수, 콜렉션 타입  (0) 2017.02.06
Swift 기초문법 - 변수, 상수, 기초 데이터 타입  (0) 2017.01.25
Swift란 어떤 언어인가?  (0) 2017.01.23
Posted by yagom

댓글을 달아 주세요



Objective-C의 기능 추가

1. Nullability annotations 
2. Generics 



안녕하세요 야곰입니다 :)

Swift 2.0이 오픈소스화 되면서 관심이 많이 쏠리고 있습니다.


그러나 기존 Objective-C 프로그래머들 사이에서는 Swift에 따라 변화되는 다양한 모습들이 부담으로 다가오기도 합니다. Swift 언어 문법과 기능들에 더 잘 맞춰주기 위하여 기존의 API들이 변경되기도 하고, Objective-C의 문법적 기능들과 키워드들이 몇몇가지 추가되기도 했습니다. 그에대해 간략히 살펴보는 시간을 가져보도록 할게요.


# 해당내용은 2015년 6월 말에 작성된 내용으로, 애플에 의해 추후 변동의 여지가 충분히 있음을 미리 알립니다.


# Nullability

Swift는 지난 포스팅에 말씀드렸듯 자료형에 굉장히 민감합니다. 더불어 nil에 대해서 Objective-C와 완전히 다른 대응체계를 가졌죠. Swift 에서는 nil이란 녀석에도 굉장히 민감합니다. 그래서 그런 Swift의 특성에 맞도록 Objective-C의 기능이 추가되었습니다. 바로 nullability라는 기능인데요, 한 번 살펴보죠. Nullability 기능은 Xcode 6.3 / Swift 1.2 버전부터 정식 지원합니다.


weakstrong, __weak__strong 이라는 키워드 기억하시나요? ARC 때문에 생겨난 새로운 키워드였죠. 이와 쓰이는 위치가 비슷합니다. (예를 든 것일뿐 weak와 strong 키워드와는 전혀 상관이 없습니다)


Nullability 기능으로 새로 생겨난 키워드는 nullable, nonnull, null_unspecifiednull_resettable 등입니다.


- nullable : 해당 항목이 null일 수 있다. 즉, Swift의 옵셔널 [?] 항목입니다.

- nonnull: 해당 항목이 null일 수 없다. 즉, Swift의 논옵셔널 항목입니다.

- null_unspecified : 해당 항목의 null 여부가 지정되어있지 않다. 즉, Swift의 암시적 추출 옵셔널 형식 [!] 항목입니다.

- null_resettable : 해당 프로퍼티가 기본값을 가지고 있어 nil일 수 없을 경우에 사용합니다.

                               즉, nil을 할당하면 즉기 기본값으로 초기화되는 프로퍼티에 사용할 수 있습니다. 

                               Swift에서는 암시적 추출 옵셔널 형식 [!] 으로 표현됩니다.


* nullability 키워드를 별도로 지정하지 않는 경우 null_unspecified가 기본입니다.

** nullable, nonnull, null_unspecified는 Objective-C 프로퍼티와 메소드, C와 블럭 포인터 등 

     전반적으로 모두 사용가능하지만, null_resettable은 Objective-C 프로퍼티에만 사용 가능합니다.


일단 메소드에 쓰이는 예를 살펴보죠. UIViewController의 한 메소드입니다. Swift 코드와 Objective-C 코드를 살펴보면 기존의 API와 다르게 nullability 관련 키워드가 Swift의 옵셔널 형식에 맞게 반환자료형 또는 전달자료형 뒤에 삽입되어 있음을 확인할 수 있습니다.


[ nonnullnullable의 API 적용 예 ]

[ null_unspecifed의 프로퍼티 적용 예 ]


위에서 nullability 관련 키워드를 설정해 주지 않는 경우 기본적으로 null_unspecified가 기본값으로 적용된다고 말씀드렸는데, 기본값을 변경할 수 있는 메크로가 존재합니다. NS_ASSUME_NONNULL_BEGIN과 NS_ASSUME_NONNULL_END. 이렇게 한 쌍으로 존재합니다. 저 한 쌍의 매크로 안쪽에 해당하는 항목들은 기본적으로 nonnull 옵션이 적용됩니다.

스크린샷을 보시면 실제로 Swift에서 어떻게 적용이 되는지도 확인하실 수 있을겁니다.



[ Objective-C 코드에서 NS_ASSUME_NONNULL_BEGIN과 NS_ASSUME_NONNULL_END의 적용 예 ]



[ 위의 Objective-C 코드로 작성된 내용을 Swift 코드에서 확인 ]



null_resttable에 관련된 프로퍼티를 찾아보았으나 찾지 못했습니다. 애플이 제공한 null_resettable에 관한 문서설명에는 아래 스크린샷과 같이 나와있지만 실제 tintColor는 null_resttable이 아니었습니다 :) 참고로 알아두시면 될 것 같습니다.



null_resttable에 대한 설명 ]




# Generics


Objective-C에서 제네릭이 추가되었다고하여 찾아보았는데, 아마도 Swift의 콜렉션 타입(배열, 딕셔너리, 세트)를 위해 반영이 된 것 같습니다. Objective-C 에서는 배열(NSArray), 딕셔너리(NSDictionary), 세트(NSSet)에 자료형에 상관없이 한 콜렉션에 여러가지 객체형태를 넣어줄 수 있었죠. 즉, myArray라는 NSArray에 문자열도, 숫자도, 뷰 객체도 한 번에 들어갈 수 있었다는 이야기입니다. 그러나 Swift에서는 하나의 콜렉션에는 하나의 자료형밖에 담지 못합니다. Array도, Dictionary도, Set도 전부 담게되는 자료형을 명시해 주고, 그 자료형과 맞지 않으면 넣을 수 없었습니다. 이런 차이를 극복하기 위해 Objective-C에 기능을 추가했군요. 저는 Objective-C의 콜렉션이 자료형과 상관없이 넣을 수 있어서 참 강력하다고 생각했는데, 개인적으로는 아쉽습니다. Objective-C의 generics은 Xcode 7 / Swift 2.0 부터 지원합니다.


스크린샷을 보시면 어떻게 상호 호환되는지 확인해 보실 수 있습니다. __kindof 키워드는 그 클래스와 하위 클래스까지 호환됨을 의미합니다. 실질적으로 Swift의 코드에 미치는 영향은 없습니다.


[ Objective-C 코드에서 Generics의 적용 예 ]


[ 위의 Objective-C 코드로 작성된 내용을 Swift 코드에서 확인 ]



애플이 단지 Swift를 밀어주기 위해 Objective-C를 변경 하는 것인지, 아니면 두 언어의 상생을 위하여 Objective-C를 조금 희생시키는 것인지는 두고봐야 할 것 같습니다.
 

# 오늘은 6.25 한국전쟁 발발일입니다. 오늘만이라도 뼈아픈 민족상잔의 비극을 잊지않고 되돌아 보는 시간이 되면 좋겠습니다.

[역사를 잊은 민족에게 미래는 없습니다]

by yagom

facebook : http://fb.yagom.net

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

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

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

RSS Feed 받기   



Posted by yagom

댓글을 달아 주세요

  1. Favicon of https://maccrazy.tistory.com BlogIcon maccrazy 2015.06.29 20:36 신고  댓글주소  수정/삭제  댓글쓰기

    전 Swift를 위해서 Objective-C의 문법을 망치고 있다고 밖에 보이지 않네요. 참 안타까운 일이 아닐 수 없습니다. :(
    Objective-C에 기능 추가는 바라지 않지만 그냥 가만히 두기라도 하면 좋겠다는 생각이 드네요.


오늘의 주제

1. UIGestureRecognizer 사용해 보기


쉰 두번째 시간입니다.^^

정말 오래간만의 포스팅입니다 :)

오늘은 '새벽다섯시반'님의 요청으로 포스팅을 진행해 보도록 하겠습니다.

길게 눌렀을 때 특정 동작을 할 수 있도록 구현해보고 싶다고 말씀하셨습니다.

그녀석은 바로 Gesture Rcognizer!!

그럼 알아볼까요?

스따뚜~~~~~~~~~~~~



# Gesture Recognizer란?

말 그대로 유저의 제스쳐를 인식하는 녀석입니다.

양쪽위아래로 밀기(swipe), 꾹 누르기(long press), 탭하기(tap, 여러번도 포함) 등등 많은 제스쳐를 인식할 수 있지요.

자, 그럼 그녀석을 어떻게 사용하느냐?

따라오세요~


일단 프로젝트를 만들어야겠죠?ㅎ
 


네, 만듭니다. 옵션 체크된거 확인해 주시구요~


스토리보드로 와서 View 위에 ImageView를 하나 얹어주시구요. 사진은 넣고싶은거 넣으세요 ㅎㅎ

그리고 Object Library에서 Long Press Gesture Recognizer를 끌어다가 이미지뷰 위에서 올려놓습니다.

참, 이미지뷰의 속성에서 User Interactive Enable에 꼭 체크해 주시구요 :)



좌측에 생성된 Long Press Gesture Recognizer를 우클릭 또는 control + 클릭하여 Image View와 연결되어있는지 확인합니다.

 


그리고 우클릭 또는 control + 클릭으로 View Controller로 쭈욱 드래그 하신 후에 까만 창이 뜨면 delegate로 설정해 줍니다.

자, 스토리보드에서 준비는 끝났습니다.
 


이제 헤더로 와서 UIGestureRecognizerDelegate 프로토콜을 따르겠다고 이야기 해줍니다.


그리고 그녀석을 어떻게 써야할지 알아보기 위하여 도큐먼트를 한 번 훑어봐야겠죠?

UIGestureRecognizerDelegate위로 option(alt)키를 누른 상태로 커서를 올려봅니다.

그럼 위처럼 말풍선이 뜰텐데요, Reference를 클릭합니다.
 


자, 여기서 보면 델리게이트가 하는 일이 나와있네요.

우리에게 필요한 것은 꾸욱 눌렀을 때 어떻게 해줘야 할지를 정해주는 것이기 때문에 - gestureRecognizerShouldBegin: 을 클릭해서 자세한 내용을 봅시다.


요로코롬 어떤 녀석인지 상세하게 설명이 되어있네요 :)

한 번 쭈욱 읽어보시구요, 델리게이트 메소드 구현을 위해서 저녀석을 쭉 긁어서 복사해옵니다.

어디로? 구현파일로요 ㅋㅋ


참, 우리는 액션시트도 쓰려고 하니까 일단 우선 헤더파일에 액션시트 델리게이트를 하겠다고 이야기 해주구요,


아까 복사해둔 메소드를 이용해서 이렇게 구현해줍니다. 

그리고 실행!!!



 

짜잔~ 
잘 되시나요?
참 쉬죠잉~?

ㅋㅋ 여기에서는 Long Press Gesture Recognizer만 실습해 보았는데요,

다른 Gesture Recognizer들도 사용법은 비슷비슷 합니다.

다른 녀석으로 한 번 구현해 보세요.

참, 종류가 달라도 다들 UIGestureRecognizerDelegate 프로토콜을 따르게 됩니다.

즉, 위에서 본 델리게이트 메소드들을 적절히 잘 활용하면 여러 제스쳐를 한 번에 받고 처리할 수 있다는 이야기가 되겠지요?ㅎ

한 번 무슨말인지 고민해 보세요 :)

오랜만의 포스팅이었습니다.

많이 부족하고 허접한 블로그인데 이렇게 찾아주셔서 정말 고맙습니다 ^^

또 새로운 주제가 생기면 포스팅 하겠습니다.

그럼 다음에 뵈어요 :)

by yagom

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

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 이전 댓글 더보기
  2. east0822 2013.06.10 17:29  댓글주소  수정/삭제  댓글쓰기

    돌아 오셨네요!! 앞으로도 좋은 포스팅 기대하겠습니다.

  3. 모르세 2013.06.15 11:30  댓글주소  수정/삭제  댓글쓰기

    오랜만에 쉬었다 갑니다.

  4. simons9989 2013.06.15 12:55  댓글주소  수정/삭제  댓글쓰기

    포스팅 정말 잘 보고 있습니다~!!!
    yagome님 정말 쌩뚱맞지만 질문하나만 하겠습니다ㅠㅠ

    제가 현재 특정 뷰 컨트롤러에 버튼 4개와 VIEW 하나를 배치하고

    각각의 버튼을 누를 때마다 다른 뷰 컨트롤러를 호출해서 저 VIEW에다가 뿌려주고 싶은데

    뷰 컨트롤러의 view는 잘 가져오는데 거기에 있는 OUTLET의 IBACTION은 하나도 실행되지 않더군요...

    즉, 한 화면에 여러개의 뷰 컨트롤러를 스위칭해서 보여주고 싶은데...

    가능할까요??가능하다면 팁좀 부탁드릴게요ㅠㅠ

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

      한 화면에 여러개의 뷰컨트롤러의 뷰를 스위칭 한다...
      그다지 좋은 방법은 아니지만, 가능하긴 합니다.
      이걸 어떻게 팁을 드려야 할까요;;
      http://blog.yagom.net/135
      참고해 보시고 궁금하신 점 다시 한 번 알려주세요 :)

  5. yagom님 네이버 맥부기 카페에서 강좌 잘 보고있습니다~~^^ 2013.06.15 16:13  댓글주소  수정/삭제  댓글쓰기

    티스토리는 어떻게 가입하는건지;;몰라서
    이렇게 글을 남겨요~~
    야곰님 연재강좌 정말 잘 보고있구요 많이 배우고 있습니다
    사실 너무 초보라서 이해가 잘 가지는 않지만
    따라하다고 연습하면 길이 보이겠죠;;
    궁금한 점이 있어서 네이버 쪽지를 보냈는데
    혹시 시간나시면 한 번 봐주실 수 있을까요?
    궁금 한 것이야 한둘이 아니지만~
    강좌내용중에 궁금한 것이 있어서 여쭤봅니다~~

  6. yagom님 네이버 맥부기 카페에서 강좌 잘 보고있습니다~~^^ 2013.06.15 17:49  댓글주소  수정/삭제  댓글쓰기

    감사합니다~~^^
    이제는 야곰님 블로그에 와서 질문 좀 남길께요~
    바쁘실텐데 ㅠ 죄송합니다

  7. fwith 2013.06.16 20:19  댓글주소  수정/삭제  댓글쓰기

    아이폰 개발하는데에 야곰님 블로그에서 이해되지 않은 부분들을 많이 배워가고 있습니다. 나중에 시간이 되시면 부탁드릴게 하나 있는데 코어데이터에 대해서 포스팅 해주시면 안될까요? 전반적인 기능들을 쉽게 써주시면 정말 도움 될 것 같습니다. 감사합니다.

  8. simons9989 2013.06.17 23:13  댓글주소  수정/삭제  댓글쓰기

    야곰님 다시한번만 질문 드릴게요ㅠㅠ
    음...제가 질문을 잘 못했던거 같은데... 죄송하지만 다시 한번만 질문 드릴게요~!!ㅜㅜ
    ViewController1, ViewController2를 구현한 상태에서
    ViewController3을 만들고 있습니다.
    이 때 ViewController3에 버튼 두개를 배치했고 각각의 버튼을 누를때마다
    ViewController1와 ViewController2를 호출해오고 싶다는 얘기였습니다.
    그런데 이 때 아예 화면 자체가 바뀌는건 아니고 제가 View로 설정한 영역에 ViewController1 또는 2가 호출되는 것입니다.
    즉, 한 화면에 두개의 뷰컨트롤러가 독립적으로 실행되고 있다고 해야하나요??ㅠㅠ
    말 주변이 없어서 설명을 잘 못하겠네요ㅠㅠ
    |------------------------------------|
    | 버튼1, 버튼2 |
    | |
    | |-------------뷰-----------| |
    | | 버튼을 | |
    | | 누르면 | |
    | | viewController1 | |
    | | 또는 | |
    | | viewController2 | |
    | | 호출 | |
    | | | |
    | |---------------------------| |
    | |
    |------------------------------------|
    대충 그림으로 표현하자면 이런 모양인데...허접하네요~_~ㅎㅎ귀엽게 봐주시길...ㅎㅎ
    근데 저게 사실 가능한구조인지도 모르겠지만...
    저게 가능한구조인지 가능하다면 어떻게 구현해야 할지를 질문드리고싶네요~
    귀찮으시겠지만 잘 좀 부탁드립니다 굽신( _ _)
    PS. 아 그리고 네이버로 쪽지 보내려고 하는데 아이디좀 알려주실수 있으세요??제 아이디는 simons9989@naver.com입니당~!

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.06.18 09:30 신고  댓글주소  수정/삭제

      네, 제가 말씀드렸듯이 addSubview를 하시면 됩니다...^^;

      3번컨트롤러에서 1번컨트롤러와 2번컨드롤러 import 해 주시고

      화면에 각 컨트롤러들의 객체를 만들어서 해당 view를 addSubview 해주시면 됩니다.

      막상 해보면 간단한데 말로 설명하기가 참 애매합니다...^^;

      아니면 IB나 스토리보드를 사용하셔도 됩니다..

      방법도 다양하고 어렵지 않은 방법인데...

      간단하게 뷰컨트롤러 3에..

      #import "ViewController1.h"
      #import "ViewController2.h"

      해주시고

      ViewController3의 viewDidLoad에

      ViewController1 *viewCon1 = [[ViewController1 alloc] init];
      ViewController2 *viewCon2 = [[ViewController2 alloc] init];

      [[viewCon1 view] setFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
      [[viewCon2 view] setFrame:CGRectMake(0.0f, 100.0f, 100.0f, 100.0f)];

      [[self view] addSubview:[viewCon1 view]];
      [[self view] addSubview:[viewCon2 view]];

      이렇게 해보셔요.

      참, 그리고 제가 네이버 쪽지는 거의 들어가보지 않아서 블로그에 질문 남겨주시면 되겠습니다..^^

      장마가 시작되었네요, 행복한 일주일 되시길..!

  9. simons9989 2013.06.18 14:47  댓글주소  수정/삭제  댓글쓰기

    우아우아~친절한 답변정말 감사합니당@_@ㅠㅠㅠㅠㅠ

    근데 해보니깐 저렇게 했을 때 viewCon1,viewCon2의 view는 addSubview로 가져와 지는데

    그 view안에 있는 버튼에 IBAction을 설정해놨는데

    단순히 view만 가져와지고 걔네들은 작동이 안되더라구요...

    물론 해당 IBAction은 ViewController1,2에다가 코딩해놓았지요~_~;;ㅎ

    그래서 혹시 이것도 뭔가 제가 작업을 해줘야하나요??ㅠㅠ

    답답하고 궁금합니다ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

    부빌데가 야곰님밖에 없어서 자꾸 귀찮게 질문드려서 죄송합니다 또 감사하구요~!

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.06.18 20:29 신고  댓글주소  수정/삭제

      액션이 잘 연결이 되어있다면 동작해야 정상일텐데요...^^;
      어떤 코드를 넣으셨는데 작동을 안하시는지...
      단순히 로그라도 찍어보세요 ㅎ
      아니면 메모리에서 컨트롤러 객체가 해제되어서 그럴수도 있을 것 같습니다.
      ViewController3에서
      ViewControll1과 ViewController2 를 strong property로 선언해서 해보세요~
      물론 선언만 하면 안되고 viewDidLoad에서
      self.viewCon1 = [[ViewController1 alloc] init];

      해서 진행해보세요 ㅎ

  10. simons9989 2013.06.18 22:11  댓글주소  수정/삭제  댓글쓰기

    악~!!되는군요ㅠㅠ
    제가 뭔가 실수 했나보네요ㅠㅠ
    이 문제로 한 3주 고생한거 같은데...
    정말정말 감사합니닷~!!!
    앞으로 포스팅 잘보고 귀찮게 폭풍질문 하겠슴다!!+_+
    그럼 즐거운 한주되세요~^_^

  11. simons9989 2013.06.19 00:46  댓글주소  수정/삭제  댓글쓰기

    악~!!!야곰님ㅠㅠㅠㅠㅠㅠㅠㅠ
    정말 죄송한데 질문 딱 한개만 더할게요~!!!
    위에 질문했던 내용중에 viewController3에서 viewController1,2를 호출하잖아요~
    이 때 viewController1에 있는 버튼이, viewController3에서 불려졌는지 viewController1에서 불려 졌는지 알 수 있는 방법이 있을까요??
    sender를 이용하면 어찌어찌 가능할 것 같기도 한데..ㅠㅠ
    그리고 viewController1에 원래 버튼 IBAction함수가 있긴 하지만
    viewController3에서 다시 구현할 수는 없을까요?!?!
    알려주세요~!!

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.06.19 23:36 신고  댓글주소  수정/삭제

      음...
      상황에 따라서 여러가지 방법이 있을 것 같습니다만...
      [[[self view] superview] superview] 하면 나오는 값이 다를 것 같습니다.. (확인 안해서봐서 장담 못하겠어요^^; )

      그리고 ViewController3에서 원하는 IBAction 메소드를 구현한 후 (예를 들어 buttonClicked: 라는 메소드)
      ViewController3에서

      [[[self viewCon1] aButton] removeTarget:nil
      action:NULL
      forControlEvents:UIControlEventAllEvents];

      [[[self viewCon1] aButton] addTarget:self action:@selector(buttonClicked: ) forControlEvents:UIControlEventTouchUpInside];

      이런식으로 넣어주시면 되겠습니다... 'ㅁ'

  12. 퐝칭칭 2013.06.26 10:21  댓글주소  수정/삭제  댓글쓰기

    와 야곰님 진짜 오랜만에 글올리셨네요 ㅎ
    12년 이후엔 활동 안하시는줄 알고 ;;ㅋ
    가끔 필요한 내용 있을땐 종종 들어와서 도움받아가곤 했답니다. ㅎ
    감사~ ㅎ

    참 저 지금 하던거 궁금한게 있는데 하나 여쭤볼께요
    페이지슬라이딩 과 스와이프 기능
    (그러니까 음....;; 좌우 슬라이드로 페이지가 슬라이딩되고
    좌측상단에 버튼을 누르면 페이스북처럼 페이지가 밀리면서 메뉴 뷰가 끌려나와지는 모습....^^;;) )

    여기서 메뉴버튼 활성화/비활성화 할떄,, 활성화는 버튼으로만 되고 , 비활성화는 버튼과 우측에서 좌측으로 스와이프 해서 되도록 하려고 하는데 ,

    [_pagingScrollView setScrollEnabled:YES];

    이 메소드를 사용하서 활성비활성을 했거든요. 근데 이게 페이지가 구현되어있는 파일에서만 실행되는거 같은데 ..
    스와이프 또는 버튼으로 비활성을 시켰을떄 ! 그때를 알려주는 메소드가 있나 해서요 ....
    (돌아와서 현재 보고 있는 페이지로 돌아왔다! 그때 실행시켜라.! 할수 있는 메소드)

    글이 좀 길고 정신없어 보여서 죄송하지만 혹시라도 야곰님이라면 아실까 해서 주절주절 도움을 청해봅니다 ^^;;;;;
    즐거운 하루 되세요 ㅎ


    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.06.26 13:12 신고  댓글주소  수정/삭제

      안녕하세요!!

      음... 글쎄요^^;

      페이지가 다시 원래대로 돌아올때의 메소드에 넣어주시는게 좋지 않을까요?

      제가 어떤 구조로 어떤 소스로 짜여져 있는지 모르기때문에 정확히 말씀드리기가 어렵지만...

      제스쳐 인식하는 델리게이트 때에 넣어주셔도 될 것 같구요~

      아님 좌측 메뉴가 사라지는 시점에 실행시키면 될 것 같구요...^^

      맞는 답변 드렸는지 모르겠네요ㅠ

    • 퐝칭칭 2013.07.05 11:46  댓글주소  수정/삭제

      어찌어찌 하여 되긴 됐어요 ㅋㅋ

      감사합니다 야곰님 ㅎㅎ 이상한 질문에 답변하신다고 고생하셨겠어요..;;;ㅎㅎ

      그런데 navigationController 에 대한 질문이 하나 더 생겨 버렸어요 ; (죄송)



      일반적으로 navigation 을 호출할때

      [[self navigationController] pushViewController:writeViewCtrl animated:YES];

      이런 식으로 사용하는걸로 알고 있는데

      저기서 self 대신 다른 뷰 컨트롤러를 넣고싶은데 그렇게는 원래 안되는건가요 ?

      self 가 자신의 controller 를 가리킨다고 생각 했는데 ,,,

      자신의 뷰 를 할당하고 실행 해봐도 self 나 super 가 아니라면 안되는거 같아서요.. 조언좀 부탁드리겠습니다 야곰님님 !! ^^

      예)
      현재 위치 - ViewController.m

      ViewController *viewController = [[ViewController alloc] init];
      [[viewController navigationController] pushViewController:testViewController animated:YES];

      *이런 식으로 자신의 뷰를 self 대신 해준건데도 안되네요 ㅜㅜ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.07.05 13:50 신고  댓글주소  수정/삭제

      ^^ 첫 번째 문제는 잘 해결되셔서 다행입니다.

      지금 하셨던 방법은 예상한대로 되지 않는것이 맞습니다 ^^;

      새로운 인스턴스를 생성하였기 때문에 그것은 내가 아닙니다.

      ViewController *viewController = self;

      이렇게 해야하죠...

      [self navigationController]라 함은 나를 관장하고 있는 네비게이션을 뜻합니다.

      특정 뷰에는 네비게이션이 붙지 않습니다. 그 뷰를 관장하는 뷰 컨트롤러에 네비게이션이 존재하게 되지요.

      말씀하신대로 특정 뷰 컨트롤러 인스턴스의 네비게이션을 호출하려면 [viewCon navigationController]를 호출해서 가져오면 됩니다.

      하지만 위에서는 viewController가 어떤 네비게이션에도 속해있지 않으며, 방금 만들어진 새로운 인스턴스이므로 화면에 나와있지도 않습니다..^^

      잘 이해가 안되시면
      http://blog.yagom.net/20
      http://blog.yagom.net/120
      http://blog.yagom.net/123

      를 참고해 보세요 :)

  13. 2013.06.30 04:58  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  14. Favicon of https://rainybday.tistory.com BlogIcon 넛하우스 2013.07.18 10:02 신고  댓글주소  수정/삭제  댓글쓰기

    정말 많은 도움이 되었습니다. 제스처 구현 방식이 블로그 쥔장마다 조금씩 달랐는데. 야곰님껄 기본으로 하니 쉽게 되었습니다.` ^^

  15. JaneLee 2013.07.18 17:39  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 블로그 보고 많은 도움을 얻고 있습니다.
    저는 완전 초보자로서 몇달째 간단한 프로그램을 하나 만들기 위해서 국내외 사이트와 책자를 뒤지며 고생 중입니다.
    줌 인/아웃이 가능한 약도 그림파일 하나를 넣는 것인데 그게 이렇게 어려울 줄 몰랐습니다.
    벌써 샘플코드나 책을 보고 간단한 앱 몇가지는 성공해 보았는데 아무리 찾아도 줌 인/아웃에 대해 제가 알수 있는 수준으로 설명해 놓은 자료가 없어서 몇달째 고생중이예요. 기본이 없으니 정말 힘듭니다.
    다름아니고 주인장님께서 UIGesture에 대해서 너무 알기쉽게 설명을 해 주셨는데요.. 이 글에서 중간에
    "아까 복사해둔 메소드를 이용해 이렇게 구현해 줍니다"라는 부분에 들어가는 코드들이 뭔지 도무지 알 길이 없어서 실행을 해볼 수가 없네요. 이 샘플로 실행을 해보고 핀치 줌도 적용해보려는데 여기서 막혀서 계속 해결방법을 찾으려 노력하다가 정말 어렵게 주인장님께 메시지를 보내게 되었습니다. ㅠㅠ 번거로우실거라 생각해서 답변을 못들을거라고도 생각되지만 너무 다급해서요.

    제가 꼭 알고자 하는 것은요.. 말씀드린대로 약도를 줌 인/아웃 해서 확대해서 보는 앱에는 scrollview를 이용한 줌 구현이 좋은가요, 아니면 핀치제스쳐를 이용하여 이미지뷰에서 줌을 실행하는 것이 좋을까요? 일단 여기서부터 막혔거든요. ㅠㅠ 핀치제스쳐로 하는거 간신히 해외 사이트에서 샘플 찾아서 완성했는데 부드럽게 줌이 안 되고 한 손가락 고정하고 다른 손가락으로 문질러야만 줌이 되는거예요. ㅠㅠ
    그래서 또 폭풍검색을 하니 스크롤뷰에 이미지뷰를 올려서 줌을 하라고 하는 것 같아서요. 어떤 방법이 좋은가요?

    그리고 혹시 간단한 샘플 코드나 저같은 초보가 볼만한 튜터리얼이 없을까요? 진짜 제가 할수 있는 국내외 사이트 안 뒤져본 곳이 없는데요.. 여전히 꽉 막혀있습니다.

    간곡히 조언좀 부탁드릴게요~~ 만일 넘 바쁘시면 이 글 중간에 코드는 어떤게 들어가는건지만이라도(어디를 참고해야 그 코드들을 찾아낼 수 있는지만이라도) 좀 알려주시면 좋겠어요. 읽어주셔서 감사합니다~
    답변 기다리겠습니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.07.19 10:46 신고  댓글주소  수정/삭제

      아... 그게 참... 그게 정말 간단한 거 같아도 꽤 쉽진 않거든요..^^;

      튜토리얼은 없고 오픈소스는 있어요...

      핀치 제스쳐로 사진 줌을 하는 데에는 조금 무리가 있을 것 같습니다 ㅠㅠ

      애플의 공식문서는 여기구요..

      http://goo.gl/041mH

      음... 오픈소스 링크도 걸어드릴게요

      http://goo.gl/FMU0I

      http://goo.gl/9oeJf

      도움이 되었으면 좋겠네요^^;

  16. JaneLee 2013.07.18 17:43  댓글주소  수정/삭제  댓글쓰기

    아참 참고로 저는 스토리보드를 사용하고 있습니다. ^^

  17. JaneLee 2013.07.19 17:23  댓글주소  수정/삭제  댓글쓰기

    답변 감사드립니다. 한번 더 연구해보고 나중에 결과 알려드릴게요~ ^^ 고맙습니다~~~~

  18. 2013.07.23 12:39  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

  19. seungjae 2013.08.02 01:48  댓글주소  수정/삭제  댓글쓰기

    저는왜 캔슬버튼이 안눌리는걸까요?ㅋㅋㅋㅋㅋㅋㅋㅋ

    ios6에서 스토리보드없이 하고있는데 말이죠?

    // .m파일에서 코드를 복사했습니다.

    - (BOOL)gestureRecognizerShouldBegin:(UILongPressGestureRecognizer *) gestureRecognizer
    {
    UIActionSheet *actionSheet =[[UIActionSheet alloc]
    initWithTitle:@"Select Curation Mode"
    delegate:self
    cancelButtonTitle:@"Cancel"
    destructiveButtonTitle:@"Curation Mode 2"
    otherButtonTitles:@"Curation Mode 3", @"Curati,,", nil];
    [actionSheet showInView:self.view];
    return YES;
    }




    - (void) actionSheet:(UIActionSheet*)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
    {
    NSString *menuString = [actionSheet buttonTitleAtIndex:buttonIndex];

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert"
    message:[NSString stringWithFormat:@"%@ is selected", menuString]
    delegate:nil
    cancelButtonTitle:@"Why..?"
    otherButtonTitles:nil];
    [alert show];
    }

  20. seungjae 2013.08.06 03:45  댓글주소  수정/삭제  댓글쓰기

    네! 다른버튼은 눌리네요.ㅋㅋㅋ

  21. 리얼왕초보 2013.08.06 21:24  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님 역시나 좋은 강좌 감사합니다~
    덥고 습한데 건강 잘 챙기세용~~
    강좌 복습도 어느덧 끝나가네요
    질문 하나만 드리려구요~ 코드를 다 작성하고 실행후에 처음 제스쳐는 잘 인식을 하는데
    액션시트와 얼럿뷰까지 끝나고 두 번째 제스쳐에는 왜 아무런 반응이 없는지 궁금합니다~

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.08.07 10:12 신고  댓글주소  수정/삭제

      음... 저는 잘 되었었는데, 무슨 문제일까요?ㅠㅠ
      제가 바로 위에 단 덧글처럼 showInView의 인자를 바꿔보시겠어요?

    • 리얼왕초보 2013.08.09 01:04  댓글주소  수정/삭제

      인자를 바꿔봤는데 현상은 똑같네요 ㅠ
      제가 당장은 해결하기 불가능한 수준같네용 ㅠㅠ
      더 공부해서 해결해 보겟습니다~
      항상 정성껏 답변 해주셔서~너무나 감사드립니다`~

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

      메일 보내드렸어요 :)

    • 하이앟 2013.09.29 21:18  댓글주소  수정/삭제

      저또한 같은 문제를 겪었습니다
      (BOOL)gestureRecognizerShouldBegin대신
      그냥 IBAction으로

      - (IBAction)showInfo:(UILongPressGestureRecognizer *)gestureRecognizer
      { if([gestureRecognizer state]==UIGestureRecognizerStateBegan) {
      /////////반응 내용} }

      하니까 해결되더라구요..혹시나 도움이 될까 해서 주제넘지만 올려봅니다~


이 문서는 2012. 12. 기준으로 작성된 글이므로, 이후에 애플 문서의 내용이 변경될 수 있습니다.
또한 전문 번역가가 아니기 때문에 의역, 오역의 소지가 다분히 많습니다.
참고하시기 바랍니다.

공개 수배 합니다!
유용한 iOS 개발문서를 함께 번역해 나갈 분들을 찾습니다.
현재도 함께 작업중이신 분들 모두 전문 번역가 아닙니다.
모두 열정과 열의로 함께 작업하고 계십니다.
자신의 재능을 자신뿐만 아니라 또 다른 누군가를 위해서 사용한다면 더더욱 빛이 날 것입니다.
함께하길 원하는 분께서는 덧글 또는 이메일 주시기 바랍니다 :)
 

오늘의 주제

1. The User Interface
2. The App Bundle 



파헤치기 네 번째 시간입니다.^^

이번 파트는 낭만떡대 님께서 도와주셨습니다. 번역에 도움주셔서 진심으로 고맙습니다 :)

자, 그럼 출발해 봅시다^^~


# The User Interface



The User Interface
모든 iOS앱은 적어도 하나의 윈도우와 하나이상의 뷰를 가지고 있습니다. UIWindow클래스의 인스턴스인 window는 컨텐츠를 나타낼 공간?을 제공합니다. View들은 UIView의 서브글래스로서 컨텐츠를 그리고 터치 이벤트를 다루는 역할을 담당합니다. OpenGL ES를 사용하여 만든 인터페이스는 보통 하나의 뷰를 갖고 그 뷰를 컨텐츠를 랜더링 하는데 사용합니다. 
뷰 컨트롤러는 사용자 인터페이스를 위한 매우 중요한 역할을 담당 합니다. 뷰 컨트롤러는 UIViewController의 서브클래스로 뷰들의 셋을 관리하고 그 뷰들간의 인터랙션을 관리 및 다른 역할을들 수행해야 합니다. iOS 앱은 컨텐츠를 표현하기에 너무 제한적인 공간을 가지고 있습니다. 뷰들을 교체하고 다른 뷰 컨트롤러의 뷰들과 바꿀 수 있는 인프라스트럭쳐를 제공합니다. 그러므로 뷰 컨트롤러들은 하나의 컨텐츠 타입에서 다른 타입으로 변환하는데 당신이 어떻게 구현을 하는가에 달려있습니다. 

당신은 뷰 컨트롤러 객체들은 독립적이라는 것을 항상 생각해야 합니다. 뷰 컨트롤러들은 자신이 가지고 있는 뷰 들을 만들고 제거하며, 뷰들을 화면에 보여주고, 뷰와 다른 객체들간의 상호작용을 돕습니다.




Building an Interface Using UIKit Views
UIKit의 view들을 사용하면 기본적인 인터페이스를 빠르게 구현할 수 있기 때문에 앱을 쉽게  만들 수 있습니다.
UIKit을 이용하면 다양한 종류의 view를 이용하여 데이터를 표현할 수 있습니다. 
Contol(뷰의 특별한 타입)들은 사용자의 액션이 일어날 때 특정 행동을 수행 할 수 있도록 빌트인 매커니즘 을 제공합니다. 예를 들어, 버튼을 클릭하면 버튼과 연결된 액션 메소드가 호출됩니다.

UIKit view를 기반으로 어플을 만들때 Interface Builder(xCode에 설치되어있는 인터페이스 에디터)를 사용하면 시각적으로 뷰들을 구성할 수 있습니다.
Interface Builder는 표준 view들과 control들 그리고 그 외 객체들을 라이브러리형태로 제공합니다. 
라이브러리에서 객체들을 드래그해서 화면에 배치할 수 있습니다. (WYSWYG 형태로 사용자 인터페이스를 구성 할 수 있습니다)
또한 inspectors를 이용해 객체들의 속성값을 설정할 수 있습니다. 코드로 직접 작성하는 것보다 인터페이스 빌더를 사용하면 처리속도가 빠르며 앱의 실행 없이 결과를 즉시 확인 할 수 있습니다.

Note: 커스텀 뷰를 UIKit의 뷰를 UIKit 뷰 구조에 포함시킬 수 있습니다. 커스텀 뷰는 이벤트 제어와 그리기 등을 모두 당신이 제어하는 UIView의 서브클래스 입니다. 커스텀 뷰의 제작과 그것을 당신의 뷰 구조에 포함시기는 방법에 대하여 추가적인 정보를 얻으려면 View Programming Guide for iOS를 참고하십시오.

그림 2-3은 뷰 객체들로만 구성된 앱의 기본 구조를 보여줍니다.
흰색 배경을 가진 main view가 3개의 서브뷰(이미지뷰, 텍스트뷰, 버튼뷰)를 가지고 있고 윈도우에 올라가 있으며 이 모든 뷰는 하나의 View Controller가 관리합니다.


뷰 컨트롤러는 하나의 컨텐츠 뷰를 가지고 있고 이 뷰는 스스로 다른 뷰들을 가지고 있을 수 있습니다. 
몇몇의 뷰 컨트롤러들은 다른 뷰 컨트롤러의 컨테이너 역할을 합니다.
두 개의 뷰 컨트롤러를 하나의 화면에 보여주는 역할을 하는 split view Controller가 하나의 예 입니다.
뷰 컨트롤러의 역할에 대해 더 많은 정보를 얻고 싶으면 "View Controller Programming Guide for iOS"를 읽어보세요. 뷰에 대한 정보를 원하시면 "View Programming Guide for iOS"를 읽어보세요.



Building an Interface Using Views and OpenGL ES


높은 프래임 래이트 또는 정교한 표현이 필요한 게임 같은 앱들은 OpenGL ES를 사용하여 구성 할 수 있습니다.

가장 심플한 OpenGL ES 앱은 하나의 윈도우에 하나의 view를 올린 형태 입니다. 또한 OpenGL ES와 UIKit view들을 혼합해서 앱을 구현 할 수 도 있습니다.


그림 2-4는 OpenGL ES를 이용한 앱을 구성을 보여줍니다. UIKit view와 달리 OpenGL ES는 다른 종류의 layer객체(CAEAGLLayer 객체)에 지원을 받습니다.


CAEAGLLayer 객체는 OpenGL ES이 화면에 컨텐츠를 표현할 수 해줍니다. 또한 앱은 화면을 관리 하기 위해 EAGLContext 객체를 생성하고 뷰들을 저장하고 관리리 합니다.


OpenGL ES에 대한 더 많은 정보는 "OpenGL ES Programming Guide for iOS"를 참고하세요



The App Bundle

앱을 build할때 xCode는 bundle로 묶습니다. bundle이란 앱의 정보와 자료를 하나의 공간에 그룹화해서 저장한 하나의 디렉토리 입니다.

앱 번들은 app icon, 이미지 파일, 지역화된 컨텐츠들과 같은 자원과 앱 실행파일을 담고 있습니다. 

테이블 2-3은 전형적인 iOS 앱 번들의 내용을 보여 줍니다. (이 앱 번들은 하나의 예이기 때문에 몇몇 파일들은 당신의 앱 번들에 보이지 않을 수 있습니다.)




File

Example

Description

App executable

MyApp

[필수] 컴파일 된 코드를 담은 실행 파일.(.app 확장자를 가진다)

The information property list file

Info.plist

[필수]Info.plist파일은 앱의 설정 데이터를 담고 있습니다. 시스템에서 이 데이터를 보고 어떻게 앱과 상호작용 할지 결정합니다.

App icons

Icon.png

Icon@2x.ong

Icon-Small.png

Icon-Small@2x.ong

[필수]App icon은 디바이스의 홈 스크린에 앱을 표현하는데 사용됩니다. @2x라고 이름이 붙은 아이콘들은 레티나 디스플레이를 위해 사용되는 아이콘 입니다.

Lanch images

Default.png

Default-Portrait.png

Default-Landscape.png

[필수(1개이상)]시스템은 이 이미지들은 앱이 처음 실행될 때 임시 배경으로 사용합니다. 이 배경은 앱의 인터페이스가 화면에 나타날 준비가 완료되면 바로 제거됩니다.

Storyboard files(or nib files)

MainBoard.storyboard

스토리보드는 앱이 화면에 보여주는 뷰와 뷰 컨트롤러들을 포함합니다. 뷰는 뷰 컨트롤러들이 뷰를 보여주는 것에 따라 조직됩니다. 또한 스토리보드는 화면전환 방법을 보여줍니다.

메인 스토리보드 파일은 Xcode에서 프로젝트를 생성할 때 지정됩니다. Info.plist파일에서 NSMainStoryboardFile 키의 값을 변경하여 메인 스토리보드 파일의 이름을 변경할 수 있습니다. 스토리보드 대신 nib 파일을 사용하는 앱에서는 NSMainStoryboardFile키 대신 NSMainNibFile 키를 사용하여 메인 nib 파일을 지정할 수 있습니다.

스토리 보드 또는 nib를 꼭 사용하여야 하는 것은 아니지만 사용하는 것을 추천합니다.

Ad hoc distribution icon

iTunesArtwork

Ad-hoc방법으로 당신의 앱을 배포하려고 한다면 512x512사이즈의 앱 아이콘이 필요합니다. 보통 이 파일은 앱 스토어에 등록할 때 iTunes Connect에서 요구하는 파일인데 Ad-hoc 방법으로 앱을 배포하면 앱 스토어를 거치지 않기 때문에 이 아이콘이 반드시 필요하다. 이 아이콘은 iTunes에서 당신의 어플을 표시할 때 사용됩니다.

 

파일 이름은 반드시 iTunesArtwork여야 하고 파일 확장자를 붙이면 안됩니다. 이 파일은 Ad-hoc방법으로 앱을 배포할때만 필요하며 그 외의 경우에는 필요하지 않습니다.

Setting bundle

Settings.bundle

설정 앱(톱니바퀴모양의 아이폰 기본 셋팅 어플리케이션)”을 통해 당신의 앱의 환경설정을 보여주고 싶다면 반드시 Settings.bundle을 사용해야 한다. bundle은 앱의 환경설정을 위해 속성목록과 다른 리소스를 담고 있습니다. “설정 앱은 이 번들을 당신의 앱이 필요한 인터페이스 요소들을 수집하기 위하여 사용합니다.

bundle의 사용은 선택사항이며 더 많은 정보를 얻고 싶다면 “Preferences and Settings Programming Guide”를 읽어보세요

Nonlocalized resource files

Sun.png

Mydata.plist

 

Nonlocalized resource는 이미지, 사운드, 비디오, 커스텀 데이터 파일 등을 포함할 수 있습니다. 이 모든 파일은 App bundle의 상위 레벨에 위치 하는 것이 좋습니다.

Subdirectories for localized resources

en.lproj

fr.lproj

es.lproj

지역화된 리소스들은 반드시 language-specific project directories에 위치해야 합니다. 또한 파일 이름은 ISO 639-1 에 정의된 언어 축약형태 + .lproj 라는 접미사가 붙어야 합니다. ( 예들 들어, en.lproj, fr.lproj, es.lproj 이 디렉토리들은 영어, 프랑스어, 스페인어를 위한 지역화 자원을 담고있다)

 

app icon, lunch image, Settings icon 등의 정보 또한 language-specific project directories에 설정하면 지역화가 가능합니다. 더 많은 지역화 정보는 “Localized Resource Files”를 참고하세요.


iOS앱 번들의 구조에 대해 더 많은 정보를 원하시면 “Bundle Programming Guide”를 참고하시고, 번들로부터 리소스파일을 어떻게 로딩하는지에 대한 정보는 “Loading Resources Into Your App”을 참고하세요.



후아~ 힘드네용+_+ !!!

번역하느라 고생하신 낭만떡대님께 다시 한 번 진심으로 감사의 말씀 전합니다 :)
 
많은 분들의 도움의 손길 필요로 합니다.

만약 내용 중에 오역, 또는 잘못된 점이 있다면 언제든지 지적해 주시고, 잘 이해가 되지 않는 부분에 대해서는 덧글 남겨주시면 고맙겠습니다 :)

새해 복 많이 받으세요~! 



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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





Posted by yagom

댓글을 달아 주세요


이 문서는 2012. 12. 23. 기준으로 작성된 글이므로, 이후에 애플 문서의 내용이 변경될 수 있습니다.
또한 전문 번역가가 아니기 때문에 의역, 오역의 소지가 다분히 많습니다.
참고하시기 바랍니다.


공개 수배 합니다!
유용한 iOS 개발문서를 함께 번역해 나갈 분들을 찾습니다.
현재도 함께 작업중이신 분들 모두 전문 번역가 아닙니다.
모두 열정과 열의로 함께 작업하고 계십니다.
자신의 재능을 자신뿐만 아니라 또 다른 누군가를 위해서 사용한다면 더더욱 빛이 날 것입니다.
함께하길 원하는 분께서는 덧글 또는 이메일 주시기 바랍니다 :)


오늘의 주제

1. Core App Objects of Your App
2. The Data Model 



파헤치기 세 번째 시간입니다.^^

이번 파트는 낭만떡대 님께서 도와주셨습니다. 번역에 도움주셔서 진심으로 고맙습니다 :)

자, 그럼 출발해 봅시다^^~


# The Core Objects of Your App



Core App Objects

 UIKit은 모든 앱을 위한 기반을 제공합니다. 그러나 앱의 특정한 동작을 위해 커스텀 객체를 정의해야 합니다. 당신의 앱은 iOS와의 중요한 상호작용과 이벤트 루프를 관리하는 UIKit 객체로 구성 되야 합니다. 상속, 델리게이션 그리고 그 외 다른 테크닉들의 조합을 통해 UIKit에 정의된 기본 동작을 수정할 수 있습니다.
 
UIKit 객체들을 커스터마이징 하는 것뿐만 아니라, 객체들을 직접 정의할 수 있습니다. 앱 개발의 가장 큰 부분은 데이터 객체 구현 입니다. 또한 사용자인터페이스 객체를 제공해야 하는데 다행스럽게도 사용자 인터페이스 쉽게 만들 수 있도록 유용한 클래스들을 UIkit에서 제공합니다.

The Core Objects of Your App

사용자에 의해 앱이 구동 될 때부터 종료될 때까지 UIKit 프레임워크는 앱의 수많은 핵심 동작을 관리합니다. 앱의 심장은 UIApplication 객체이며 이 객체는 시스템으로부터 이벤트를 받고 핸들링 하기 위해 커스텀 코드에 이벤트를 전달합니다. 그 외 다른 UIKit 객체들도 당신의 앱 동작을 관리하기 위한 역할을 담당합니다. 이러한 객체들은 앱의 상세구동을 다루기 위해 비슷한 방법으로 당신의 코드를 호출합니다.

UIKit이 어떻게 커스텀 코드와 동작하는지 이해하기 위해서, 다음 그림과 도표를 보면 도움이 됩니다.
그림 2-1은 앱의 가장 보편적인 객체간의 상호작용을 볼 수 있으며, 테이블 2-1은 각각의 객체들의 역할에 대해 설명되어 있습니다. 그림에서 볼 수 있듯이 iOS 앱은 MVC 디자인 패턴으로 구성되어 있습니다. 이 패턴은 데이터를 표현하기 위해 view로 부터 데이터 객체를 분리 합니다. 이러한 분리는 특히 유니버셜 앱을 만들 때 유용한데, 동일한 데이터 객체를 이용하면서 view들 만 교체하여 사용 할 수 있습니다. (즉 동일한 데이터 모델을 사용해 view만 상황에 맞게 표현해주면 아이폰과 아이패드에서 동시에 동작하는 유니버셜 앱 제작에 편리합니다.)


테이블 2-1 The roll of objects in an iOS

Object(객체)

Description(설명)

UIApplication object

 

당신은 UIApplication 객체를 상속작업 없이 있는 그대로 사용합니다. 이 컨트롤러 객체는 상위계층에서의 앱 동작을 조정하고, 앱 이벤트 루프를 관리합니다. 당신의 커스텀 앱 계층 로직은 UIApplication 객체와 함께 동작하는 앱델리게이트 객체에 속하게 됩니다.

App delegate object

 

App delegate 구동 시 UIApplicationMain function 의해 생성되는 커스텀체입니다. 객체의 중요한 역할은 앱 내에서 상태 전이를 관리 하는 일 입니다. 예를 들어, 객체는 앱이 처음 구동할 (또는 background상태에서 다시 재 구동 될 때) 초기화 및 transitions(특정작업, 변화) 핸들링을 담당합니다. app delegate가 어떻게 state transitions(상태변화) 관리 하는지를 자세히 알고 싶다면 “Managing App State Changes.” 읽어보세요.

 iOS 5.0이후 버전에서는 app delegate 다른 app-related events(앱 관련 이벤트들) 다루는데 사용할 있습니다. xCode 프로젝트 템플릿들은 app delegate UIResponder의 서브클래스로 정의되어 있습니다. 만약 UIApplication객체가 이벤트를 처리하지 않으면 처리되지 않은 이벤트는 app delegate에게 전달됩니다. 이때 다룰 수 있는 이벤트 종류와 자세한 정보 “UIResponder Class Reference.” 읽어보세요.

Documents and data

model objects

 

Data model 객체는 앱의 컨텐츠를 저장합니다. 예를 들어, 은행 앱은 금융거래 정보를 저장하고, 그림그리는 앱은 이미지를 저장하거나 더 나아가 그림이 그려지기 위한 명령 순서를 저장하기도 합니다.(후자의 경우, 이미지 객체는 이미지 데이터를 포함하기 위한 보관장소이므로 데이터 객체입니다.)

데이터 모델 객체의 부분 또는 전체를 관리하기 위해 다큐먼트 객체(UIDocument 서브글래스 객체) 사용할 있습니다. 다큐먼트 객체의 사용은 필수는 아니지만 파일 또는 파일패키지에 데이터를 그룹화해 저장할 수 있는 편리한 방법을 제공합니다. 많은 정보는 “Defining a Document-Based Data Model.” 읽어보세요. 

View controller objects

 

View controller objects는 앱의 화면 구성을 관리합니다. 하나의 view controller는 하나의 view 와 그 view sub-view들을 관리 합니다그것들이 화면에 보여지는 순간, 뷰 컨트롤러는 그것들을 앱 윈도우에 올려서 화면에 보여지도록 합니다.

UIViewController 클래스는 view controller 객체들의 기본 클래스 입니다. UIViewController view를 위한 기본 기능을 제공하고 화면에 표현하고, 디바이스의 로데이션에 대응해 view들을 로테이션 하는 역할을 담당하며 그 외 추가의 표준 시스템 행동을 제공합니다. UIKit과 다른 프레임 워크들은 이미지 픽커, 탭바, 네비게이션과 같은 기본 시스템 인터페이스의 동작을 위해 추가의 view controller 객체들을 제공하고 있습니다. 더 많은 정보를 원하면 "View Controller Programming Guide for iOS"를 읽어보세요.

UIWindow object

 

UIWindow 객체는 스크린에 보여지는 view들을 관장합니다. 대부분의 앱들은 하나의 윈도우를 가지고 있고 그 윈도우는 메인 스크린이 됩니다. 그러나 몇몇 앱들은 외부 디스플레이에 보여지는 컨텐츠들을 위해 추가의 window를 가지는 경우도 있습니다.(외부 모니터 등 외부 화면 출력을 위해)

view를 교체하기 위해 view controller를 사용해 window에 올려진 view들을 변경해야 하고 절대로 윈도우 자체를 교체하면 안됩니다.

덧붙여, 뷰들을 관리하기 위해서 윈도우들은 뷰와 뷰컨트롤러들에게 이벤트들을 전달해주는 UIApplication 객체와 함께 작동합니다

View, control, and layer objects

 

View Control은 컨텐츠의 시각적 표현을 위해 사용 됩니다. View는 지정된 직사각형 영역에 컨텐츠를 그리고(묘사하고) 그 영역에서 발생하는 이벤트에 응답하는 객체입니다. Control은 버튼, 텍스트필드 같은 특별한 타입의 view들을 의미 합니다.

UIKit 프레임 워크는 많은 종류의 표준화된 view들을 제공합니다. 또한 UIView(또는 그 하위 클래스)를 직접 상속하여 당신만의 커스텀 view를 정의 할 수도 있습니다.

 또한 뷰와 컨트롤들이 결합되는 것과 마찬가지로, 앱들은 코어 애니메이션 레이어와 뷰들이 결합될 수 있습니다. 레이어 객체은 눈에 보이는 컨텐츠를 표현하기위한 데이터 객체입니다. 뷰들은 레이어를 짧은시간안에 효율적으로 그들의 컨텐츠를 렌더링하기 위해서 사용합니다.커스텀 레이어 객체를 추가하여 복잡한 애니메이션을 구현하는데 사용할 수 있습니다.





하나의 iOS 앱이 다른 앱들과 구분되는 것은 데이터를 어떻게 관리하고 사용자에게 데이터를 어떻게 보여주는가에 따라 달려있습니다. UIKit과 상호작용하는 대부분의 객체들은 당신의 앱을 결정짓지 못하지만 앱의 동작을 개선할 수 있습니다. 예를 들어, 앱 델리게이트의 메소드가 앱 상태 변화에 대한 알림을 준다면 그에 상응하여 당신의 커스텀 코드가 적절한 반응을 할 수 있을 것입니다.

위의 클래스들에 대한 정보를 얻고 싶다면 해당 클래스 레퍼런스를 보세요. 또한 어떻게 이벤트들이 동작하는지에 대한 flow정보와 그 flow 안에서 당신의 앱이 어떤 반응을 해야 하는지에 대한 정보를 얻고 싶으면 "App States and Multitasking"부분을 참고하세요

# The Data Model

 




The Data Model

앱의 데이터 모델은 데이터 구조와 항상 같은 상태로 데이터를 유지하는데 필요한 작동 로직으로 구성됩니다. 데이터 모델을 앱의 사용자 인터페이스로부터 완전히 분리 하기 싫겠지만 데이터 모델 객체의 구현은 특정 view 또는 view contoller에 의지하면 안되고 분리 되어야 합니다. 사용자 인터페이스로부터 데이터를 분리 시키면 유니버셜 앱(아이폰과 아이패드을 모두 지원하는 앱)을 만들기 쉬워지고, 코드를 부분적으로 재사용하기 좋게 해줍니다.

만약 데이터 모델을 아직 정의 하지 않았다면, iOS frameworks가 데이터 모델을 분리하도록 도와 줄 것입니다. 다음에 나오는 섹션은 데이터모델의 특정 타입을 정의할 때 당신이 사용할 수 있는 객체들을 보여줍니다.

Defining a Custom Data Model

커스텀 데이터 모델을 정의할 때, 상위 레벨 구조를 표현하기 위한 커스텀 객체를 생성하십시오. 그러고 시스템에서 제공하는 객체의 이점을 잘 활용하여 더욱 간편하게 데이터 타입을 만들도록 하세요. Foundation framework는 표 2-2에 나열되어있는 것과 같이 객체지향적으로 문자열, 숫자 그리고 많은 종류의 간단한 데이터들을 관리하기위한 객체들을 제공합니다. 시간도 절약되고, 많은 수의 시스템 루틴들이 기본 객체들을 사용하기 때문에 이 객체들을 사용하는 것이 선호됩니다.



테이블 2-2 Data classes in the Foundation framework

Data

Class

Description

String and text

NSString

(NSMutableString)

NSAttributedString

(NSMutableAttibutedString)

iOS에서 string Unicode기반입니다. string클래스들은 다양한 방법으로 string을 생성하고 조작하는 방법을 제공합니다.

Attributed string클래스는 string을 꾸밀 수 있도록 해줍니다(, 반드시 Core Text와 결합하여 사용하여야 합니다)

Numbers

NSNumber

NSDecimalNumber

NSIndexPath

숫자와 관련된 정보를 저장하고 싶을 때는 number클래스를 이용하세요. NSNumber클래스는 정수(Integer), 실수(floating-point values), Booleans, 문자(char) 타입을 표현할 수 있습니다. NSIndexPath 클래스는 주로 계층적인 리스트에서 다중 레이어 선택을 명시할 때 주로 사용되는 숫자들의 순서를 저장합니다(주로 테이블뷰에서 많이 사용하죠).

Raw bytes

NSData(NSMutableData)

NSValue

바이트 데이터(Raw streams of bytes)를 저장할 때는 data object를 사용하세요. 데이터 객체는 아카이브 형식으로 객체를 저장할 때도 사용됩니다. NSValue 클래스는 카테고리를 사용하여 확장할 때 또는 point rectangle과 같은 데이터 타입을 저장하는데 사용됩니다.

Dates and times

NSData

NSDataComponents

타임스탬프, 달력날짜, 다른 시간관련 정보를 저장할 때 사용하세요.

URLs

NSURL

네트워크 자원의 참조하는 것 뿐만 아니라 URLs 은 파일 저장 위치(file path)를 저장하는데도 사용할 수 있습니다. NSURL클래스는 심지어 파일에 관련된 속성들을 얻어오고 수정할 수 있도록 지원합니다.

Collections

NSArray

(NSMuatableArray)

NSDictionary

(NSMuatubaleDictionary)

NSIndexSet

(NSMutableIndexSet)

NSOrderedSet

(NSMutableOrderedSet)

NSSet

(NSMuatableSet)

collection들은 관련된 객체들을 그룹화해 한곳에 저장할 때 사용하세요. Foundation framwork는 여러 다른 타입의 콜렉션 클래스들을 지원해 줍니다.

 



-          NSInteger/NSUInteger : 부호가 있는 또는 없는 정수(시스템 아키텍쳐에 따라서 사이즈가 결정됨).

-          NSRange: 영역을 지정하는 구조체. 예를 들어, 문자열 내에서 선택된 문자들의 영역을 지정할 수 있음.

-          NSTimeInterval: 주어진 시간 간격의 초 단위 수

-          CGPont: 위치를 정의하는 x,y좌표

-          CGSize: 가로와 세로의 넓이 좌표값

-          CGRect:  사각형 지역을 정의하는 값(CGPoint CGSize를 가진다)

 

물론, 커스텀 데이터 객체는 스칼라 값과 객체변수를 혼합해서 클래스의 멤버 변수로 선언 가능합니다. Listing 2-1은 간단한 사진첩을 위한 클래스 구현부분 입니다. 이 클래스의 인스턴스는 이미지 배열”, “이미지에 대한 익덱스번호”, “사진첩 제목  “수정가능여부(스칼라 변수인 BOOL)”를 갖습니다.

Listing 2-1 Definition of a custom data object


주의 : 데이터 객체를 정의할 때, 어떤 멤버변수든간에 객체에 접근하려는 클라이언트트에게 노출시키기 위해서 프로퍼티 선언을 해줄 것을 강력히 권고합니다. 구현파일에 이 프로퍼티를 결합해 주는 것은 당신이 요청하는 속성에 따라서 적절한 접근 메소드를 자동으로 생성해 줍니다. 이것은 객체의 관계가 적절하게 유지되는 것과 적절한 시기에 객체가 제거되는 것을 보장합니다.

당신의 커스텀 객체를 다룰 때 되돌리기 기능이 어떻게 동작할 것인가 고려해 보십시오. 되돌리기 기능을 지원한다는 것은 당신의 객체가 바꾼 것을 깨끗하게 되돌린다는 것을 의미합니다. 만약 당신의 객체가 복잡한 로직을 포함한다면, 당신은 되돌리기 쉽도록 하는 것을 고려해야 합니다. 아래에 당신의 객체에 되돌리기 기능을 구현하기 쉽도록 하는 팁들이 있습니다.

-          대칭이 되도록 메소드들을 구현 하십시오. 예를 들어, 아이템을 더하는 메소드를 구현하면 아이템을 빼는 매소드도 같이 구현하세요

-          멤버 변수의 값을 바꾸는 코드를 동작 로직에서 제거하십시오.

-          많은 단계를 거치는 액션의 경우에는 NSUndoManager 객체를 사용하여 단계를 통합하도록 하십시오.

 

되돌기리 기능을 제공하는 방법에 대한 더 많은 정보를 얻고 싶으면 “Undo Architecture”를 참고하세요.



Defining a Structured Data Model Using Core Data.
Core Data는 객체를 영구적으로 저장할 수 있도록 해주는 프레임워크 입니다. Core Data는 MVC디자인패턴에서 model data를 파일로 영구 저장하고 다시 읽어 들일 수 있도록 해줍니다. 이것은 아카이빙과(“Archives and Serializations Programming Guide를 보세요) 비슷하지만 더 많은 기능을 제공 합니다.

-          Core Data는 모델 객체의 모든 변화를 관리하기 위한 인프라스트럭쳐 입니다. Core Data undo(되돌리기), redo(되돌긴거 취소하기) 기능을 제공하며, 객체들의 상호관계를 유지하도록 지원해 줍니다.

-          코어데이터는 언제든지 메모리 내에 있는 모델 객체의 일부분을 유지할 수 있도록 해줍니다. 이것은 iOS 앱에서 굉장히 중요합니다.

-          코어데이터는 모델 객체의 구조를 표현하는데에 사용됩니다. 당신의 모델 클래스의 주요 기능과 그 관계에 대해서 GUI 기반의 편집기를 통하여 정의 할 수 있습니다. 이는 기본값과 값의 범위 등을 설정 등을 포함아여 강력한 기능을 무료로 사용할 수 있도록 제공합니다.

-          코어데이터는 당신의 객체를 수정한 것에 대하여 분리된 상태로 유지할 수 있습니다. 이는 당신이 원한다면 유용하게 쓰일 수 있씁니다. 예를 들어, 사용자가 하나의 뷰에서 수정을 해도, 다른 뷰에서는 수정한 것의 영향을 주지 않게 할 수 있습니다.

-          또한 데이터의 버져닝과 마이그레이션을 지원합니다. 이 기능은 예전 데이터를 현재의 버전으로 업그레이드를 하기 쉽게 도와 줍니다.

-          데이터를 iCloud에 쉽게 저장할 수 있도록 해주며, 다양한 디스바이스에서 접근 할 수 있도록 해줍니다.

 

Core Data 에 대한 자세한 정보는 “Core Data Programming Guide”를 참고 하세요


Defining a Document-Based Data Model
Document-based 데이터 모델은 디스크에 파일을 저장할 수 있는 편리한 방법입니다. 이 타입의 데이터 모델에서는, 당신은 디스크상의 하나의 파일(또는 하나의 파일 패키지)에 구성되어있는 도큐먼트 객체를 사용합니다. 그 도큐먼트 객체는 파일에 읽기 쓰기에 대해 반응하는 것이 가능하며, 도큐먼트 컨텐츠를 화면에 보여줄 수 있도록 뷰 컨트롤러들과 동작할 수 있습니다. 도큐먼트 객체의 원래 사용목적은 사용자 데이터를 포함한 파일을 관리하는 것입니다. 예를 들어, 앱은 각각의 도큐먼트 객체가 각각의 텍스트 파일을 관리하기 위하여 텍스트 파일들을 만듭니다. 그러나 당신은 도큐먼트 객체를 보호하여야 할 앱 데이터를 파일로 저장할 때도 사용할 수 있습니다.

그림 2-2는 도큐먼트, 파일, 객체 간의 관계를 보여줍니다. 예외 없이 각각의 document는 다른 document와 직접적으로 연결되지 않습니다. 도큐먼트는 하나의 파일(또는 파일 패키지)를 관리하며, 파일 내부의 데이터를 메모리와 연결하는 역할을 합니다. 왜냐하면 파일 내부의 컨텐츠는 유일하고, 각가의 도큐먼트에 연관된 데이터 구조도 유일하기 때문입니다. 

UIDocument 클래스를 사용하여 당신의 iOS 앱에 도큐먼트 객체를 구현하십시오. 이 클래스는 도큐먼트의 측면에서 파일 관리에 필요한 기본 기반을 제공할 것입니다. UIDocument가 가지는 다른 장점들은 아래와 같습니다.
- 적당한 시점에 도큐먼트 컨텐츠가 자동으로 저장되도록 지원한다.
- iCloud에 저장된 도큐먼트들을 관리할 할 수 있습니다. 버전 충돌을 위한 방법도 제공합니다.
- 되돌리기 기능을 제공합니다.

UIDocumet를 이용한 다큐먼트 기반의 앱을 구현해야 하는지 알고 싶다면  “Document-Based App Programming Guide for iOS”를 보세요. 


Integrating iCloud Support Into Your App
데이터를 저장하는 방법과 관계 없이 iCloud는 사용자의 모든 단말에서 데이터를 사용할 수 있게 만드는 가장 좋은 방법입니다. 데이터를 앱의 샌드박스 디렉토르에 저장하는 것 대신 사용자 iCloud저장소에 저장 할 수 있습니다.  그런데 주의할 점은 아이클라우드에 저장하게 되면 파일에 대한 멀티플 엑세스가 가능해지기 때문에 추가의 작업이 필요합니다.
- Document 기반의 앱은 UIDocument 클래스를 통해 iCloud에 접근 할 수 있습니다. UIDocument클래스를 이용하면 iCloud 기반의 파일을 다룰 때 복잡한 인터랙션을 쉽게 다룰 수 있습니다.
- Core Data 를 사용한 앱 또한 Core Data Framework를 이용하면 자동으로 사용자의 모든 단말계정에 데이터를 저장하고 관리 할 수 있습니다.
- 만약 파일 관리를 위하여 커스텀 데이터모델을 구현한다면, 파일이 변경된 것과, 사용자의 다른 기기에 변경된 점을 반영하기 위하여 file presenter와 file coordinator를 사용할 수 있습니다.
- 설정 또는 자주 변경되지 않는 데이트를 공유하고 싶다면, NSUbiquitousKeyValueStore 객체를 사용할 수 있습니다. 이 객체는 문자열, 숫자, 날짜 등 간단한 데이터를 공유할 수 있게 해줍니다.

iCloud를 지원하는 앱을 만들기 위한 더 많은 정보는 “iCloud Design Guide”를 읽어보세요




후아~ 힘드네용+_+ !!!

번역하느라 고생하신 낭만떡대님께 다시 한 번 진심으로 감사의 말씀 전합니다 :)

by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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





Posted by yagom

댓글을 달아 주세요

  1. 낭만떡대 2012.12.26 16:52  댓글주소  수정/삭제  댓글쓰기

    방해가 안되었다면.. 다행입니다..
    한번해보니.. 정말 힘들더라구요.. (작업하면서 야곰님의 노력에 감탄만 계속했네요..)
    해보면서 많이 배웠습니다. 감사합니다.

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

      무슨말씀을요~!
      정말 큰 힘이 되죠:)
      제가 늦게 올리게 되어서 죄송할 따름입니다 ㅠㅠ
      도와주셔서 정말 고맙습니다 !!
      앞으로도 도와주실거죠?ㅎ

  2. hyung 2012.12.27 12:35  댓글주소  수정/삭제  댓글쓰기

    두분이서 하셔서 그런지 오늘은 양이 많군요!
    영어에 젬병인 저 같은 사람에겐 정말 감사할 따름입니다
    낭만떡대 님께도 감사하다고 전해 드리고 싶네요!

  3. kimsdn 2012.12.28 13:32  댓글주소  수정/삭제  댓글쓰기

    오랜만에 들렀는데 업데이트 글이 있어서 댓글남겨요~
    항상 좋은 글 감사드립니다~
    연말 잘보내세요~

  4. 레스 2013.01.28 18:17  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다 ^-^ 아이폰 앱 개발을 공부하는데 많은 도움이 되었네요

  5. 심홍철 2013.06.14 19:12  댓글주소  수정/삭제  댓글쓰기

    읽으면서 이해하는 것도 힘든데 그보다 더 힘든 작업을 해주셔서 감사합니다~!!

    매번 와서 정말 잘보고 갑니다^_^


오늘의 주제

1. 계산기 기능 넣기
2. 메모장 화면 구성 바꾸기



쉰 한 번째 시간입니다.^^

지난 번에 만들어 놓은 계산기 아직 잘 갖고 계신가요?ㅎㅎㅎ
이제 계산기 로직을 완성해 볼 차례입니다.

아............. 지금 제가 글을 쓰고 있는 이 시간은 아직 훈련소에 가기 전이지만, 전 지금 훈련소에서 뒹굴고 있겠군요 ㅋㅋㅋㅋㅋㅋㅋㅋ

뭐, 응원의 한마디...는 볼 수 없겠지만 무탈히 돌아오도록 기도해주세요 ㅋㅋㅋㅋㅋ

2일 전인데 한달이라도 막상 가려니까 싱숭생숭 하네요 ㅋㅋㅋ

아마 들어가기 전까지도 계속 블로그 포스팅 예약을 하다 갈거 같은..ㅋㅋㅋㅋㅋㅋㅋㅋ

뭐 여튼 사설은 각설하고 시작해 봅니다~~~~~~~~~~~~~


# 계산기 기능 완성하기

일단, 지난번에 구현파일에 만들어 주었던 enum을 헤더로 옮겨옵니다. 거기에 FUNC_INVALID도 추가해줬어요 ㅎ

그리고 아래 interface에 enum 변수 하나를 만들어 주었구요~

enum이 뭔지 잘 모르겠다 하시는 분들은
2012/05/24 - [C] - C <20>. enum 

을 참고해 주세요 ㅎㅎㅎ


자, 이제 다시 구현파일로 넘어와서~

일단, 변수 초기화를 따로 메소드로 빼주었습니다. 왜냐면 2번 이상은 사용할 것 같거든요 ㅎㅎㅎ C버튼 눌렀을 때랑, 처음 viewDidLoad되었을 때. 생각난김에 메소드로 빼주고 viewDidLoad에서 호출도 해 줍니다.


자, 그리고 화면에 숫자를 출력해 줄만한 메소드도 하나 따로 빼줍니다 ㅎㅎㅎ


자, 그리고 이제 계산을 해 줄 메소드를 하나 만들어 줍니다. 아마도 = 버튼을 눌렀을 때 요녀석이 실행이 되겠죠?ㅎㅎㅎ
(현재 로직은 약간 틀린 부분이 있습니다만, 아래쪽에서 조금 수정을 해 줄거예요. 일단 요렇게 작성해 주세요..ㅎㅎㅎ)


자, 그리고 숫자 버튼을 눌렀을 때 동작할 메소드를 채워넣어 줍니다.


자, 그리고 기능키를 눌렀을 때 어떻게 동작할지를 버튼과 연결된 메소드에 채워넣어 줍니다 ㅎㅎ
switch문이 아직도 헷갈리는 분들은
2011/12/14 - [C] - C <7>. 조건문(2) switch 
참고 해 주시면 좋을 것 같네요 ㅎㅎ 


자, 그리고 나서 실행 해 봅니다. command + R
어때요 ㅎㅎㅎ 잘 동작하나요?
이것저것 해보다 보면 뭔가 약간 안맞는게 있습니다...ㅎㅎㅎ
네......그렇죠 ㅎㅎㅎ
2 + 3 하고 = 을 누르면 5가 나옵니다.
그리고 또다시 = 을 누르면 8이 나와야 하는데 7이 나올거예요... 흐음... 로직에 문제가 있다!!!!!!!!!!!! (제가 새벽에 정신이 혼미한 상태로 하다보니...)ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

그래서 수정해 줬습니다.
헤더파일에 와서 새로운 flag 변수를 하나 만들어 주었구요~


구현파일에 와서 약간의 조건을 추가해 줍니다. 기존에 변수에 저장하던 값들도 살짝 바꿔줬구요.


그리고 계산부분의 변수들도 살짝 바꿔줬습니다 ㅎㅎ



자, 그리고 다시 실행!!!!!!

어떠세요? 잘 동작하나요?

제가 계산기를 잘 안써봐서 로직을 생각해 보려고 한참 쑈를 했었더랬죠... 계산기 한 번만 켜서 해보면 되는것을...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

여튼 뭐 이렇게 초간단 계산기가 완성되었습니다~!

가로 모드로 바꾸면 공학용 계산기가 나오게도 해보고 싶었으나... 시간이 없는 관계로(낼모레 입소... 'ㅁ') 메모장으로 넘어가 볼게요 ㅋㅋㅋ



# 메모장 화면구성 변경

지난번에 메모장 화면도 조금 만들어 놨었는데요, 살짝만 바꾸도록 합니다 ㅎㅎ


다들 그림만 보고 이해는 하셨으리라 믿습니다 ㅎㅎㅎ

자, 이제 본격적으로 메모장 구현은?

다음 포스팅에......ㅋㅋㅋ



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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






Posted by yagom

댓글을 달아 주세요

  1. 스테디셀러 2012.09.19 16:12  댓글주소  수정/삭제  댓글쓰기

    잘 보고있습니다 :) 그런데 소숫점 처리는 어떻게 해야 할까요?

  2. 컴맹 2012.09.24 18:53  댓글주소  수정/삭제  댓글쓰기

    와~ 정말 잘 됩니다.^^
    정수와 소숫점자리 처리 모두 잘되구, 사칙연산 이상없이 계산 잘됩니다.ㅎㅎ
    오늘도 정말 많이 배우고 갑니다.~^^
    지금쯤 고생이 많겠네요.ㅠㅠ
    그래도 24일이니까 일주일만 참으세요.ㅎㅎ
    복귀하면 치킨에 맥주라도 한잔?? ㅎㅎ (당연히 제가 살께요.^^)

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

      므하하
      건강하게 잘 돌아왔습니다~!
      치맥 사주신다면야!
      정중히 흡입하겠습니다 ㅎㅎㅎ
      신나네용~~~~~~~으히히

  3. 마스터 2012.11.19 21:36  댓글주소  수정/삭제  댓글쓰기

    이거 [self setNumberLable:resultValue];
    랑 [self setNumverLavle:currentInputValue];
    에서 오류 나네요

  4. 시우아빠 2012.11.20 22:46  댓글주소  수정/삭제  댓글쓰기

    11월 초 부터해서 51번 강의까지 다 끝났네요~
    메모장은 아무래도 시간이 안되셔서 여기서 마무리 하신거 같아서 아직 부족한게 많지만
    저도 기초 강좌는 여기서 마무리하고 본업인 게임쪽으로 넘어가려고 합니다.
    앞으로하시는 다른 강의도 열심히 보겠지만
    우선은 지금까지 강의를 통해서 도움을 많이 받았기에 인사를 한번 드려야 할거 같아서요^^
    자기 시간 쪼개서 이렇게 공개강좌를 한다는 쉬운일이 아닐텐데 공익을 위해서 이렇게 노력해주셔서
    저같은 사람들은 얼마나 도움이 많이되는지 모릅니다.
    책을 통해서도 배울수 있지만 이렇게 게시판을 통한 강의도 나름대로 특수성이 있고
    특히 Yagom님의 강의 경우에는 쉽게 이해할수 있는 말로 많이 풀어 써 주셔서 이해도 쏙쏙 잘되고 여기까지 쉼없이 달려 올 수 있었던거 같습니다.
    다시 한번 감사의 말씀 드리고 앞으로도 좋은 강의 많이 부탁드리겠습니다.^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.21 20:38 신고  댓글주소  수정/삭제

      이렇게 좋은 덧글 남겨주셔서 저도 정말 영광입니다.
      앞으로도 종종 들러서 글도 남겨 주세요^^*
      정말 고맙습니다!

  5. Favicon of https://ahnfilm.tistory.com BlogIcon AhnFilms 2012.11.23 10:31 신고  댓글주소  수정/삭제  댓글쓰기

    메모장 포스팅 기다리겠습니다 그리고 항상 잘 보고 있습니다

  6. 김민국 2013.01.22 23:31  댓글주소  수정/삭제  댓글쓰기

    7번강의까지 보고 마지막엔 뭘하나 볼려고 봤는데
    정말 좋은 강의 포스팅 해주셔서 감사해요^^

    혹시 프로젝트의 기획 설계와 구현
    이런 전체적인 것을
    따라하면서 배울수잇는 강의를 하실생각은없으신가요?^^ㅋㅋㅋ
    무지 힘든강의겠군요..ㅜㅜㅋㅋㅋ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.01.23 09:39 신고  댓글주소  수정/삭제

      안녕하세요, 이렇게 덧글 주셔서 정말 고맙습니다 :)

      음... 그것은 프로젝트 성격과 앱 스타일에 따라서 변동이 많은 부분이라 쉽사리 딱 이게 좋은 방법이다 하기에는 무리가 있을 것 같아요^^;

  7. 마스터 2013.01.26 19:24  댓글주소  수정/삭제  댓글쓰기

    야곰님 배터리 용량을 가져오는 매소드 같은건 없나요?

  8. 안녕하세요 2013.03.31 23:09  댓글주소  수정/삭제  댓글쓰기

    항상 이 블로그에서 많은 자료를 얻는거 같아 기쁨니다ㅎㅎㅎ
    하나 물어볼게 있는데, 이전에 띄어논 AlertView를 어떤 변화(타이머 종료, 로딩 종료 등)가 있으면 사라지게 하는 방법도 있나요? 메소드가 있을거 같은데 아무리 찾아도 없네요 ㅜㅜ

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

      안녕하세요 :)
      어떤 변화가 감지되는 시점에서 alertView를 dismiss 시켜주시면 됩니다.
      :) 추가적으로 더 궁금하신게 있다면 말씀해 주세요

  9. devtest 2013.07.11 13:20  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님 오늘 또 왔네요ㅎㅎ
    혹시 xcode를 이용해서 콤보박스를 만들 수는 없을까요?
    아무리 생각해도 만들 방법을 모르겟네요ㅜㅜ

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

      콤보 박스보다는 아무래도 picker view가 많이 사용되지요...^^

      굳이 콤보박스를 구현해야 한다면 오픈 라이브러리들을 사용해 보셔야 할 것 같습니다 ㅎㅎ

      https://www.cocoacontrols.com/search?utf8=%E2%9C%93&q=combo

  10. 하이앟 2013.09.30 23:00  댓글주소  수정/삭제  댓글쓰기

    좋은 강좌 정말 감사합니다~^^
    무지 많은 도움 받고있어요.
    그런데..ㅎㅎ메모장 구현은 언제쯤?*^^*~기다리고 있을게염~><

  11. 키르미느 2013.10.15 02:50  댓글주소  수정/삭제  댓글쓰기

    야곰님 여쭤볼게 있는데
    제가 네비게이션 기반 실습을 해 보려고 한느데
    첫 화면을 SNS같은 일반 로그인창으로 만들어서 로그인을 하면 로그인된 첫 화면으로 갈텐데
    네비게이션 바가 달려 있어서 다시 백 버튼을 누르면 아이디 및 패스워드 (로그인창)창으로 다시 갈텐데
    로그인된 첫화면에 네비게이션 바를 없애는 게 맞을까요? 로그인 시 아예 다른 뷰를 생성하는 게 맞는 건가요?

    혹시 전자가 맞다면 네비게이션 바, 즉 백버튼 사라지게 하는 건 어떻게 하는 건가요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.10.15 11:24 신고  댓글주소  수정/삭제

      안녕하세요 :)

      때에 따라 두 가지 방법 중에 선택해서 사용합니다.

      주로 로그인 화면은 모달로 많이 띄우기도 하지만 네비게이션으로 처리할 수도 있습니다.

      네비게이션 프로퍼티 중에 navigationBarHidden 이라는 프로퍼티 값을 NO로 설정해 주시면 네비게이션바가 보이지 않습니다 :)

  12. 키르미느 2013.10.16 12:25  댓글주소  수정/삭제  댓글쓰기

    그런데 로그인 화면을 모달로 띄우라고 하셨는데 자세히 알 수 없을까요 소스라도 ㅠㅠ

    두 번째 질문!! ios 7에 xib 파일은 main story 보드로 통합 된 듯?? ㅠㅠㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.10.16 18:14 신고  댓글주소  수정/삭제

      ^^;; 로그인화면 샘플코드는 검색하셔도 종종 나올 것 같구요, iOS 7에서는 기본적으로 스토리보드가 생성됩니다. 수동으로 xib를 사용할 수도 있구요.

      모달로 띄우는 방법은 UIViewController 클래스의
      - (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
      메소드를 참고해 보세요~

  13. 으앙 2013.11.06 22:07  댓글주소  수정/삭제  댓글쓰기

    레이블에 숫자표시가 안되네요 ㅠ


오늘의 Tip

1. 스토리보드가 xml로 나올 때 스토리보드 화면으로 나오도록 열기


# 스토리보드야 나와줘!!!

으히히, 가끔 스토리보드 기반으로 작업하다보면 xCode가 멍때리는지 스토리보드가 아닌 xml문서로 열리는 경우가 가끔 생깁니다.
아래 화면처럼요.


자, 그럼 스토리보드로 열어 봅시다.
이렇게요 ㅎㅎ .storyboard파일에서 우클릭 또는 ctrl 클릭 하면 팝업메뉴가 나오죠. 거기서 Open As - Interface Builder를 선택해 줍니다.



짜잔~~~~~~~~~~~~~~~~~



초간단 팁 끝~~~~~~~~~

by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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


Posted by yagom

댓글을 달아 주세요

  1. 허니 2012.09.18 03:53  댓글주소  수정/삭제  댓글쓰기

    항상 재밌는 내용 감사합니다 날씨가 추워졌네요 건강조심하세요 :)

  2. Favicon of https://winplz.tistory.com BlogIcon 윈플. 2012.10.10 17:46 신고  댓글주소  수정/삭제  댓글쓰기

    드디어 스토리보드에 손을 대시기 시작하셨군요!!
    써보시면 생각보다 편하시다고 느끼실겁니다 ㅋㅋ( 물론 적응한 후에.. )
    스토리보드 사용할 때 가끔씩 저렇게 되긴 하는데 ㅎㅎ
    반대로 Open As 에서 Source Code 로 들어가면 XML로 보실 수 있습니다

  3. 시우아빠 2012.11.20 17:05  댓글주소  수정/삭제  댓글쓰기

    ^^ 정말 간단하지만 유용한 정보네요~
    저런거 때문에 무한 삽질로 프로젝트 다시 만들고 할때도 있을거 같은데
    깨알같지만 유용한 Tip 잘보고 갑니다.


오늘의 주제

1. 실전 프로젝트 생성



벌써 쉰 번째 시간입니다.^^

많이도 써왔나 보네요...ㅎㅎ
벌써 오십번 째 글이라니 +_+

이거 한 편 쓰는데 시간이 얼마나 오래걸리는지 여러분들을 모르실거예요..ㅋㅋㅋㅋㅋㅋㅋ

이제 실전 프로젝트(?) 라고 하기는 좀 그렇지만 예제 앱을 하나 만들어 볼까해요.
물론 저는 디자인을 하지 못하기 때문에 그냥 있는 그대로의 녀석들을 쓰겠지만 말예요..ㅎㅎ

간단한 계산기랑 메모장(?) 정도를 만들어 볼까해요.
단순히 감을 익히는데에는 큰 무리가 없을 것이라고 봅니다.

스토리보드를 원하는 분들이 많이 계셔서, 간단한 앱이기도 하니까 스토리보드와 ARC를 사용하여 진행하도록 하겠습니다.

iOS5.1 Xcode 4.3.3 기준입니다.

오늘의 간단 결과물입니다.
미리보기 +_+ㅋㅋㅋ


한 번 출발해 봅니다 ㅎㅎ

# 프로젝트 생성

우리는 두 개의 탭을 가진 탭바 기반 어플리케이션을 만들거예요.


스토리보드와 ARC사용에 체크를 했구요~



# 화면구성하기

짜잔~ 제 포스팅에서 처음으로 스토리보드가 등장을 했군요..ㅎㅎㅎ
저는 좀 구식이라 스토리보드는 저도 아직 잘 사용할 줄 모릅니다 ㅎㅎ 
눈에 보여서 편하긴 한데, 그만큼 뭔가 댓가가 있겠죠?ㅎㅎ 여튼 잡소리는 그만하고, 계속 가 봅니다 ㅋㅋㅋㅋㅋㅋ 


자, 일단 First View는 계산기로 사용하려고 해요.

뷰 속성에 들어가서 배경색을 그럴싸하게 좀 바꿔주고~ (그래봐야... 뭐... 쩝..ㅋㅋㅋㅋㅋㅋㅋ 그래도 기본만으로 뭔가 할 수 있게 해준 애플의 디자인 센스는 좋습니다ㅋㅋ)


First View라고 써있던 라벨의 위치와 크기를 적절히 조절해주고 오른쪽 정렬~ 그리고 0으로 세팅해줍니다 ㅎ


자, 그리고 뭔가 계산기처럼 그럴싸하게 버튼들을 넣어주세요 ㅋㅋㅋ


그리고 어시스턴스 모드로 전환해서 아울렛 연결하는 방법 다들 아시죠?ㅎㅎㅎ
오른쪽 버튼 드래그 또는 컨트롤 키 누르면서 드래그!!
라벨의 property 생성해 줍니다~
요게 잘 이해가 안되신다면?
2012/04/03 - [iOS Dev/깨알 Tips] - Xcode4 xib의 객체 소스파일과 쉽게 연결하기

를 참고하시면 되겠습니다 ㅎㅎ


그리고 두번째 탭에 있던 뷰도 텍스트뷰 하나 올려주시고, 버튼 두개 올려서 아울렛이랑 액션 연결 해 주세용~ 


자. 이거 좀 헷갈리실 수 있는데, 0부터 9까지 한 메소드에 연결을 할 거예요.
0에서 액션을 하나 생성해 주시고, 1~9까지 같은 메소드 자리로 연결하시면 됩니다. 자세한 설명은 그림에~! 
점(.)을 포함한 기능키들은 아래에서 또 따로 해줄거예요~ 



자, 기능키들도 하나의 액션 메소드에 연결해 줍니다. 방법은 동일해요~


자, 그리고 버튼마다 태그를 지정해 줍니다.
0번 버튼은 0
1번 버튼은 1...
9번까지 태그를 지정해 줍니다. 



그리고 기능버튼들도 마찬가지 입니다.

 
+ : 100, - : 101, * : 102, / : 103, C : 104, = : 105, . : 106


자, 이렇게 106번까지요 ㅎ


자, 이렇게 화면구성은 대강 마무리 된 것 같군요~

그럼 계산기로 사용될 FirstViewController에 와서 코딩을 좀 해봅시다 ㅎㅎ
일단 사용하여야 할 변수들을 선언해 주시구요.
추후에 수정하였는데 CGFloat이 아니라 double로 선언해주세요!!! 꼭이요!!!



아까 태그달았던 버튼들 나중에 번호 헷갈릴게 분명합니다.
벌써부터 헷갈리는데요?ㅎㅎ
enum을 사용하여 우리가 알아보기 쉽게 만들어 줍시다.

내려와서...
변수 초기화 잊지 말아주시구요 :)
숫자 버튼을 눌렀을 때 동작하는 메소드 부분을 구현해 봅시다.
자세한 설명은 역시나 주석에 ^^*

추가적으로 설명하지 않은 것은 pow라는 녀석인데,
pow( x, y )라고 해주면 x의 y제곱을 구해주는 함수입니다. ㅎ

그리고 또! %.0lf,  %lf 등이 무슨말인지 잘 모르겠다 하시는 분들은 아래 포스팅을 참고하세요ㅎㅎ
 
2011/12/05 - [Objective-C] - Objective C <4>. 실수 표현 방법
2011/12/03 - [Objective-C] - Objective C <3>. 변수. Variable



자... 여기까지 작성하고 한 번 실행해 보세요~

화면에 숫자가 제대로 표시되나요?ㅎㅎ

아 물론 소수점이 찍히는 기능키는 코딩하지 않았기 때문에 동작을 하지 않지요 ^^ 

자, 오늘은 여기까지 해볼게요...ㅎㅎㅎ

신나지 않나요?

물론 전 지금 훈련소에서 뒹굴고 있겠죠...ㅋㅋㅋ

어차피 포스팅은 예약 되어 있으니까 다음에 또 뵙도록 해용 >_<



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 컴맹 2012.09.24 17:22  댓글주소  수정/삭제  댓글쓰기

    오~~ 드디어 스토리보드도 하시는군요.ㅎㅎ
    스토리보드도 관심은 있지만, 기본 UI 도 사용법이 서툴기 때문에 접근을 못했었는데.^^
    그런데 현재 소스상으로는 positionNum값이 0미만일 경우가 없기때문에 else문은 실행이 되지 않겠네요. (소숫점 버튼에 대한 처리가 없기때문에...^^;)
    뭐, 다음강좌에서는 0미만일경우가 처리가 되어 else문이 사용되겠죠.
    좋은 강좌 잘보고 갑니다.~~~^^

  2. 21 2012.11.10 01:31  댓글주소  수정/삭제  댓글쓰기

    저.... 야곰님 질문이 잇는데여 ㅎㅎ
    탭바 기반에서 탭바가 안보이도록 할순없나요ㅜ..?

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

      안녕하세요 21님~!
      방문해 주셔서 고맙습니다 :)
      음... 탭바 기반에서 탭바가 안보이게 하려고 하신다구요^^;
      처음부터 탭바 기반으로 작성하지 않는 방법이 있지만...
      탭바가 있는 상태에서 탭바를 안보이게 하려면 setHidden 메소드를 이용하시면 될 것 같은데요~^^
      탭바 이름이 tabBar라면
      [tabBar setHidden:YES];
      이런식으로요~^^

  3. 시우아빠 2012.11.20 16:19  댓글주소  수정/삭제  댓글쓰기

    드디어 실전이군요 ^^ 이제 곧 마무리네요~

  4. 117 2013.07.24 01:37  댓글주소  수정/삭제  댓글쓰기

    탭바에서 first나 second같이 이름써져있는거 이름은 어떻게 바꾸는 건가요ㅎㅎ?;;

  5. 2014.06.08 01:19  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다


오늘의 주제

1. 예외처리

마흔 아홉번째 시간입니다.^^

싱글턴 패턴에 대해서는 조금 익히셨나요?
그 외에도 디자인 패턴이란 것은 많이 존재합니다. 싱글턴 패턴은 아주 간단한 예에 지나지 않습니다.
디자인 패턴에 관심이 생기신다구요?
그렇다면 이제 아주 기초는 벗어나고 있다~ 라고 생각하시면 되겠습니다..ㅎㅎㅎ
물론 제가 말씀드리지 않은 것들은 정말 많지만, 저의 목표는 레퍼런스들을 나열하여 언제든 가져다 쓸 수 있는 것보다는 여러분들이 직접 원리를 알고, 개발문서를 통해 스스로 뭔가를 만들어 낼 수 있는 그런 포스팅이 되길 바라기 때문에 굳이 레퍼런스들을 다 나열하진 않았습니다.

많은 도움이 되셨는지 모르겠습니다. :)

이 기초 포스팅도 이제 막바지를 향해 달려가고 있습니다.
정말 몇 개 쓴거 같지도 않은데 이제 두어달만 있으면 일년이 되네요^^;
그동안 부족한 포스팅에 덧글도 응원도 많이 해 주신 여러분들께 진심으로 감사의 마음을 표합니다.

사설은 여기까지 하도록 하구요,

지난 포스팅에 이어 이번에도 iOS에 국한된 이야기라기 보다는 Objective-C 언어에서의 이야기를 해보려 합니다.
싱글턴도, 예외처리도 코코아 터치 프레임워크를 사용하는 것이라기 보다는 언어를 사용하는 테크닉 중 하나라고 볼 수 있겠지요.

오늘 포스팅은 정말 짧지만 정말 강력한 하나가 될 것이라 믿어 의심치 않습니다 ㅎㅎ

어쨌거나 저쨌거나 출발합니다~~~~~~~~~~


# @try @catch @finally

예외처리가 뭔가요???

여러분 여기까지 오면서 누구나 한 번 쯤은 Memory  Access Violation, Exception Error... 등등, 어플리케이션이 튕겨버리는 일을 겪지 않으신 분 없을겁니다.

즉, 어플리케이션이 죽어버리는... 만약 사용자가 사용하다가, 내가 사용하다가 퍽하고 강제종료 되어버리는... 이런 참사를 예방하려면 예외처리에 많은 심혈을 기울여야 하겠습니다. ㅎㅎㅎ

즉, 잘못된 처리로 인해 튕겨버릴 상황이 와도 한 번은 내가 컨트롤 해 볼 수 있는 여지를 만드는 것이 예외처리 입니다.

말로만 해서 잘 감이 안오시죠?

한 번 해봅시당 ㅎㅎ

지난 번에 사용하던 프로젝트에 그대로 적용해 보겠습니다.

싱글톤 객체에서 파일을 저장하던 메소드에 임의로 exception 에러를 발생시켜 봅니다.

NSDictionary는 Mutable이 아니기 때문에 setObject 메소드를 사용할 수 없지요. 그런데 임의로 Mutable인 것처럼 가장하여 메소드를 호출 해 봅니다.

말도 안되는 코드이긴 하지만, 실제로 종종 일어날 수 있는 일이기도 합니다. 이제 추가적으로 남은 것은 주석으로 모두 설명이 되어있습니다 ㅎㅎ

결과까지 한 화면에 나와있지요?



자, 이렇게 혹시 모를 상황에 대비하여 예외처리를 잘 사용해 주는것이 중요합니다.

이 하나의 포스팅으로 여러분의 어플리케이션이 조금 더 안정적이 되기를 희망합니다~

그럼 이만 뿅 ㅎㅎ



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 컴맹 2012.09.24 16:50  댓글주소  수정/삭제  댓글쓰기

    오늘은 짧아서 좋네요.ㅎㅎ
    짧긴하지만, 정말 중요한 명령이죠.^^
    어플이 죽지 않게 할수 있으니까요.^^;
    좋은 강좌 잘보고 갑니다.~~~

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

    실제로 저 예외처리를 공부할때는 많이 썼었는데 실제 현업에서는 잘 사용안하더라구요~
    말씀하시는대로 빨리 죽이고 크래시 핸들링을 하는게 더 나을수도 있으니까요.
    그리고 코드가 커지는 경우 유지 보수가 많이 힘들더라구요.
    하지만 중요한 코드에는 저런식으로 관리해주는게 훨씬 좋을것 같습니다.

    그런데 @finally는 왜 필요한 걸까요? 어차피 항상 실행되는 문이면 이후 진행되는 블럭하고 의미가 다르지 않을꺼 같은데
    무지한 질문이니지만 잘 몰라서 그러니 이해해 주세요^^

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.20 12:55 신고  댓글주소  수정/삭제

      실제로 현업에서도 잘들 써주시면 얼마나 좋겠습니까만... 다들 한줄 한줄 늘리기만 급급하지 귀찮아서 잘 하지를 않습니다...
      나중엔 저거 하나 안해서 몇 날 며칠을 보이지않는 버그와 싸워야 할텐데ㅜㅜ
      finally를 넣어둔 이유는 이 코드가 예외처리가 되었기에 동작하는 코드다, 즉, 이녀석이 제대로 돌아가려면 위에서 제대로된 예외 확인이 필요하다 뭐 그런뜻이 아닐까 조심스레 생각해 봅니다...ㅎ

    • 낭만떡대 2012.11.22 10:01  댓글주소  수정/삭제

      finally 가 필요한 이유는 (저도 잘 모르겠습니다만.. ㅎㅎ;; )
      보통 다른 프로그램을 예를 들면..

      DB 접속 구문
      try {
      작업;
      DB 접속 헤지
      }
      catch {
      예외 작업;
      DB 접속 헤지
      }

      이런 구문을

      DB 접속 구문
      try {
      작업;
      }
      catch {
      예외 작업;
      }
      finally {
      DB접속해지;
      }

      이렇게 try건 catch건 관계없이 반드시 실행되야 되는 코드를 넣는곳이 아닐까요 코드 양도 줄어들고.. (물론 다음 블럭에 취소 DB접속해지 구문을 넣어도 되지만 다음 구문이 없는 경우도 있고, 한 블럭에서 처리하면 논리적으로 이해가 쉽고.. 아놔 아닌가;; )

      iPhone 프로그래밍에서 보면
      지금은 ARC를 이용중이라 상관 없는 이야기지만..

      객체생성;
      try {
      각체에 어떤 작업;
      객체소멸;
      }
      catch {
      예외작업;
      객체 소멸;
      }

      이것을


      객체생성;
      try {
      각체에 어떤 작업;
      }
      catch {
      예외작업;
      }
      finally {
      객체 소멸;
      }

      이렇게 사용이 아닌가 싶은데..

      글을 쓰다보니.. 이건 아닌거 같기도 하네요..
      -_-;; ㅎㅎ;;
      힘들게 쓴거라 우선 Commit ㅎㅎ;;

      (질문에 대한 답변은 아닙니다. 무지한 사람의 의견 나눔입니다...)

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.22 10:26 신고  댓글주소  수정/삭제

      예, 떡대님 말씀이 맞습니다 ㅎㅎㅎ
      시우아버님 질문의 요지는 어차피 밑에서 실행할거면 굳이 finally를 넣을 필요가 있나... 위에서 예외처리를 끝냈다면 밑에 일반코드처럼 작성해도 되지 않느냐 였는데, 떡대님이 더 좋은 보충설명을 넣어주셨네요 ㅎ
      고맙습니다 ㅎ

    • 낭만떡대 2012.11.22 10:42  댓글주소  수정/삭제

      흠... 다시 생각해보니... 제가 질문을 잘못 이해했군요 ㅋㅋ;; 죄송합니다. ㅋㅋ;;

    • 낭만떡대 2012.11.22 11:05  댓글주소  수정/삭제

      그냥 코드를 명확하게 한다. 정도 뿐이 안되겠네요 지금까지 고민하고 있었음.. ㅋㅋ;;


오늘의 주제

1. Singleton 패턴 사용해 보기


마흔 여덟 번째 시간입니다.^^

지난 번에 이어서 싱글턴 패턴 사용 방법에 대해 알아보도록해요 ㅎ

일단... 뭐... ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
지금 여러분들이 이 포스팅을 보고계신 시간이면 저는 논산 훈련소에 있겠네요~ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아이 좋아.............는 개뿔......
면회 환영합니다..............는 개뿔.........ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

여튼 오늘부터는 한달동안 제가 덧글을 달아드릴 수 없게되었군요...ㅠ_ㅠ

몸 건강히 돌아오겠습니다.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

한 달 캠프 으쌰~

자 잡소리 때려치고~

스따뚜~~~~~~~~~~~~


# 싱글톤 객체 활용

이제 싱글톤 객체를 사용하기 위해, 헤더를 import해 옵니다.

그리고 원래 있던 메소드는 깔쌈히 지워주시고 싱글톤 객체 안에 구현해놓은 녀석들을 사용하기 위해 예쁘게 작성합니다 호호호


불러오기도 마찬가지로 예쁘게 바꿔줍니다~


자, 그리고 파일로 읽고 쓰는 것 대신 싱글톤 객체에만 세팅하고 가져오는 기능도 따로 만들어주기 위하여 이렇게 또 버튼을 만들고 메소드를 만들어 줍니다~


자 이렇게 간단히 메소드 구현을 마쳐주시구요~~~~~~~



SecondViewController로 넘어와 봅니다~ 여기도 위와 똑같이 작성해 주시면 됩니당 ㅎㅎ



그리고 생각해보니 화면전환 기능을 안 넣어줬군요.....

훈련소의 압박으로 정신머리가 좀 나갔습니다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

ViewController로 와서 화면전환을 위한 버튼을 만들어주고 연결 해 줍니다~ 



자, 그리고 이렇게 깔쌈하게 두줄로 완성~


그리고 다시 돌아올 방법도 만들어줘야겠죠?ㅋㅋㅋ
이렇게 연결해 줍니다. 


그리고 이렇게 한줄로 구현 끝~!


자, 실행 해 봅니다~
뭔가 되나용?ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


어!? 그런데..... 아오....... 이놈의 키보드때문에 뭐가 안되는구만요...ㅠㅠㅠ


키보드놈을 없애봅시다~!

각각버튼을 누르고 나면 키보드를 사라지게 하는 마술을 심어줍니다 ㅎㅎㅎ 


그러고나서 이리저리 왔다갔다 하면서 어떻게 동작을 하는지 확인해 보세요~ 예상했던 것과 같은 동작들을 하는가 잘 살펴보세요 ㅎㅎㅎ



자... 이처럼 싱글턴 객체는 한 번 생성되면 메모리에 계속 상주하면서 데이터를 지니고 있게 됩니다.

어떤 곳에서도 그 한 객체를 불러내서 쓸 수 있는거죠~

재미있는녀석이죠?ㅎ 

 
잘 활용하면 득이되고, 잘못 활용하면 독이되는 녀석이기도 합니다.

뭐..... 제가 매번 이런말을 하는 것 같긴 하네요 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

자, 그럼 이만 뿅~!


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 궁금궁금 2012.08.31 17:18  댓글주소  수정/삭제  댓글쓰기

    함께해보기에 있는 48개의 글 목록을 한 번에 볼 수 있는 방법이 있나용...???

  2. 승준 2012.09.04 09:58  댓글주소  수정/삭제  댓글쓰기

    몸건강히 훈련 잘 받고 오세요!~

    그동안 포스트 반복 학습하며 다음 글을 기다리고 있을께요

  3. 컴맹 2012.09.16 06:18  댓글주소  수정/삭제  댓글쓰기

    아~ 지금쯤 고생이 많겠네요.ㅠㅠ
    오늘도 좋은강좌 잘보고 갑니다.~

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

    이제 이곳에 덧글을 남겨야 겠네요^^
    오늘도 좋은 강좌 잘 보고 갑니다.

  5. 낭만떡대 2012.11.22 09:38  댓글주소  수정/삭제  댓글쓰기

    병특이셨군요 ㅋㅋㅋ

    반갑습니다 동지 ㅋㅋ

    전 얼마전에 끝났는데 모두~ ㅎㅎ

    질문. 1.

    공통으로 접근하는 싱글톤 객체를 만들고 prefix 에 import 하고 사용하는 것에 대해
    보안상 이슈는 없는지 궁굼하네요 보통 그렇게들 쓰시나요? (로그인 정보나 기타 중요정보.)

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.22 10:24 신고  댓글주소  수정/삭제

      아... 부럽습니다 ㅠ_ㅠ 어디서 근무하셨나요 ㅋㅋ
      질문에 대한 답변으로는 각각의 테크닉이 많이 존재하기 때문에, 앱이 어떤 정책을 가지고 운영(?) 되느냐에 따른 문제인 것 같네요.
      로그인 정보 등 중요정보에 대한 저장방법은 검색을 좀 더 해보시면 좋을 것 같아요 :)
      정말 좋은 질문 고맙습니다 ㅎ

  6. ss 2012.11.26 00:13  댓글주소  수정/삭제  댓글쓰기

    안녕하세요, ios 프로그래밍 공부하고 있는 학생인데요 ^^
    싱글톤이 필요해서 열심히 따라했는데ㅠㅠ
    저는 스토리보드에서 이걸 구현하고 싶어서요 ㅠㅠ
    똑같이 따라하고 xib파일 대신 스토리보드에서 뷰를 연결해주는 방식만 다른데 안되네요 ㅠㅠ 어떻게 하면 좋을까요

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

      스토리보드에서도 같은 방식으로 연결해 주면 되지 않나요?^^;

    • yimcold@gmail.com 2013.10.10 11:40  댓글주소  수정/삭제

      지금 댓글을 달기에 많이 늦은감이 있지만.. 저는 이런 식으로 해결했어요~
      1. 스토리보드에서 두번째 뷰컨트롤러의 Storyboard ID를 secondViewCon으로 지정해주고,

      2. 코드를
      secondViewController: (id)sender{
      SecondviewController *secondViewCon = [self.storyboard instantiateViewControllerWithIdentifier:@"secondViewCon"];
      [self presentModalViewController:secondViewCon animated:YES];
      }
      이렇게 작성하니까 되네요~ 늦었지만 비슷한 문제가 있으신 분들 참고하시라고 올려요. 제가 초보라 수정할부분 있으면 지적해주시면 감사하겠습니다.

  7. 2012.11.29 12:19  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.11.21 20:41 신고  댓글주소  수정/삭제

      안녕하세요 앱만들자님!
      이렇게 글 남겨 주셔서 정말 영광입니다.
      정말 도와드리고 싶은 마음은 굴뚝같지만 제가 그 부분에 있어서는 큰 도움을 드리지 못할 것 같아요...ㅠㅠ 현재 저의 개인적인 사정으로도 좀 벅찬 상태라서요ㅜ 죄송합니다..
      정말 진심으로 죄송합니다...ㅜ
      꼭 더 좋은 분 찾으시면 좋겠네요...
      정말 죄송합니다ㅜ

  8. 리얼왕초보 2013.06.27 13:59  댓글주소  수정/삭제  댓글쓰기

    이번 강좌는 맥부기에 없어서 여기서 봤는데
    진작에 야곰님 블로그에서 공부할껄 그랬네요 ㅠㅠ
    스크린샷한것도 크게보이고 ㅠㅠㅠㅠ
    정말 너무 많은 것을 배운 시간이었습니다~
    아무리 감사를 드려도 부족하네용~~~

  9. 리얼왕초보 2013.06.27 14:15  댓글주소  수정/삭제  댓글쓰기

    야곰님~아래 팁으로 주신 키보드 없애는 방법을
    키보드 외 화면을 터치하면 키보드가 사라지게끔~
    메서드 하나 알려주시면 안될까용?
    부탁드립니다~~

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.06.28 10:35 신고  댓글주소  수정/삭제

      http://blog.yagom.net/507
      제스쳐 인식으로 뷰에 탭 제스쳐 인식을 넣어서 특정 동작을 하게 만드시면 될 것 같습니다 :)

  10. ㄴㄴ 2013.11.09 02:37  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 강좌 잘 보고 있습니다.

    이번 강좌에서

    [singletonObj setCurrentString:inputTextField.text]

    이 부분에 대해서 자세한 설명좀 해주시면 안될까요?

    제가 서로 다른 뷰에서 간단한 숫자를 공유해서 입력하고 받아서 쓰는 코드를 구현중인데

    입력까진 되는것 같은데 다른 뷰에서 받으면 계속 0으로 나오네요;


오늘의 주제

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. 딕셔너리 형태의 객체를 파일로 쓰고 읽기


마흔 여섯 번째 시간입니다.^^

지난 두 포스팅에서는 모양새를 바꿔보는 것을 해 보았어요~
사실상 명목이었지 어쨌든 개념적인 요소가 많았지요 ㅎㅎㅎ

이번에는 파일을 읽고 써 보는 시간을 가져보도록해요 ㅎㅎ

매번 어플리케이션이 종료되면 모든것이 다 날아가 버리면 아쉽잖아요.
뭔가 저장하고 다시 가져올 수 있는 방법, 간단한 파일 쓰고 읽기를 해 보도록 합시다~

자, 그럼 시작해 볼까요?ㅎㅎ


# 파일 입출력

자, 우선 오늘도 프로젝트 하나를 만듭니다.

지난 두 프로젝트와는 달리 이 프로젝트는 3개 ~ 4개 포스팅 동안 사용하게 될 것 같네용 호호


늘 그래왔듯이 싱글 뷰 어플리케이션으로 만들어 줍니다 ㅎㅎ
 


이름은 YGFileManagement


첫 실행화면 ViewController.xib로 들어와서 이렇코롬 만들어 줍니다.
이제 이 정도는 설명하지 않아도 되리라 굳게 믿습니다 ㅋㅋㅋ 


딕셔너리 형태의 객체를 파일로 쓰고 읽는다고 했을 때 의아해 하신분들이 분명 계셨을 겁니다.

스쳐지나와서 생각 못하셨다구요?ㅎㅎㅎ

자, 우리는 파일을 plist형태로 쓰고 읽어주는 작업을 할거예요. plist...??? 어디서 들어본거 같은데???

그쵸?ㅋㅋㅋ Supporting Files에 AppName-info.plist라는 파일을 보실 수 있을거예요.

눌러보세용 ㅎㅎㅎ

그 안에 어떤식으로 구성이 되어있나요?

Key - Value 형식...!! 어!!!?? 딕셔너리네?

네~ 딕셔너리 형식으로 구성이 되어있는 것을 볼 수 있습니다.

그래서 우리는 딕셔너리를 plist로 저장하고 불러오는 것을 해 보도록 하겠습니다 ㅎㅎ


일단 저장하는 메소드를 먼저 작성해 보도록 하지요.

아까 버튼에 연결해 둔 메소드가 있지요? saveStringToFile 메소드를 정성스레 작성해 줍니다 ㅎㅎㅎ 

inputTextField에 입력해준 텍스트를 딕셔너리에 넣어서 파일로 저장하는거예요 ㅎㅎ

주로 간단한 내용들을 저장해 줄 때 Document 디렉토리 안에 저장해 줍니다. 어플리케이션 옵션을 주고 적절한 처리를 하면 iTunes에서 도큐먼트 폴더로 파일을 넣고 빼고 할 수 있는 곳이기도 하죠.

이제 이렇게 주석과 글들로 설명이 되어있는데, 이해가 안가거나 조금 더 알고싶은 메소드가 있다면 개발문서를 한 번 찾아보는 센스! 필요하겠죠?ㅎ 



자, 그리고 이번에는 파일에서 딕셔너리를 불러와서 outputLabel에 텍스트를 세팅 해 주는 메소드 입니다.


자, 그리고 실행! 우선 저장하기 전에 로드해 볼까요? 역시나 파일이 없으니 실패!!


하지만 저장하고,


다시 로드하면 이렇게 라벨에 로드가 되는군요 ㅎㅎㅎ


또 다른 글로 바꿔서 저장해보고~


다시 로드해도 잘 되네용 ㅎㅎㅎ


앱을 종료했다가 다시 실행해서 로드도 해 보세요~ 아주 잘 됩니다 ㅎㅎㅎ

물론 앱을 삭제했다가 다시 실행하면 도큐먼트 폴더 내의 데이터도 지워졌기 때문에 로드가 되지 않습니다. 


오늘은 이렇게 간단히 도큐먼트 폴더에 plist파일을 저장하고 불러오는 놀이를 해 보았습니다 ㅋㅋ

어떠셨나요? 괜찮았나요?ㅎ

물론 바이너리 데이터(예를들어 이미지 등)을 읽고 쓸 수 있는 방법도 있는데, 요청하시면 진행하도록 할게요 ㅎ

이런 간단한 예제 외에도 더 크고 복잡한 데이터들을 저장하고 불러오는 방법도 존재합니다.

역시나 배우면 배울수록 어려워지는..ㅋㅋㅋㅋㅋㅋㅋㅋㅋ

뭐 여튼 오늘은 여기까지~


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 으아~!! 2012.08.24 11:29  댓글주소  수정/삭제  댓글쓰기

    야곰님 위 내용과는 관계 없지만 질문이 있습니다~~!!!!
    연속된 이미지와 텍스트파일을 각각 uiview와 라벨에 쌍을 맞춰서 출력하고 싶습니다
    시간인터벌을 갖게 해서 출력하기 위해 nstimer를 사용하려고 하는데요. 구문을 어떻게 사용해야 할지 모르겠어요.ㅜㅜ
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(loadImageAndText) userInfo:nil repeats:YES];
    이렇게만 선언했구요. 셀렉터에서 쌍을 맞춰 출력하는 구문을 만들고 싶은데 각각 재생하는건 어렵지 않은데 쌍맞춰 하는건 .ㅜㅜ
    그리고 텍스트연속 출력은 어떻게 하나요? 이미지와 맞춰 무한 재생으로 만들었다가 버튼클릭하면 멈추게 만들고 싶은데
    구문을 어떻게 짜야하나 모르겠어요.아 빨리 알려주셨음 좋겠어요.ㅠㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.08.24 14:09 신고  댓글주소  수정/삭제

      안녕하세요 으아~!! 님 ㅋ

      음... 배열 두 개를 이용하여 자료를 저장해 두었다가 동시에 두 배열에서 같은 인덱스의 자료를 뽑아오면 되지 않을까요 ^^?

      사실 어떤 것을 원하시는지 잘 몰라서 애매하긴 하지만,

      일단 NSTimer *myTimer = [NSTimer scheduled ...

      해 주시고

      버튼을 누르면 [myTimer invalidate]; 해 주시면 멈출거예요~

  2. chosamong 2012.08.26 11:28  댓글주소  수정/삭제  댓글쓰기

    다음 버전 기대합니다. 초롱초롱
    바이너리 데이타 입출력,
    예외 처리
    파일 경로 변경 등등

    파일 입출력 넘 어려워요. ㅜ.ㅜ

    저도 낼 부터는 출근이라 폭풍 댓글 호응은 좀 더뎌질수도~
    하지만 열렬히 응원합니다.
    야곰님 파이팅 ^^;;

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.08.27 01:07 신고  댓글주소  수정/삭제

      초롱초롱 *_*ㅎㅎ
      이제 며칠 지나면 저도 한달간 덧글을 달수가 없네요 ㅎㅎㅎ
      열심히 하시는 chosamong님도 화이팅입니다 :)

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

    드디어 데이타 저장/로드도 배웠습니다.ㅎㅎ
    오늘도 좋은 강좌 잘보고 갑니다.~
    감사합니다.^^

  4. 낭만떡대 2012.11.21 17:09  댓글주소  수정/삭제  댓글쓰기

    와우!!! 간단한 데이터 저장 방법이 이런 방법이 있었군요!
    간단한 저장은 기본으로 영구 저장되는 딕셔너리 하나 있잔아요.. ㅠㅠ 기억이 안나네
    userinfo 어쩌구 하는거.. 그걸로 했었는데 이렇게 파일로 내리는것도 간단하고 좋네요!
    좋은거 얻어 갑니다.
    (맨날 맥부기에서 강좌 보다가 이쪽으러 넘어옴 ㅋㅋ 여기가 크고 좋네요 ㅎㅎ)

    이미지 데이터를 저장하는 방법도... (제가 한번 해보겠습니다! ㅎㅎ;)
    뭔가 느낌상 그냥 data로 쓰고 data로 읽어 오면 될것 같은 *.* ㅋㅋ)

    추천 꾹~!

  5. 한소쿠리더하기 2013.02.02 00:50  댓글주소  수정/삭제  댓글쓰기

    파일주소에 덧붙일 때...

    /string.plist

    에서 / 는 있어도 되는 건가요?

    안되서 구글링을 하다가 writeToFile:atomically 로 보다보니 다른 예제에는 /가 없어서 빼고 하니까 되네요. ㅎㅎ

    다른 분들은 말씀이 없으신 걸로 봐서는 제가 뭔가를 잘못했다거나 다른 분들에게는 저정도는 너무 허접한 거라서 그냥 넘어가셨다던가...일까요? ㅎㅎ

    진짜 C 프로그래밍도 한개도 모르는 상태에서 시작해서 삽질하다가 야곰님 강의 보고 많이 알아가고 있습니다. 감사합니다. ^^

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

      stringByAppendingPathComponent:

      메소드를 사용하시면 /를 입력해도 하지 않아도 상관 없습니다 :)

    • 한소쿠리더하기 2013.02.04 11:21  댓글주소  수정/삭제

      stringByAppendingFormat을 썼는데 /를 쓰면 저장이 안되고 /를 안 써야 저장이 되네요;;;

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.05 07:56 신고  댓글주소  수정/삭제

      네, 제가 저 소스를 작성할 때 무슨생각으로 그랬는지는 모르겠지만;;
      파일 경로 등을 만들어 줄 때에는
      stringByAppendingFormat 보다는 stringByAppendingPathComponent을 사용하는 것이 바람직합니다... ^^;
      더 자세한 사항은 도큐먼트를 참고하세요~

    • wowjam 2013.07.17 15:40  댓글주소  수정/삭제

      너무 오래된 리플이지만... 한소쿠리더하기님이 말씀하신 문제의 원인을 알았습니다.
      NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
      이 부분에서 NSDocumentDirectory 대신에 NSDocumentationDirectory를 쓰셨던것 같네요.
      혹시 비슷한 문제 있으신 다른 분들도 참고하세요~

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.07.17 23:09 신고  댓글주소  수정/삭제

      정말 유익한 덧글 남겨주셔서 고맙습니다 :)

  6. Royster 2013.07.17 21:39  댓글주소  수정/삭제  댓글쓰기

    오늘도 정말 유익한 시간이었습니다^^

    이미지 및 텍스트를 이용하여 일기 작성 및 저장, 불러오기를
    구현하는 예제 강의 올려주실수 있으실까요~?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.07.17 23:10 신고  댓글주소  수정/삭제

      ㅎㅎ 좋은 예제네요~!
      그런데 제가 지금은 그럴 여력이 부족할 것 같습니다 ㅠ_ㅠ
      이 포스팅을 응용해 보시면 간단한 것은 할 수 있을 거예요..
      죄송합니다 ㅠ

  7. Royster 2013.07.18 01:06  댓글주소  수정/삭제  댓글쓰기

    아 아닙니다 죄송하실게 뭐있나요~ ㅎㅎ
    응용해서 제가 직접 시도해보겠습니다^^
    앞으로도 좋은 예제 많이 올려주세요 ~~~

  8. zeroBear 2013.09.21 14:31  댓글주소  수정/삭제  댓글쓰기

    안녕하세요,
    항상 강좌 잘 보고 있습니다.
    이번 강좌에서 키보드 입력이 나왔는데요, 아무래도 키보드가 내려 가질 않아서 뭔가 아쉽더라구요.
    혼자 찾아 찾아 해결은 했는데, first responder의 개념이 잘 이해가 되지 않습니다.
    나중에 first responder에 대한 강좌를 써 주실 수 있으신가요?

    아마 이 블로그에서 강좌를 보는 다른 분들도 도움이 될 것 같아요 ^____^

  9. 루드릭 2013.11.12 00:29  댓글주소  수정/삭제  댓글쓰기

    강좌 잘 보고 있습니다. ㅎㅎ

    맥부기 까페에서 검색시에도 이상하게 야곰님이랑 겹치는 강좌들이 있길래

    누가 떼다 올리시는건가 했는데 작성자 아이디가 야곰... ㅋㅋ

    직접 올리시는거였군요. ㅎ

    다름이 아니라 질문이 하나 있는데요

    textfield에 글을 적다가 다른 뷰로 넘어갔다가 다시 와도

    아까 적어놓은 텍스트들이 남아있게 하고 싶은데

    키보드를 내리면서 어딘가에 저장을 해 두고 다른 뷰 갔다가 돌아올때

    textfield에 다시 저장을 해야될것같은데 키보드를 내릴때 어떤 메소드가 실행되게 하려니까 방법을 잘 모르겠네요 ;

    키보드를 내리는 방법은 키패드 안의 리턴버튼을 누르거나 백그라운드를 터치하면 내려가도록 해 놓았습니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.11.12 11:47 신고  댓글주소  수정/삭제

      이전에 보았던 화면을 새로 생성해서 돌아오면 당연히 새로운 객체이기 때문에 남아있지 않습니다.

      이전의 화면으로 돌아올 때에는 모달로 띄워줬다면 모달을 내려주어야 하고, 네비게이션 컨트롤러로 push 하셨다면 다시 pop해서 돌아오셔야 합니다. 그러면 다시 이전의 화면 그대로를 볼 수 있습니다.

      아마도 새로운 객체를 생성하여 다시 화면에 보여주는 방식을 사용하고 계시기 때문에 이전 화면 그대로를 보지 못하시는 것 같습니다.

      모달뷰와 네비게이션 컨트롤을 조금 더 살펴보시기 바랍니다 :)

  10. odong 2015.07.26 22:02  댓글주소  수정/삭제  댓글쓰기

    애플이 개발환경이 좋아 혼자 쓸 어플 만들려는데 좋은 참고가 되네요 감사합니다!
    (댓글이 무지 늦게(?) 달린 셈인데 야곰님 보실려나요? ㅋㅋ)

    • Favicon of https://blog.yagom.net BlogIcon yagom 2015.07.28 01:10 신고  댓글주소  수정/삭제

      안녕하세요 odong님!
      덧글 남겨주셔서 고맙습니다 :)
      좋은 참고가 되었다니 기쁩니다!
      종종 들러주고 글도 남겨주세요~!
      고맙습니다~! :D

  11. hjs9402 2017.02.08 13:13  댓글주소  수정/삭제  댓글쓰기

    안녕하세용 그런데 plist로 작성한 파일들은 앱을 종료했을때 다 삭제가 되나요?

  12. sususoo 2017.05.09 23:57  댓글주소  수정/삭제  댓글쓰기

    야곰님 정말 궁금한게 있습니다. 다운받은 ipa파일을 zip파일로 변환한후 압축을 풀어서 안에있는 plist파일이나 coderesources를 조금 수정해서 다시 압축해서 ifunbox를 이용해서 폰에 설치할 수 없나요?

    ipa파일을 zip파일로 변환한후 압축을 푼 아이들을 다시 압축해서 ifunbox를 이용해서 폰에 설치하기는 가능한데, payload폴더 안에있는 아이들을 조금이라도 건들면 설치가 되지 않습니다. 방법이 없는건가요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2017.05.10 12:06 신고  댓글주소  수정/삭제

      안녕하세요 sususoo님, 전혀 방법이 없는 것은 아니지만, 정상적이거나 좋은 방법은 아니기 때문에 따로 알려드리지는 않겠습니다 ^^; 도움을 드리지 못해 죄송합니다


오늘의 주제

1. 네비게이션 바 커스터마이징


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

지난 번에는 메소드 재정의(오버라이드)를 활용하여 UIAlertView를 커스터마이징 해 보았습니다~
어떠셨어요?ㅎ 이쁜 이미지로 커스터마이징 하니까 좀 더 산뜻해 지셨나요?ㅎ

오늘은 네비게이션 바를 커스터마이징 해 보겠습니다~

잘 응용하면 원하는 이미지나 이쁜 글도 넣을 수 있구요 :)

자 그럼 출발해 볼까요?ㅎ


# Navigation Bar Customize

자, 일단 새로운 프로젝트를 만들어 줍니다.

Single View Application이구요~


YagomCustomNaviBar라는 이름으로 만들어 주었습니다 ㅎ


그리고 우리는 커스터마이징을 할 때 이번에는 카테고리 라는 녀석을 이용할거예요~
어쨌든 일단 New File... 


Cocoa Touch - Objective-C category 라는 녀석을 선택~!


YGCustomNaviBar라고 이름짓고 Category on UINavigationBar를 작성해 줍니다~


그러면 UINavigationBar+YGCustomNaviBar 라는 희안한 이름을 가진 놈들이 뿅하고 튀어나옵니다~

카테고리로 사용하려면 클래스이름+내가 지정한 이름. 이딴식이지요?

오이잉???????? 고놈 요상하네~~~~~~

자, 그럼 여기서 카테고리란???????????

다른 언어에서는 쉽게 찾아볼 수 없는 형태로 Objective-C의 독특한 클래스 확장법이라고 생각하시면 되겠습니다.

지난번에 해보았던 오버라이드(재정의)보다는 약간 작은 개념입니다.

클래스를 상속받아 메소드를 오버라이드 하는 경우 원래 있던 메소드를 수정, 보완해 주는 형태였고, 인스턴스 변수 등등을 추가해 줄 수 있습니다.

하지만, 이 카테고리라는 녀석은 원래 클래스에다가 내가 원하는 메소드를 원래 그 클래스에서 갖고있던 녀석인 것처럼 추가해 줄 수 있는 간단하지만 강력하고 유용한 녀석입니다. 물론 메소드 오버라이드도 가능합니다. 다만, 클래스 변수 등은 선언해 줄 수 없습니다.

카테고리만 잘 이용해도 쓰임새는 무궁무진하죠 ㅎㅎㅎ

오늘은 네비게이션 바 커스터마이징으로 한 번 예를 들어 진행해 보고자 이렇게 포스팅을 하는 것입니다.

설명이 부족하다 싶으면 책이나 구글링을 통하여 찾아보셔도 좋습니다.

자, 그럼 이제 카테고리는 만들었고... 일단 네비게이션바를 보려면 네비게이션 컨트롤러가 좀 도와줘야겠죠?ㅎㅎ

AppDelegate에서 최상위 뷰 컨트롤러를 네비게이션 컨트롤러로 만들어 봅시다.
 


자, 한 번 실행해 보니 제대로 잘 된 것 같네요 ㅎㅎㅎ


그럼 이제 뷰 컨트롤러에 Push기능을 해 줄 버튼 하나를 만듭니다.

아직도 이 그림이 이해안가시는 분은 없으리라 믿습니다~!

오른쪽 버튼 드래그 또는 ctrl+드래그 아시죠?ㅎㅎㅎ 


그럼 이렇게 이쁘게 연결이 되겠죠???



자, 깔쌈하게 연결 해 줬으니 이제는 구현파일로 넘어와서 해야 할 일들을 말해줘야겠죠 ㅎㅎㅎ


그리고 실행하면 이렇게 이쁘게 버튼이 박혀있구요~



버튼을 누르면 이렇게 다음 화면으로도 넘어오네용 ㅎㅎㅎ


자, 우리가 구현하고자 하는 내용이 무엇이냐???

네비게이션 바 생김새를 커스터마이징 하는 것이지요~

특히나 저는 배경과 제목을 커스터마이징 하고 싶어요.

UINavigationBar 클래스 문서를 봅니다.

제목을 커스터마이징 할 꺼리는 안보이고...

그나마 배경이미지 설정해 주는 메소드가 있는것 같군요~


따라가 봅니다.

앗!!! 그런데 이게 왠 난관입니까??

iOS 5.0 부터 지원하는 메소드라고 합니다...

iOS 5.0 미만 사용자들은 어떡하지... 흠...  


자, 어쨌든 저쨌든간 방법은 있겠죠?ㅎㅎㅎ

버전을 체크해서 가능한 녀석들로 처리를 해 봅시다.

버전 체크하는 방법에 대한 자세한 내용은

2012/08/17 - [iOS Dev/깨알 Tips] - iOS Version Check

를 참고하시면 됩니다~

iOS 5.0 미만 같은 경우는 drawRect메소드를 오버라이드 하여 배경이미지를 그려줄 수 있습니다. 

물론 iOS 5.0이상이라면 좀 더 편안하고 안정적으로 구현되어있는 메소드를 이용해 주면 되겠죠?ㅎ

이렇게 카테고리 메소드를 완성해 줍니다. 물론 배경에 사용될 이미지도 잘 첨부 해 줍니다.ㅎ 


제가 사용한 이미지 올려놓을게요~



그리고 전에도 그랬다시피, 나 이런 메소드 가지고 있어~

오퐈 이런 능력자야~ 라고 말해주려면 헤더에 잘난척 해줘야겠죠?ㅎㅎㅎ


그리고 이제 이 카테고리 메소드를 사용하고 싶으면 헤더를 import해 주시고, 그냥 원래 클래스에 있던 메소드마냥 사용해 주시면 됩니다. ㅎㅎ


자, 이제 실행해 보면??? 예상했던 결과처럼 나오나요?ㅎㅎ


화면을 넘기면 이렇게 나오구요 ㅎㅎ


그런데 화면을 옮겨가도 위의 제목은 항상 그대로지요? 그래서 우리가 만들어 놓은 메소드를 통해 제목도 좀 바꿔줍니다. ㅎㅎㅎ

화면이 보이려고 할 때(viewWillAppear) 에서 해당 메소드를 사용해 주면 될 것 같군요 ㅎㅎ 

그리고 push해 준 후에 제목을 바꿔줘도 적용이 될 것 같은데요?ㅎㅎ 


짜잔~ 일단 첫번 째 화면에는 잘 세팅이 되었네요~


그리고 화면을 넘겼다가~~~~~~~~


다시 돌아와도 우리가 원한대로 잘 되어있죠?ㅎㅎㅎ



자, 오늘은 네비게이션 바 커스터마이징이라는 명목으로 카테고리 라는 녀석을 함께 해보았습니다.

어떠셨어요?

유용할 것 같지 않나요?ㅎ

물론 어떤 클래스라도 카테고리를 만들어 줄 수 있습니다.

자신이 자주 사용하는 기능이 조금 복잡하거나 매 번 프로젝트를 만들 때마다 구현해주기 귀찮다면 카테고리를 이용하는 것이 효율적일 것입니다.

자, 오늘도 즐거운 공부가 되셨길 바라면서

저는 이만 물러갑니다~

또봐용 ㅎㅎ


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 인절미후후 2012.08.21 11:25  댓글주소  수정/삭제  댓글쓰기

    헤에~ 네비게이션바 하시는군요~
    제가 예전에 앱스토어에 올린 어플이 네비게이션 바를 커스텀 해보려고 무지 노력했었는데
    소스로 만들어지는거랑 닙에서 올린거랑 겹쳐져서 고생했었죠..(백버튼은 소스로 보내기전에 만들어야 하고 닙으로 만든거는 또 새로 생겨버리고..백버튼모양은 안만들어지고..)
    관련 내용이 등장하니 반갑네요.
    앞으로도 좋은 강좌 부탁드리겠습니다!

  2. 컴맹 2012.09.16 04:51  댓글주소  수정/삭제  댓글쓰기

    카테고리 정말 좋네요.ㅎㅎ
    좋은 강좌 잘보고 갑니다~ 감사합니다~^^

  3. 눈팅X 2012.12.03 18:16  댓글주소  수정/삭제  댓글쓰기

    야곰님 강좌 몰래 눈팅하고 있는 1인입니다.

    [naviCon.navigationBar customizeWithTitle:@"Customized"];

    추가하고 실행했을 때, 타이틀이 안보이는데.. 혹시 살펴 볼 부분이 있을까요??
    강좌 내용을 살펴봐도.. 잘 모르겠어서..

    잠수중인데, 살짝 올라왔습니다.

    ----------------------------------------------------------------------------------------------

    자세히 좀 볼 걸 그랬어요. 찬찬히 다시 보니.. 아래 코드가 누락.. ㅎㅎ
    [self addSubview:titleLabel];

    야곰님!!
    오늘도 많이 배워 갑니다~ 항상 감사드려요~


  4. paxdreamer 2012.12.26 13:51  댓글주소  수정/삭제  댓글쓰기

    야곰님 안녕하세요. 오랜만에 인사드립니다.ㅎ
    네비게이션 커스터마이징에대해 이것저것 알아보고 있는 중인데요. 네비게이션 바를 슬라이딩하게 하는건 어떤식으로 적용해야 하나요??
    예를 들어서 상하스크롤할때 보였다 안보였다 하는 방식을 적용하고 싶어서요.
    화면 넓게 쓰고 싶어서 그렇게 만들고 텍스트도 따로 입력하게 하고 싶은데 어떻게 해야할지 모르겠네요.ㅋㅋ
    계속해서 좋은 내용 연재해 주셔서 감사합니다.ㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.12.26 14:37 신고  댓글주소  수정/삭제

      안녕하세요:) 오랜만에 뵙습니다.

      UIScrollViewDelegate를 보시면 아마도 스크롤바를 올리고 내릴 때 작동하는 메소드가 있을거예요.

      거기에다가 네비게이션 바를 보였다 숨겼다 하는 메소드를 추가하면 될 거 같은데요 :)

      [naviCon setNavigationBarHidden:YES animated:YES];

      아마 이런 메소드 있을거예요~

  5. Favicon of http://silver-lining.tistory.com/ BlogIcon silver0r 2012.12.26 20:33  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 매번 눈팅으로만 열심히 배우다가 질문드립니다.

    실 프로젝트에서 커스텀네비게이션바를 사용하려하는데 첫화면 등 일부 화면에서 제외하고 나머지 화면에서는 커스텀 네비게이션 바를 보여주려하는데 이경우엔 어떻게 해야될까요??
    매번 책보다 훨씬 더 간단하고 쉽게 연재해주셔서 감사히 잘 보고있습니다

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

      음... 그 경우에는 좀 애매하네요...+_+

      하나의 네비게이션 컨트롤러는 하나의 네비게이션 바만 가질 수 있으니...

      흐음... 꼼수는 여러가지 있을 수 있으나... 그다지 추천해 드리고 싶지는 않아요 ㅠ

  6. Eastsky_Kagn 2013.01.24 16:40  댓글주소  수정/삭제  댓글쓰기

    정말 큰 힘이 되는 포스트 입니다. 감사합니다~ 늘 수고 많으세요.

  7. 21c 2013.02.03 00:03  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 yagom님ㅎㅎㅎ 프로그래밍 공부하는 고등학생이에요....
    저같이 컴퓨터학원다닐 여유없는 학생에게 큰 힘이 되십니다ㅠㅠㅠㅠ
    제일 은인같이 생각하고 있어요....너무 감사합니다ㅎㅎ!! 앞으로도 좋은 글 많이 올려주시구 항상 응원하겠습니다!

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.02.04 10:12 신고  댓글주소  수정/삭제

      하하... 저보다 훨씬 양질의 컨텐츠를 포스팅 하는 분들이 많습니다.

      더 좋은 자료 찾아보시길...^^

      그래도 이런 응원은 저에게 정말 큰 보람과 힘이 되네요 :) 정말 고맙습니다 ^^

  8. silver0r 2013.09.23 12:48  댓글주소  수정/삭제  댓글쓰기

    야곰님 예쩐에 이거 보고 잘 따라했는데
    ios7나오고나서 이 커스텀네비에 left right 버튼 올렷을 때 버튼이 보이질 않습니다
    (동작은 해요)
    이유가 뭘까요....

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.09.23 13:45 신고  댓글주소  수정/삭제

      iOS 7에서 tintColor 부분에 변경이 있었고, 버튼이 테두리가 사라졌습니다.
      혹여 버튼에 제목을 정해주지 않으셨다면 한 번 넣어보시고,

      http://goo.gl/czcsej

      참고하여 보시기 바랍니다

  9. silver0r 2013.09.24 10:04  댓글주소  수정/삭제  댓글쓰기

    감사합니다
    저도 어제 찾아보니까 tintColor 를 안해주면 안보이는걸 확인했네요 ㅎㅎ;
    버튼의 테두리는 bg이미지로 넣어서 해야겠네요 감사합니다 ^^


오늘의 Tip

1. iOS Version Check


# iOS 버전체크하기

가끔 우리는 특정 버전에서 사용할 수 없는 메소드들을 만나게 됩니다.

그럼 지원하지 않는 버전의 기기에서 그 메소드를 호출하면 펑~ 하고 어플리케이션이 죽어버리는 사태가 발생하죠.

그래서 개발문서를 잘 보고 메소드를 사용하여야 합니다.

나도 모르는사이에 펑하고 어플리케이션이 죽어버릴 수 있으니까요 ㅎㅎㅎ

자, 그럼 버전체크하기~

주석에 달려있듯이 아래  메소드를 사용하여 내가 적어준 버전과 같은지, 그보다 아래인지 위에인지 판단 할 수 있습니다.


자주 필요하다면 아래처럼 App-Prefix.pch 내에 매크로로 정의하여 사용하여도 편리합니다~
 


 



by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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


Posted by yagom

댓글을 달아 주세요

  1. 낭만떡대 2012.11.22 09:42  댓글주소  수정/삭제  댓글쓰기

    어머 이 좋은 Tip에 댓글 이 하나도 없네 ㅋ

    감사 드립니다.~


오늘의 주제

1. UIAlertView Customize


마흔 네 번째 시간입니다.^^

정말 오랜만의 포스팅입니다~!

그동안 잘 지내셨나요?ㅎ
정말 무더위가 장난이 아니네용...
동남아 날씨 +_+

지난 번 공지로 iOS6와 스토리보드로 출발해 보겠다고 말씀드렸는데, 아직 제가 준비가 되지 못한 관계로 오늘도 iOS5로, 스토리보드 없이 진행합니다!

자, 그럼 다시 힘찬 출발을 해 볼까요?ㅎ


# UIAlertView 커스터마이징

전에 
2012/05/11 - [iOS Dev/함께해보기] - iOS개발하기 #29. 경고창 (UIAlertView)
포스팅에서 AlertView에 대해서 해 보았습니다.

이번엔 요 녀석을 커스터마이징 하는 방법을 살짝 이야기 해볼까 합니다.

물론 제가 오늘 소개해 드리는 방법 외에도 더 무궁무진한 방법이 있지만, 오늘은 간단한 선에서 진행 해 봅니다.

물론 여기에도 단순히 커스터마이징에 대한 정보가 아니라 부분 부분 지나쳐온 이야기들이 나올거예요..ㅎㅎㅎ

자, 그럼 새로운 프로젝트를 생성해 봅니다.

프로젝트 이름은 WithYagom이구요, ARC를 사용합니다~ SingleView Application으로 생성하였구요~


자, 프로젝트를 만들어 주고나면 ViewController가 있죠? 요녀석에 AlertView 하나를 만들어 띄워봅니다.


뾰뵹~ 우리가 하던대로 잘 나오죠?ㅎ


이제 커스터마이징을 위해서 우리가 새로운 클래스를 만들건데요, UIAlertView를 상속받는 클래스를 만드는 것입니다.

상속이 뭔가요?ㅋㅋㅋ

분명히 보신분도 보지 않으신 분들도 계실건데요, 이번 기회에 보고 옵시다~

2012/03/28 - [Objective-C] - Objective C <9>. 상속(1)
2012/04/10 - [Objective-C] - Objective C <10>. 상속(2) - 오버라이딩

자, 그리고 조금 이따가 바로 오버라이딩을 해 줄거예요.

일단 클래스를 만들어 봅시다 ㅎㅎ

프로젝트 네비게이션에서 우클릭 또는 control +  클릭 해 주시구요~ 아니면 단축키 command + N 을 눌러주시면 됩니다~


Cocoa Touch - Objective-C class를 선택해 주시고~


CustomAlertView라는 이름으로 UIAlertView를 상속받은 클래스를 만들어 줍니다~!



자, 이렇게 UIAlertView를 상속받은 클래스가 생겼습니다.

이렇게 상속받은 클래스는 부모클래스인 UIAlertView의 메소드와 property를 모두 사용 할 수 있습니다.

게다가 오버라이딩을 한다던지, 우리가 새로 뭔가를 추가해 줄 수 있는 녀석이 되는거죠.


자, 우리가 원래 UIAlertView를 화면에 보여줄 때 사용한 메소드가 뭐였죠?

네! show!!!!!!!!!!

이녀석을 우리 입맛에 맞춰서 오버라이딩 해 줄거예요 ㅎㅎ

일단 [super show] 라는 곳에 주석을 안달았는데, super는 이 클래스의 부모클래스를 뜻합니다.

즉, [super show]는 부모클래스에서 show를 호출 해 주는 거예요. 우리가 show안에서 무슨 일을 처리하는지 모르니까 일단 불러줍니다.

그리고 그 후에 우리가 원하는 대로 입맛에 맞게 후보정을 해 줍니다 ㅎㅎㅎ

show 메소드를 오버라이딩 해 주는 것입니다. 

참, 그리고 소스에 보듯이 이미지들이 프로젝트에 들어와 있어야 합니다.

캡쳐한 것 보면 어느새 제가 이미지들을 낑궈 넣어논 것을 볼 수 있을거예요 ㅎㅎㅎ 


자, 그리고 이제 다시 ViewController로 돌아와서 우리가 만든 새로운 클래스의 인스턴스를 만들어주고 show를 호출해 봅니다.
참! 위에 헤더 import한 것을 네모박스 안했는데, 꼭 해주세요 ㅎㅎ 


두구두구두구둥!!!
우왘ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

요상하긴 하지만 어쨌든 바뀌었습니다 ㅋㅋㅋ

이미지는 새로 만들기 귀찮은 관계로, 그냥 있는 것 쓰는 걸로? ㅋㅋㅋ 물론 여러분들은 이쁜 이미지를 만들어서 넣어보세요 ㅎㅎ


자, 이렇게 오버라이딩을 통해 우리 입맛에 맞게 커스터마이징을 손쉽게 할 수 있습니다~!

그런데 저렇게 딱딱 고정해놓고 쓰기에는 뭔가 좀 아쉽죠?ㅎ

그래서 뭔가 다음에 쓰기 더 용이하도록 메소드를 이쁘게 만들어 줘 봅시다.

CustomAlertView.m으로 돌아와서 오버라이딩 했던 show가 아닌 우리가 필요한 녀석들을 인자로 받을 수 있도록 메소드를 조금 수정해 봅니다~ 


그리고 원래 없던 메소드를 우리가 추가했고, 다른 곳에서 호출해 주고 싶다면 헤더에 매소드의 원형을 꼭 써주셔야 합니다.

이렇게요~~~~~~~~ 꼭이요~~~~~~~~ 


그리고 나서 ViewController.m 으로 다시 돌아와서 요렇게 호출을 해 주면!!!!!!!!


똻!!!!!!!! 똑같이 동작합니다. 하지만 다음 번에 다른 이미지를 넣어주고 싶을때는 용이하게 이미지를 바꿔줄 수 있겠죠?ㅎㅎ


자, 처음에 우리는 오버라이딩을 통하여 직접 메소드를 건드려 줬구요,

두 번째로는 새로 메소드를 생성해 주어서 [super show]라는 메소드를 호출하여 show라는 메소드를 호출한 것과 동일한 결과를 만들어 냈고, 그 다음에 우리 입맛에 맞도록 커스터마이징 한 것입니다.

좀 헷갈리시나요?ㅎㅎ

여튼 차분히 잘 생각을 해 보시길 바랄게요.


이렇게 상속을 통하여 메소드를 오버라이드 하거나 원하는 메소드를 추가하여 전혀 다른 모습으로 커스터마이징을 할 수 있습니다.

물론 UIAlertView 뿐만 아니라 다른 클래스도 마찬가지겠지요?ㅎㅎㅎ

더 많은 기법과 더 많은 자료들은 구글님께 물어보시면 많을거예요 ㅎㅎ

사실 제가 커스터마이징보다 더 하고 싶었던 말이 오버라이딩이 아닌가 싶기도 하네요~

다음에도 유용한 녀석 하나 데려와 볼게요~

커밍 쑨~!

by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 컴맹 2012.09.15 04:15  댓글주소  수정/삭제  댓글쓰기

    상속받은 클래스에 새로운 메소드를 추가하여, 사용하는 방법이 정말 유용하죠.ㅎㅎ
    오늘도 잘 배우고 갑니다.~~^^

  2. 으아아아 2015.06.27 19:00  댓글주소  수정/삭제  댓글쓰기

    저는 안되네요.. 에러고 뭐고 그냥 원래의 alertview 대로 뜹니당 ㅠㅠ 뭘잘못했을까요


Tip

ARC(Automatic Reference Counting) 프로젝트에서 특정파일 ARC 제외시키기


안녕하세요 야곰입니다.^^

팁이지만 간만에 포스팅이네요~_~

iOS5가 나온 이후로 ARC가 생겨서 많이들 좋아하셨는데, 다른 오픈소스나 라이브러리 등을 가져다 쓰려면 지난 소스들은 ARC 기준으로 작성되어 있지 않기 때문에 적용하기 난감했던 경우가 많으셨을 겁니다.

그런데 이런 방법으로 하면 간편히 지난 소스들을 다시 사용할 수 있습니다 ㅎㅎㅎ

# 본 포스팅은 iOS5.1, Xcode Version 4.3.3 (4E3002) 기준으로 작성되었음을 알려드립니다.

# ARC 제외시키기

일단 뭐 ARC 프로젝트가 필요한데 딱히 뭐 쓸만한 놈이 없으니 하나 만들어 봅니다 ㅎㅎㅎ
당연히 Use Automatic Reference Counting이 체크 되어있어야지 ARC 프로젝트가 되겠죠?ㅎㅎ


자, 저는 Reachability라는 녀석을 가져와서 빌드 해 보니 Fail이 되었네요~ (Reachability 라는 녀석은 Systemconfiguration.framework 프레임워크를 추가해 주셔야 합니다.)
붉은 악마들 천지입니다 ㅋㅋㅋ
소스를 보면 release, autorelease, NSAutoreleasePool 등 ARC에서 사용할 수 없는 녀석들 천지인 것을 볼 수 있습니다 ㅎㅎ 


자, 이따위 에러들을 뱉어내었군요...


그럼 이제 이렇게 하시면 됩니다~!
프로젝트를 선택하신 후 TARGETS - Build Phases를 선택, 그리고 ARC해제를 원하는 소스파일들을 선택합니다. 그리고 엔터!


그러면 요런 창이 뜨는데, 거기에 -fno-objc-arc 라고 입력해 줍니다. 그리고 Done..(다 완성됐다는 소리죠?ㅋㅋㅋㅋㅋㅋㅋㅋㅋ) 


자, 그리고서 빌드를 해보니까~!? 이렇게 깔끔~ 붉은악마들이여 안녕~





by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 나에게넌 2012.08.14 17:19  댓글주소  수정/삭제  댓글쓰기

    깨알같은 팁 감사합니다..

    다시 강의 처음부터 복습해야겠어요 ㅎㅎ

    강의에 system.configuration.framework추가하라고 알려주세요..혹시 모르시는분은 안된다고 헤매실지도..

  2. 이누꼬로 2012.09.06 10:18  댓글주소  수정/삭제  댓글쓰기

    특정 파일만 ARC를 사용하게 할수는 없나요?

    원래 ARC를 사용하지 않는 프로젝트에서 특정파일만 ARC를 사용할수있게요;

  3. 귀공자 2012.10.09 08:30  댓글주소  수정/삭제  댓글쓰기

    와 이건 대박이네요 ㅜ.ㅜ
    1년동안은 그냥 소스들을 죄다 고쳐서 가져다 썼는데...

  4. 노력중.. 2013.03.08 16:21  댓글주소  수정/삭제  댓글쓰기

    감사합니다~~


오늘의 Tip

1. 어플리케이션 실행 시 로딩 이미지 설정하기
2. 이미지 나타났다 없애기



어플리케이션 실행 했을 때 처음에 나오는 로고 이미지 등을 넣는 방법입니다.ㅎ


# 실행 시 로딩 이미지 넣기

정말 간단합니다.
Default.png 라고 이름을 만들어서 넣으면 알아서 찾습니다.. ^^;
물론 레티나 이미지는 뒤에 @2x 를 붙여주시면 되겠죠?ㅎ
주의할 점은 대소문자를 구분한다는 것입니다. 주의하세요~! ㅎ


그리고 좀 더 로고를 오래 보여주고 싶다면, AppDelegate로 와서 잠깐 정지 시킵니다..ㅎ

여기서는 1.5초를 중지시켜 봤어요~


# 나타났다 사라지는 애니메이션

이미지 뷰를 하나 선언해 주시구요~


애니메이션을 이렇게 만들어 줍니다...^^
이 코딩 기법은 블록코딩 기법입니다.
블록코딩 기법에 대한 상세한 내용은... 다음에 언제 한 번 다뤄보도록 하겠습니다^^;


실행 해 보세요~!

와우~ 판타스틱베이비~ㅋㅋㅋㅋㅋㅋㅋ


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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


Posted by yagom

댓글을 달아 주세요

  1. paxdreamer 2012.06.28 10:18  댓글주소  수정/삭제  댓글쓰기

    너무 좋은 내용 항상 감사드립니다.
    야곰님은 정말 복받으실꺼에요.
    감사합니다.^^

  2. Favicon of http://spacechild.kr BlogIcon 루나리안 2012.07.12 15:33  댓글주소  수정/삭제  댓글쓰기

    와우~ 판타스틱 베이비 ㅋㅋㅋㅋㅋ

    아 웃겨 ㅋㅋㅋ

    지나가다가 댓글 하나 안 적고 갈 수가 없네요 ㅋㅋㅋㅋ

    재밌었습니다 ㅋㅋㅋㅋ

  3. 나에게넌 2012.08.14 14:43  댓글주소  수정/삭제  댓글쓰기

    8월 현재는 강남스타일이죠..
    오..오빤 강남 스타일~~~

  4. 인절미후후 2012.08.14 18:38  댓글주소  수정/삭제  댓글쓰기

    최근에 짬을 내서 다시 포스트 하시는군요!
    관련 질문 한가지 드릴까해서 겸사겸사 글 적어봅니다.
    인트로 이미지는 어플이 종료된 경우에 실행하면 시작과 함께 보여지는 화면이잖아요?
    아이폰 특성상 홈버튼만으로 어플이 종료되는게 아니고 메모리 릭이 없을 경우 보통 어플이 안꺼지면은
    다시 어플런처아이콘을 클릭할때 홈버튼 누르기전 화면이 나오는경우가 많은데
    항상 저 로고를 보여주면서 처음부터 시작하는 어플들이 있더군요
    그런건 홈버튼 누를때 어플을 다 종료시킨다고 봐야할까요 아니면 다시 시작되는경우에도 처음부터 시작되도록 프로그램 한걸까요?

  5. 초보엑스코더 2012.12.10 14:44  댓글주소  수정/삭제  댓글쓰기

    야곰님, 전 가로방향 어플리케이션을 만들어 보려고 하는데요

    분명히 Default.png 화일을 그래서 960 x 640 사이즈로 만들어서 가로모양으로 넣었거든요?

    그런데 이상하게 실행을 하면, 로딩 화면이 가로 화면으로 제대로 안나오고,
    세로로 길쭉한 화면이 90도 돌아간것처럼
    나오네요 ㅠㅠ

    그러니까 예를 들어 제가, N 이라는 로딩화면을 가로로 보여주고 싶은데,

    화면상에는 z 로 보이게 되는 현상이 자꾸 발생하네요 ㅠㅠ 왜 그럴까요?


오늘의 주제

1. iOS 어플리케이션의 생명주기
2. ViewController의 생명주기 



마흔 세번째 시간입니다.^^

요 며칠 제 개인적으로 좀 힘든일도 있고, 빡빡한 프로젝트 일정 때문에 제대로 포스팅을 하지 못했습니다.

흙흙 아직 프로젝트가 마무리 되지는 않았지만 최대한 짬을 내 보도록 하겠습니다..ㅎ

우리 이제까지 정말 쭉쭉 달려왔습니다.

이것저것 해 보면서 많은 것을 맛 봐왔죠...ㅎ
물론 이것 저것 많이 해 보는 것도, 맛을 보고 언제 어디서 어떻게 써야할지 감을 익히는 것도 중요합니다.

그러나 더더욱 중요한 것은 통괄적인 흐름이고 기초죠.

초반에 포스팅 할 때 말씀드렸듯이 아주 기초적인 사항들은 많이 스킵하고 넘어왔습니다.

이번에는 그래서 정말 기초 하나를 같이 알아보고자 합니다.

물론 초보자 님께서 포스팅을 해 달라고 부탁하신 내용이기도 합니다 :-) 고맙습니다 ㅎ

자, 그럼 이제 같이 해 볼까요?

스따뚜~~~~~~~~~~~~


# 실습해보기

ㅎㅎ 초심으로 돌아가서 프로젝트 생성부터 따라 가 봅시다.
빈 프로젝트를 생성합니다.


이름은 ViewLifeCycle.
코어 데이터도 사용하지 않을 것이고, ARC도 사용하지 않을 것이며, Unit Test도 포함하지 않을 것입니다.
ARC를 사용하지 않는 이유는, 우리가 원할 때 메모리 관리를 함으로써 더 명확히 흐름을 보여드리기 위함입니다.


자, 프로젝트를 생성했으면 ViewLifeCycle 폴더에서 오른쪽 버튼을 클릭.
New File...


Objective-C class를 선택하고 Next


TestViewController로 이름짓고 XIB생성에 체크합니다~


TestViewController가 생성되었으면 RootViewController도 만들어 주세요 :-)


자, 그리고 RootViewController.xib로 와서 Assistance 모드로 변경하면 이렇게 나오겠죠?
무슨 말인지 모르시는 분들은 
2012/04/03 - [iOS Dev/깨알 Tips] - Xcode4 xib의 객체 소스파일과 쉽게 연결하기

를 참고해 주시면 됩니다 ㅎ
자, 여튼 xib파일을 클릭하고, RootViewController.h를 option+클릭하면 이런 화면이 나오겠죠.
xib파일에 버튼 세 개 가지런히 올려주시고, 저렇게 연결 해 줍니다.


나머지 두 버튼들도 이쁘게 연결 해 주시구요~^^


연결 해 주었으니 무엇을 할지 작성해 주어야겠죠?ㅎ
RootViewController.m 파일로 이동합니다.
이렇게 이쁘게 작성을 해 주세요.ㅎ 
#import 부터 저 쪼 아래까지 쭈욱 다 보셔야 해요 ㅎ


자, 그리고 AppDelegate로 옵니다.
이렇게 이쁘게 네비게이션 컨트롤러를 하나 만들어 주시구요 ㅎ


구현파일로 들어와서 이렇게 또 이쁘게 코딩을 합니다 ㅎ


자, 이제 TestViewController도 RootViewController에서 했던 것과 마찬가지로 쭉쭉 연결해 줍니다 ㅎ


그리고 구현파일로 와서 이렇게 작성을 해 주세요 ㅎ
__PRETTY_FUNCTION__은 나중에 어떤녀석인지 알 수 있으실 거예요 ㅎ
앞에 언더바(_) 두개, 가운데 한 개, 뒤에 두 개 이렇습니다. ㅎ


자, 그리고 RootViewController 구현파일에도 와서 필요한 부분에 그녀석을 찍어 줍니다.


AppDelegate에도 마찬가지구요 ^^*


자! 그리고 실행해 봅시다~!
처음 로그는 어플리케이션을 실행시킨 후 네비게이션 push버튼을 누르고 다시 pop버튼을 누른 후에 나타난 로그입니다.


두 번째 로그는 어플리케이션을 실행시킨 후 모달뷰를 띄웠다가 다시 닫은 후에 나타난 로그입니다.


세 번째 로그는 어플리케이션을 실행시킨 후 addSubview와 removeSubview를 한 후의 로그입니다.


네 번째 로그는 어플리케이션 실행 후 홈버튼을 눌러서 백그라운드로 보낸 후 다시 어플리케이션을 띄운 후 다시 홈버튼을 누른 후에 생긴 로그입니다.


어떤가요? 여러분의 로그와 일치하나요?ㅎ

로그에 찍힌 것은,  -[해당 클래스명 메소드명] 이런식으로 남게 됩니다.

한 번 차근차근 로그를 따라서 추적해 보세요 ~^^*


# iOS Application Life Cycle

자, 그럼 실습을 해 보았으니 본격적으로 알아봅시다.

어플리케이션의 생명주기를 설명하는 그림으로 유명한 녀석입니다.ㅎ


1. 사용자가 어플리케이션을 탭합니다.
2. main() 함수가 호출됩니다.
3. UIApplicationMain()이 호출됩니다.
4. applicationDidFinishLaunching이 호풀됩니다. (AppDelegate)
5. 여러분이 설계하고 작성한 어플리케이션의 코드가 동작합니다.
6. 어플리케이션 종료를 명령하면 applicationWillTerminate가 호출됩니다. (AppDelegate)
7. 어플리케이션이 종료됩니다.

자, 어떤가요? 감이오시나요?ㅎㅎㅎ

main은 뭐고 UIApplicationMain 은 또 뭐고...???

ㅎㅎ

모든 C언어 기반의 프로그램은 main함수에서 출발을 하게됩니다.

Objective-C로 엄연히 아랫단은 C언어 기반이므로 main함수로부터 출발을 하게되는 것입니다.

사실상 형식적이라고 볼 수 있습니다.

우리가 신경써야 할 부분은 AppDelegate의 applicationDidFinishLaunching 부터라고 생각하시면 됩니다.

로그에 applicationDidFinishLaunching이 가장 먼저 찍힌 것을 확인하셨나요?ㅎ 맞지요?ㅎ

그리고 로그에서는 확인 할 수 있을지 모르겠지만 applicationWillTerminate에서 우리가 할 수 있는 모든 것은 끝이나게 됩니다.

한 마디로 어플리케이션의 생명주기는 우리가 AppDelegate에서 확인하고 관리할 수 있습니다.

그렇다면 ViewController들의 생명주기는...???


# iOS View Life Cycle
 
자, 어플리케이션 전체의 생명주기를 알아보았으니, 작게는 ViewController들의 생명주기에 대해 알아봅니다.

로그에 보면 ViewController의 로그 중에 가장 먼저 찍히는 녀석은 init(initWith....... 포함)입니다.

초기화 해 주는 녀석이 당연히 가장 먼저 호출이 되겠죠.

그 후에 바로 불리게 되는 녀석이 viewDidLoad입니다.

자동으로 생성되는 주석에 보면 이녀석에서 처음 부가적인 세팅을 하라고 써있죠.

눈치채신 분들도 계시겠지만 제가 아까 위에서 ViewController에 작성한 View Life Cycle의 메소드들은 순서대로 호출됩니다.

너무나 당연하게 

viewDidLoad
viewWillAppear:
viewDidAppear:
viewWillDisappear:
viewDidDisappear:
viewDidUnload

의 순서로 호출이 되게 됩니다.
그래서 viewDidUnload에서는 객체들을 놓아주는 곳으로 사용하라고 주석으로 설명이 되어있죠.

각각 호출되는 타이밍은 말씀드리지 않아도 아실 수 있을거라고 생각합니다...^^

영어 그대로 해석해 보세요..ㅎ

alloc, init, dealloc은 모든 객체에 공통적으로 해당되는 내용이므로 위에 나열하지는 않았습니다.

alloc - 메모리에 적재되는 시점
init - 객체가 초기화 되는 시점
dealloc - 객체가 메모리에서 해제되는 시점

dealloc은 실질적으로 해당 객체가 메모리에서 해제되는 시점(retainCount가 0이 되는 시점)에 호출되게 됩니다. 말그대로 alloc과 딱 반대개념이죠~


자, 이렇게 간략하게나마 어플리케이션과 뷰컨트롤러, 그리고 일반적인 객체의 생명주기에 대해 알아보았습니다.

제 설명이 어떻게 다가갔을지, 또 어떻게 느껴지셨을지 잘 모르겠지만, 궁금하거나 해결되지 않는 내용이 있었다면 꼭 말씀 부탁드립니다 :-)

사실 이 부분이 제가 초반에 제대로 개념을 잡아놓지 않아서 항상 혼돈을 겪었던 부분중에 하나기 때문에 필시 여러분께 도움이 될 것이라고 생각합니다.

그럼 이만...~!

p.s 오늘은 6월 25일 6.25전쟁 62주년입니다.
우리나라의 평화와 안위를 위하여 목숨바친 순국선열께 감사하는 마음을 가지는 우리가 되었으면 좋겠습니다.


by yagom

facebook : http://fb.yagom.net

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

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

RSS Feed 받기   


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




Posted by yagom

댓글을 달아 주세요

  1. 초보자 2012.06.27 12:34  댓글주소  수정/삭제  댓글쓰기

    앗 강의 정말 잘봤습니다~^^ 많은 도움이 됐네요~ 계속 좋은 강의 부탁드려요~ㅋ

  2. 도레미 2012.06.28 15:06  댓글주소  수정/삭제  댓글쓰기

    강의 정말 잘보고 있습니다.
    나중에 스토리보드 쪽도 부탁드려요~^^

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

      안녕하세요 도레미님 :-)
      좋은 의견 고맙습니다..^^ 차차 준비해 보도록 하겠습니다.
      자주자주 놀러오세요 ㅎ

  3. Favicon of http://blog.naver.com/gamakun BlogIcon 까마쿤 2012.07.20 09:40  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 초보개발자 까마쿤입니다 :)
    블로그를 찾은지 얼마 되지않았지만 친절하신 설명에 감동하면서
    제가 필요한부분들을 쏙쏙찾은것 같아요 :-)
    마음같아선 1강부터 댓글을 달아드리고싶지만... 프로젝트 마감이 얼마 남지않아서..
    정말 감사합니다! 다음번에 시간되시면. 달력같은거 커스터마이징도 알려주시면 감사할거같아요 ㅎㅎ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.07.20 12:43 신고  댓글주소  수정/삭제

      안녕하세요 까마쿤님~!
      찾아주셔서 정말 고맙습니다 :)
      도움이 되었다니 저도 정말 기쁩니다 ㅎ
      말씀해 주신 내용은 기회가 된다면 진행해 보도록 하겠습니다.
      많이 덥네요 ㅎ
      더위조심하시고 종종 들러주세요 ^^*

  4. Sio 2012.07.25 14:19  댓글주소  수정/삭제  댓글쓰기

    기본적인 건데 너무 건성으로 지나갔던것 같네요 ㅎㅎㅎ
    다시한번 정리되서 보게되서 많이 도움이 되었습니다~!
    잘보고갑니다~!!!!!

  5. 나에게넌 2012.08.14 16:06  댓글주소  수정/삭제  댓글쓰기

    주옥같은 강의..이제 2강 남았네요..어여 프로젝트 끝내시고 계속 올려주세요 ㅎ

    아직 우린 배울게 너무 많자나요 ㅠ

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

      ㅎㅎ 매일 불같은 덧글 정말 고맙습니다~

      다시 복습하다 보면 또 새로울거라 믿습니다...ㅎㅎ

      필요하신 내용 있으면 말씀해 주세요~ :)

  6. 컴맹 2012.09.15 03:36  댓글주소  수정/삭제  댓글쓰기

    제목 그대로 라이프 사이클을 잘 설명해주셨네요.
    좋은 강의 감사합니다. ~~~ ^^

  7. Chris Jeong 2013.08.19 11:13  댓글주소  수정/삭제  댓글쓰기

    잘 보고 갑니다 ^^
    하나 궁금한 점은 각각의 단계(viewDidLoad, viewWillAppear 등)에서 개발자가 작성해줘야 하는 코드들이 분명 차이가 있을것 같은데 감이 잘 안오네요.
    안드로이드의 경우 onCreate에서는 생성시 1회만 초기화해 줘야 하는 부분들, onPause와 onResume에서는 리스너들의 등록, 해제를 하는데 ios에서는 어떤게 있는지 궁금하네요.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.08.19 13:29 신고  댓글주소  수정/삭제

      http://goo.gl/OL30zY
      http://blog.yagom.net/302
      참고해 보셔요..^^
      loadView - viewDidLoad - viewWillAppear - viewDidAppear 등이 있는데,
      최초 한 번 실행되는 것은 대부분 viewDidLoad에 채워줍니다 :)
      viewWillAppear, viewDidAppear 등은 상황에 따라 다시 실행 될 수 있습니다.

  8. 승군 2014.01.29 11:17  댓글주소  수정/삭제  댓글쓰기

    좋은 강좌 잘 보고 있습니다

    감사합니다~~!!!

  9. 멋있으십니다 2015.03.27 18:30  댓글주소  수정/삭제  댓글쓰기

    야곰님 글은 진짜 하나하나 전부다 좋은정보네요 감사합니다.

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

      고맙습니다..^^;

      글이 오래되어 조금 다르거나 틀린 정보도 있으니 최신 정보를 찾아보시는 것도 좋을 것 같습니다.

      종종 들러주세요 :)

  10. 요청하나!! 2015.04.06 10:13  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님 항상 좋은정보 알려주셔서 감사합니다.
    다름이 아니라 이번에 iOS objective c 를 이용하여 트위터 로그인하는것을 실습중에있습니다.
    혹시 실례가안된다면 objective c 를 이용한 IOS-Twitter로그인 연동과 그 로그인 한 사용자의 대한 id 와 이메일같은 정보를 로그로 띄울수있는 실습 한번 부탁드려도되겠습니까??

    이메일은 필수요소로 좀 부탁드리겠습니다..!

    • Favicon of https://blog.yagom.net BlogIcon yagom 2015.04.06 13:37 신고  댓글주소  수정/삭제

      안녕하세요, 답변이 늦어졌습니다 ^^;

      제가 요즘 정신이 없어서 늦어졌어요.

      트위터 로그인과 관련된 내용은 트위터 개발자 페이지가 가장 정확하고 최신정보를 가지고 있지 않나 생각합니다 :)

      영어가 큰 문제가 되지 않는다면 https://dev.twitter.com/twitter-kit/ios/twitter-login 페이지를 참고해 보시는게 어떨까 합니다.

      yagomsoft@gmail.com

  11. 요청하나!! 2015.04.07 18:13  댓글주소  수정/삭제  댓글쓰기

    감사드립니다. 바쁘신데 고생하십니다!

    • Favicon of https://blog.yagom.net BlogIcon yagom 2015.04.07 22:01 신고  댓글주소  수정/삭제

      큰 도움을 드리지 못해 죄송합니다.

      하다가 막히거나 궁금한 사항, 필요한 사항 생기시면 언제든 또 연락주세요.

      종종 들러주세요 :)