메모리 관리 객체의 일생 살아있는 벌이나 새와 마찬가지로 프로그램의 객체에도 일생이 있다. 객체는 alloc 이나 new로 태어나고, 메시지를 받고 일을 하면서 살아가면서 컴포지션이나 메소드의 인수들을 통해 친구를 만들고, 일생이 끝날 때 해제되어 결국 죽는다. 객체의 일생이 끝나면 그 객체가 사용하던 메모리는 말끔하게 재활용되어 다음에 태어날 객체를 위해서 사용된다. 참조횟수 객체가 끝날때를 어떻게 알 수 있을까? 참조횟수라는 방법을 사용한다. 모든 객체는 그 객체의 참조횟수라고 하는 정수 값을 가지고 있다. 어떤 코드에서 그 객체를 사용하고 있다면, 그 코드는 객체의 참조횟수를 증가시켜서 "이 객체가 사용되고 있다" 라고 알려준다. 그 코드가 객체 사용을 다 끝내면 참조횟수를 줄여서 객체가 더 이상 ..
컴포지션이란 무엇인가? 컴포지션은 각기 다른것으로 큰 하나를 만들 수 있는 것을 말한다. 소프트웨어로 외발 자전거를 만든다고 할 때, 페달 객체와 타이어 객체를 조립해 구성하는 것도 컴포지션이라 할 수 있다. 오브젝티브 c 에서는 객체를 가리키는 인스턴스 변수로 컴포지션을 만들 수 있다. 참고 앞의 포스팅 Shape Object 프로그램에서 이미 컴포지션을 사용했다. Shape 클래스는 사각형과 색깔로 된 요소를 사용하고 있다. 그러나 엄밀히 따지면 객체를 사용하는 것만 컴포지션에 해당한다. int, float, enum, struct 와 같은 기본타임은 그냥 객체의 한부분이라고 생각하면 된다. NSLog 수정 NSLog()는 객체를 출력하기 위해 %@ 형식 지정자를 사용한다. %@지정자를 처리할 때 객..
상속 예제 지난 포스팅(객체지향 프로그래밍 예제)에서 객체지향 예제를 알아봤는데, 도형을 그릴때 중복되는 변수와 메소드가 너무 많았다. 이번에는 상속을 통해서 코드를 줄여 보자. 우리가 머리 색깔이나 코 등을 부모님으로 부터 상속을 받는 것처럼, oop 에서 상속은 그 클래스가 다른 클래스로부터 특성을 물려받는 다는 것을 의미한다. 그 다른 클래스를 부모 클래스나 수퍼클래스라고 부른다. 원과 사각형은 Shpae으로 부터 상속을 받았기 때문에 Shpae의 두 인스턴스 변수를 갖는다. 참고: 상속 받는 인스턴스 변수들의 값을 직접 변경하는 것은 좋은 코딩 습관이 아니다. 인스턴스 변수를 변경하기 위해서는 변경하는 메소드를 만들어 사용하도록 한다. 상속 예제 코드 #import //모양 - 삭제 됨 //typ..
객체지향 프로그래밍 예제 모든길은 인다이렉션으로 통한다. 인다이렉션은 어떤일을 내가 직접하는 것이 아니라 다른 사람에게 부탁한다는 의미이다. 어떤 코드를 작성했는데, 이 코드가 다른 코드를 호출하고, 다른 코드는 또 다른 코드를 호출해서 내가 직접 처리하지 않지만 여러 경로를 거쳐 결국에 결과를 가져오는 식이다. 1.파일이름을 통한 인다이렉션 단어의 길이를 출력하는 프로그램이다. //단어 개수 출력 1 void showWordsCount (){ const char *words[4] = {"car" , "my book" , "working" , "running"}; int wordCount = 4; for (int i = 0; i < wordCount; i++) { NSLog(@"%s 단어 개수는 %lu ..
objective c 프로토콜 3 - 비공식 프로토콜 공식 프로토콜은 고유한 이름을 가지며 @protocol [이름]을 가지고 선언된 프로토콜 중 클래스나 카테고리에 채용(상속)된 프로토콜을 뜻한다. 비공식 프로토콜은 NSObject 클래스에 추가된 카테고리 메소드를 뜻한다. 외형적으로 프로토콜 형식을 가지지 않는다. 이전 포스팅에서 NSObject 에 (Dummy)로 추가된 프로토콜 메소드는 비공식 프로토콜이라고 해야하나? 이 경우에는 프로토콜이다. 왜냐면 라는 프로토콜 이름을 가지고 있기 때문이다. 비공식 프로토콜이란 NSObject에 추가된 카테고리 메소드만을 뜻한다. 왜 이런 개념을 도입했나? 언제든지 선택적으로 메소드를 정의하거나 정의하지 않아도 되는 여분의 메소드 집합을 표현하기 위해서이다. ..
objective c 프로토콜 2 - 프로토콜의 채용, 상속 카테고리화 프로토콜은 가상메소드의 모음이며, 다중상속을 위해 태어났기 때문에, 채용되는 프로토콜 개수의 제한은 없다. 이럴 경우, 콤마로 구분하여 채용할 프로토콜을 여러개 나열하면 된다. @interface ClassWithProtocol : Ancestor 아래 예에서 클래스 ClassWithProtocol을 선언하는 과정에서 우선 Ancestor라는 클래스를 상속받고 있다. 이 Ancestor는 NSObject를 직접 또는 간접적으로 상속받을 것이다. ClassWithProtocol 클래스는 두개의 프로토콜 와 를 상속 받고 있다. 클래스의 상속은 단일 상속만 가능하지만 프로토콜의 상속은 다중상속이 가능하다. 위의 예는 클래스가 다중 프로토..