콘텐츠로 건너뛰기
Home » 스터디 » Page 37

스터디

[Objective-C] 프로토콜

클래스는 서로 다르지만 A라는 똑같은 메소드를 하나씩 가지고 있는 어떤 객체들이 있다고 하자. 방금 A라는 메소드를 가지고 있다고 가정했기 때문에 이 객체들에게는 A라는 메시지를 보냈을 때 해당 메소드가 실행될 것이라는 게 보장된다. 프로토콜은 이처럼 특정한 메소드를 구현해서 갖추고 있겠다는 약속을 말한다.

어떤 객체가 특정한 프로토콜을 따르고 있다면, 그 프로토콜에서 선언된 메소드는 구현하고 있다는 의미이며, 해당 메소드를 호출할 수 있다. 이 때 객체의 클래스가 무엇인지는 관심의 대상이 아니다.

프로토콜은 Objective-C의 기능으로 “선언만 되고 구현되지 않은” 메소드를 말한다. 이 기능은 흔히 ‘다중 상속을 지원하지 못하는 Objective-C의 기능을 보완하기 위해’ 만들어졌다고 하는데, 틀려먹은 이야기이고… Swift에서는 특히 중요하고 광범위하게 사용되기 때문에 주목을 많이 받는데, Objective-C에서는 그렇게 중요하게 다뤄지지 않았던 거 같아서 (아니, 다루는 블로그가 별로 없었지) 정리하도록 하겠다.

어떤 객체의 클래스에 대해서 알고 있다면, 이 클래스가 제공하는 인터페이스를 통해서 우리는 객체가 지원하는 기능들을 사용할 수 있게 된다. 거꾸로 어떤 특정한 기능이 필요하다면 우리는 그러한 기능을 지원하는 클래스를 선택해서 사용해야 한다. 그런데 특정한 기능은 정해져 있지만, 어떤 클래스를 사용하게 될지 알 수 없다면 어떻게 할까?

더 보기 »[Objective-C] 프로토콜

[Cocoa] NSImage를 파일로 저장하기

NSImage를 파일로 저장하기 이미지를 파일로 저장하기 위해서는 ‘표현형식'(representation)에 대해 알아야 한다. 즉 이미지 자체는 일련의 픽셀을 모아둔 데이터인데, 우리가 흔히 알고 있는 JPG, PNG 등의 파일 포맷은 이 이미지를 각각 정해진 방식으로 ‘정리’하여 파일에 저장하기 때문이다. 표현형식은 이런 파일에 저장된 비트맵 데이터를 다시 이미지로 렌더링하는 역할을 하고, 그 반대의 역할도 수행할 수 있다. NSImage는 1) TIFFRepresentation 메소드를 사용하여 표현형식을 구성하는 데이터로 만든다. 이 데이터를 사용하여 2) NSBitmapImageRep 객체를 생성하고, 이 객체에서부터 3) 실제 저장이 가능한 그래픽 파일 포맷의 데이터를 생성해서… 더 보기 »[Cocoa] NSImage를 파일로 저장하기

[Cocoa] 코코아의 이름 규칙

코코아 프레임워크에서 이름 짓는 규칙에 익숙해지는 것은 단순히 코드의 가독성을 높일 뿐만아니라 부분적으로 키-밸류 코딩의 규칙을 따르는 것과도 관련이 있다. 애플의 이름 짓기 규칙은 특히나 약어를 거의 사용하지 않고 단어나 문장을 통째로 쓰는 경향이 있는데 이러면 메소드나 변수의 이름이 길어질 수는 있지만 그 의미를 명확히 이해할 수 있을 뿐만아니라, Xcode의 멋진 자동완성기능이 있어 그리 많은 타이핑이 필요하지도 않다. 이름 짓기가 잘 된 소스는 나중에 본인이 재사용할 때도 매우 명확하고 쉽게 접근할 수 있으며, 그 자체로 소스에 대한 주석이 될 수도… 더 보기 »[Cocoa] 코코아의 이름 규칙

[iOS] 코어그래픽에 손대기

코어그래픽은 뷰에 그림을 그리는 기술이다. 하지만 C로 짜여진 API에 온갖 혼란스러운 함수명하며, 컨텍스트와 같은 어려운 개념들이 들어가면서 나와 같은 초보자에게는 마치 ‘넘을 수 없는’ 장벽과 같이 느껴진다. 하지만 많은, 정말 많은 튜토리얼들이 코어그래픽을 사용해서 그림을 그리는 이유는 명확하다. 바로 “아주 빠르기” 때문이다. 코어 그래픽은 그래픽 메모리의 버퍼를 직접 다루므로 아주 빠르다. (다만 일부 기기에서는 느리기도 하더라 ㅠㅠ) 오늘은 “시작하는 마음가짐”으로 코어 그래픽에 대해 잠깐 살펴보도록 하자.
코어그래픽을 사용하는데는 ‘컨텍스트’라는 개념을 이해해야 하는데, 이는 뒤에서 설명하기로 하고 잠시동안 ‘컨텍스트’는 그림을 그리는 도화지, 혹은 포토샵에서의 레이어와 같다고 간주하자.
더 보기 »[iOS] 코어그래픽에 손대기

[iOS/OSX] predicate를 사용한 배열의 필터

배열을 필터하기 특정한 값을 만족하는 원소만을 추출하여 부분 집합을 구하는 작업을 종종 해야 할 때가 있다. 배열에 대한 정렬 보다 간단하다면 간단하고 어렵다면 어려운데, predicate를 사용하면 쉽게 추출이 가능한데, 이 predicate를 사용하는 문법이 별도로 존재하기 때문에 조금 성가실 수 있다. (하지만 영문법과 크게 다르지 않다) NSMutaleArray *array = [NSMutableArray arrayWithObjects:@”Bill”, @”Ben”, @”Chris”, @”Melisa”, nil]; NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@”SELF beginsWith:’b'”]; NSArray *beginWithB = [array filteredArrayUsingPredicate:bPredicate]; // ==> { @”Bill”, @”Ben” } predicate는 너무 깊이 파면 복잡하므로 일종의 쿼리문이며, 대략 다음과… 더 보기 »[iOS/OSX] predicate를 사용한 배열의 필터

[iOS_OSX] 배열을 정렬하기

배열을 정렬하기

배열을 정렬하는 거 언젠가는 써 먹겠지 싶어서 정리.
생각보다 자주 써먹게 되더라

배열을 정리하는 방식은 크게 세 가지로 1)디스크립터를 사용하거나 2)블럭, 3)셀렉터를 사용하는 방법이 있다. 각각이 표현의(?) 차이는 있는데 실제로는 각 요소들을 비교하여 어떤 것이 앞에 오는지를 비교하여 정렬하게 된다.더 보기 »[iOS_OSX] 배열을 정렬하기

키밸류 옵저빙이란

키밸류 옵저빙 키밸류코딩(KVC)에 이어서 키밸류 옵저빙에 대해 이야기해보자. 키밸류 코딩에 관한 포스팅에서 키밸류 코딩은 키밸류 옵저빙의 근간이 되는, 어떤 객체의 프로퍼티를 키 이름으로 런타임에 동적으로 탐색하여 액세스할 수 있게하는 기술이라고 하였다. 키밸류 옵저빙 역시 프로퍼티 액세스와 관련한 Objective-C 런타임이 제공하는 동적 기능의 일종으로, 특정한 키에 대한 객체의 프로퍼티 값이 변경될 때, 해당 변경에 대한 알림이 다른 객체로 통지되는 것을 말한다. 예를 들어 foo 라는 객체 인스턴스에 a 라는 프로퍼티가 있고, bar 라는 객체가 이 프로퍼티에 대한 옵저버로 등록이 되어 있다면,… 더 보기 »키밸류 옵저빙이란

Pages: 1 2 3

(Cocoa) 날짜와 시간을 다루기

updated

Swift를 사용해서 Date를 다루는 방법은 새로 작성된 글을 참고하세요.
 

들어가며

날짜와 시간을 위한 프로그래밍을 위해서는 기본적으로 NSDate를 사용한다. NSDate는 2001년 1월 1일 자정을 기점으로 현재시간 (혹은 특정 시점)까지의 초단위로 경과한 시간을 저장하고 있는 객체이다.(Epoch가 아니라 21세기의 시작시점을 기준으로 하고 있다!) 이렇게 단순히 누적된 초 시간으로는 두 시점의 선/후 관계를 파악하는 등의 단순 비교 작업은 가능하지만, 구체적인 날짜나 요일에 연관된 작업을 하기는 매우 어렵다. 예를 들어 올해 크리스마스가 무슨 요일인지를 구하는 일은 NSDate 객체 만으로는 사실상 매우 힘들다.
더 보기 »(Cocoa) 날짜와 시간을 다루기

[OSX] 메인 윈도우 컨트롤러를 앱델리게이트에서 분리하기

iOS 앱의 경우에는 UIApplication 객체가 생성되면 해당 앱의 델리게이트가 런칭 직후의 일을 처리한다. 이 때 앱의 윈도우가 처음으로 표시할 초기 뷰 컨트롤러의 뷰를 윈도우에 보여주게 된다. 그 이후부터는 화면 단위로 각 뷰의 뷰 컨트롤러 및 여러 MVC의 컨트롤러와 여러가지 디자인패턴을 통해 상호작용하면서 앱을 구성하면 된다. 이에 비해 맥용 앱을 Xcode로 작성하고자 하면 이 “메인 컨트롤러”가 다름 아닌 앱 델리게이트 객체라는 점에서 좀 의아하게 생각된다. 즉, 메인 윈도우에 대해서는 별도의 컨트롤러가, 만약 또 다른 윈도를 생성한다면, 역시나 해당 윈도에 대해서는 별도의… 더 보기 »[OSX] 메인 윈도우 컨트롤러를 앱델리게이트에서 분리하기

[Objective-C] 키밸류 코딩

객체는 그 내부에 어떤 값을 저장하고, 접근자(accessor)라 불리는 메소드를 통해서 이 값에 접근한다. Objective-C에서는 내부 변수(ivar라 한다)와 그에 대한 접근자 메소드를 합쳐서 “프로퍼티”라는 개념으로 다룬다. 이 때 프로퍼티의 이름을 나타내는 문자열을 키(key)로 하여 그 값에 액세스하는 것을 키-밸류 코딩이라고 한다. 즉, 어떤 객체 내부의 값에 접근하려 할 때, 접근자 메소드를 호출하는 것이 아니라, 그 프로퍼티의 이름을 나타내는 문자열값을 사용하여 객체의 프로퍼티 값을 간접적으로 읽거나 쓰는 것을 말한다. 키밸류 코딩은 코코아에서 제공하는 여러 가지 기술을 사용하기 위한 전제 조건이기도 하다. 따라서… 더 보기 »[Objective-C] 키밸류 코딩