본문 바로가기

아이폰 개발/Objective C19

메모리 관리 메모리 관리 객체의 일생 살아있는 벌이나 새와 마찬가지로 프로그램의 객체에도 일생이 있다. 객체는 alloc 이나 new로 태어나고, 메시지를 받고 일을 하면서 살아가면서 컴포지션이나 메소드의 인수들을 통해 친구를 만들고, 일생이 끝날 때 해제되어 결국 죽는다. 객체의 일생이 끝나면 그 객체가 사용하던 메모리는 말끔하게 재활용되어 다음에 태어날 객체를 위해서 사용된다. 참조횟수 객체가 끝날때를 어떻게 알 수 있을까? 참조횟수라는 방법을 사용한다. 모든 객체는 그 객체의 참조횟수라고 하는 정수 값을 가지고 있다. 어떤 코드에서 그 객체를 사용하고 있다면, 그 코드는 객체의 참조횟수를 증가시켜서 "이 객체가 사용되고 있다" 라고 알려준다. 그 코드가 객체 사용을 다 끝내면 참조횟수를 줄여서 객체가 더 이상 .. 2021. 2. 22.
컴포지션 컴포지션이란 무엇인가? 컴포지션은 각기 다른것으로 큰 하나를 만들 수 있는 것을 말한다. 소프트웨어로 외발 자전거를 만든다고 할 때, 페달 객체와 타이어 객체를 조립해 구성하는 것도 컴포지션이라 할 수 있다. 오브젝티브 c 에서는 객체를 가리키는 인스턴스 변수로 컴포지션을 만들 수 있다. 참고 앞의 포스팅 Shape Object 프로그램에서 이미 컴포지션을 사용했다. Shape 클래스는 사각형과 색깔로 된 요소를 사용하고 있다. 그러나 엄밀히 따지면 객체를 사용하는 것만 컴포지션에 해당한다. int, float, enum, struct 와 같은 기본타임은 그냥 객체의 한부분이라고 생각하면 된다. NSLog 수정 NSLog()는 객체를 출력하기 위해 %@ 형식 지정자를 사용한다. %@지정자를 처리할 때 객.. 2021. 2. 22.
상속 예제 상속 예제 지난 포스팅(객체지향 프로그래밍 예제)에서 객체지향 예제를 알아봤는데, 도형을 그릴때 중복되는 변수와 메소드가 너무 많았다. 이번에는 상속을 통해서 코드를 줄여 보자. 우리가 머리 색깔이나 코 등을 부모님으로 부터 상속을 받는 것처럼, oop 에서 상속은 그 클래스가 다른 클래스로부터 특성을 물려받는 다는 것을 의미한다. 그 다른 클래스를 부모 클래스나 수퍼클래스라고 부른다. 원과 사각형은 Shpae으로 부터 상속을 받았기 때문에 Shpae의 두 인스턴스 변수를 갖는다. 참고: 상속 받는 인스턴스 변수들의 값을 직접 변경하는 것은 좋은 코딩 습관이 아니다. 인스턴스 변수를 변경하기 위해서는 변경하는 메소드를 만들어 사용하도록 한다. 상속 예제 코드 #import //모양 - 삭제 됨 //typ.. 2021. 2. 1.
객체지향 프로그래밍 예제 객체지향 프로그래밍 예제 모든길은 인다이렉션으로 통한다. 인다이렉션은 어떤일을 내가 직접하는 것이 아니라 다른 사람에게 부탁한다는 의미이다. 어떤 코드를 작성했는데, 이 코드가 다른 코드를 호출하고, 다른 코드는 또 다른 코드를 호출해서 내가 직접 처리하지 않지만 여러 경로를 거쳐 결국에 결과를 가져오는 식이다. 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 .. 2021. 2. 1.
objective c 프로토콜 3 - 비공식 프로토콜 objective c 프로토콜 3 - 비공식 프로토콜 공식 프로토콜은 고유한 이름을 가지며 @protocol [이름]을 가지고 선언된 프로토콜 중 클래스나 카테고리에 채용(상속)된 프로토콜을 뜻한다. 비공식 프로토콜은 NSObject 클래스에 추가된 카테고리 메소드를 뜻한다. 외형적으로 프로토콜 형식을 가지지 않는다. 이전 포스팅에서 NSObject 에 (Dummy)로 추가된 프로토콜 메소드는 비공식 프로토콜이라고 해야하나? 이 경우에는 프로토콜이다. 왜냐면 라는 프로토콜 이름을 가지고 있기 때문이다. 비공식 프로토콜이란 NSObject에 추가된 카테고리 메소드만을 뜻한다. 왜 이런 개념을 도입했나? 언제든지 선택적으로 메소드를 정의하거나 정의하지 않아도 되는 여분의 메소드 집합을 표현하기 위해서이다. .. 2020. 12. 31.
objective c 프로토콜 2 - 프로토콜의 채용, 상속 카테고리화 objective c 프로토콜 2 - 프로토콜의 채용, 상속 카테고리화 프로토콜은 가상메소드의 모음이며, 다중상속을 위해 태어났기 때문에, 채용되는 프로토콜 개수의 제한은 없다. 이럴 경우, 콤마로 구분하여 채용할 프로토콜을 여러개 나열하면 된다. @interface ClassWithProtocol : Ancestor 아래 예에서 클래스 ClassWithProtocol을 선언하는 과정에서 우선 Ancestor라는 클래스를 상속받고 있다. 이 Ancestor는 NSObject를 직접 또는 간접적으로 상속받을 것이다. ClassWithProtocol 클래스는 두개의 프로토콜 와 를 상속 받고 있다. 클래스의 상속은 단일 상속만 가능하지만 프로토콜의 상속은 다중상속이 가능하다. 위의 예는 클래스가 다중 프로토.. 2020. 12. 31.
objective c 프로토콜 1 objective c 프로토콜 1 이전 포스팅에서 알아본 카테고리와 가상 클래스, 가상 메소드는 한계가 있다. 즉, 카테고리와 가상 클래스는 선언되고 구현된 어떤 특정 클래스에만 영향을 미친다는 것이다. 카테고리는 특정한 클래스에 메소드를 추가하는 방법이고, 가상클래스는 objective c의 다형성을 이용하여 가상메소드로 전달된 명령을 각 서브클래스가 자신의 특성에 맞게 상세 명령으로 수행하는 방법이다. 위의 카테고리는 현재 클래스를 수평적으로 확장하는 역할을 하고, 가상함수는 현재 클래스를 수직적으로 확장하는 역할을 한다. 메소드 확장을 다중상속은? 메소드 확장을 통한 다중상속 개념을 구현하기 위해서는 서로 다른 클래스에 동일하게 적용할 수 있는 메소드 확장클래스 기법이 필요하다. 이를 위해 objc.. 2020. 12. 31.
objective c 클래스 클러스터의 서브 클래스 objective c 클래스 클러스터의 서브 클래스 NSObject는 클래스 클러스터로 구성되지 않기 때문에 이것의 서브클래스를 만드는것은 전혀 문제가 없다. 그러나 기초 프레임워크에서 제공하는 NSObject 이외의 클래스의 서브클래스를 만드는 것에는 신중하여야 한다. 애플 문서에도 명시되어 있지 않은 클래스 클러스터가 숨어 있기 때문이다. 예를들면 NSString의 서브 클래스를 사용자가 만들경우 실제 동작하던 NSString의 메소드는 비공개 서브 클래스의 메소드이므로 서브클래싱이 형성되면서 기존의 메소드는 동작하지 않게 된다. 이 문제를 해결하려면 아래와 같은 몇가지 방버이 있다. 1. 서브클래스 대신 카테고리로 사용자가 원하는 메소드를 추가한다. 대신 인스턴스 변수 추가가 불가능하기 때문에 완전.. 2020. 12. 30.
objective c 클래스 클러스터(추상클래스) objective c 클래스 클러스터(추상클래스) 추상(버추얼) 클래스란 추상메소드 (아직 정의되지 않고 선언만된 메소드)를 포함하고 있는 클래스를 뜻한다. 이 추상클래스의 개념은 아래 그림과 같이 UML에도 정의되어 있을 만큼 객체지향 언어에서 필수적인 요소지만, obj c 에서는 추상클래스 기능을 별도로 제공하지 않는다. 그러나 어떤 측면에서는 obj c의 모든 클래스는 잠재적으로 추상클래스 상태라고 볼 수 있다. 위의 추상 클래스를 obj c로 표현하면 아래와 같이 일반 클래스와 동일한 방법으로 작성한다. 다른 언어와 달리 virtual 또는 interface 같은 키워드는 존재 하지 않는다. 이런 이유로 alloc/init을 통해 geometry 클래스를 실제로 선언하는 것도 문제가 되지 않는다... 2020. 12. 29.