ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 읽기라도 하자! 나를 위한 Objective-C 속성 문법 정리
    Objective-C 2021. 10. 11. 00:33

    기초

    C언어 상위 호환

    Objectvie-C는 이름에서도 볼 수 있듯이 C랑 비슷하다. 기본 문법은 거의 C언어를 따른다고 보면 된다.

    • .h의 헤더 파일과 .m의 구현 파일 2개가 존재한다.  
      • 헤더 파일에는 클래스나 변수, 메서드 등을 선언해 두고, .m 파일에서 자세한 구현 사항을 기술한다.
    • 세미콜론 사용
    • 한 문장이 끝나면 세미콜론을 꼭 써준다!
    • /* */ 로 주석을 달 수 있다.
    • 접근 제한에 관련한 키워드 유의!

     

    로그 출력

    • NSLog
    • %d, %@ 등 이용
    NSLog(@"count: %d \\n", sizeof(int)); // 숫자 출력 
    NSLog(@"Hi! %@ \\n", name); // 문자 출력

    NSLog는 Xcode에서 Build Configuration이 Debug일 때만 출력된다.

     

    • printf
    NSString *name = @"이름"; 
    printf("print NSString %s \\n", [name UTF8String]);

    NSString을 printf로 출력할 때는 UTF8String으로 변환해서 사용.

     

    기본 문법

    변수

    • 인스턴스 변수
      @interface ViewController : UIViewController { 
      	NSString *title; 
      }
      예시의 title 변수. 자기 자신과 자신을 상속받은 자식 클래스에서만 사용가능한 접근제한을 가진다 (protected)

     

    • 프로퍼티 (변수)
      @property NSString *title;
      프로퍼티는 getter, setter를 자동으로 생성해 준다.  따라서 외부에서 접근이 가능함.
      @property (readonly) NSString *id;​
      외부에서 해당 변수를 읽기만 허용하고 싶으면 (readonly) 키워드를 붙여준다.

     

    • 전역 변수, static 키워드
      int value1; 
      static int value2;
      일반적으로 선언문 (@interface-@end) 사이 밖에서 선언하면 전역 변수로 사용된다. static 키워드 해당 변수의 접근 제한 범위를 지정하는데, static 키워드가 붙은 변수는 선언된 파일 내에서만 접근 가능하다. 만약 메서드 내부에서 static 키워드로 선언된 변수가 있다면, 그 변수는 해당 메서드 내부에서만 사용 가능하다.

    +) extern

    -(void)printValue1{ 
    	extern int value1; 
    }

    value1은 static 키워드가 없기 때문에 다른 파일에서도 접근 가능하다. 다른 파일에서 해당 변수를 사용할 때 extern 키워드를 붙여준다. extern은 메서드에서도 사용한다.

     

     

    헤더 파일

    • #import
      #import <UIKit/UIKit.h>
      외부 라이브러리, 프레임워크, 프로젝트 내에 있지만 다른 파일에 선언된 클래스를 사용할 때 import 해준다. (swift와 다른점!)

     

    • @interface/@end
      @interface ViewController : UIViewController 
      @end
      @interface - @end 가 하나의 쌍으로 이 사이에 클래스, 변수, 메서드 등의 선언을 한다.

     

    • 메서드 선언
      - (void)name;

     

    • 클래스 상속
      @interface ViewController : UIViewController
      swift 에서와 마찬가지로 : 뒤에 상속할 클래스 명을 써준다. 단일 상속만 가능.

     

    • 프로토콜 채택
      @interface MyClass : NSObject <NSCoding, NSCopying>
      프로토콜을 채택할 때에는 <> 를 이용한다.

     

    구현 파일

    • #import
      #import "ViewController.h"
      헤더 파일이 있으면 자신의 헤더 파일을 반드시 import 해야한다. .h 파일에서 import한 내용들을 .m에서 import 할 필요는 없다. import문에는 세미콜론 안씁니다!

     

    • @interface/@end
      @interface ViewController () 
      @end
      구현 파일에서 위와 같이 쓰면 프로퍼티나 인스턴스 변수, 메서드를 private로 사용한다. (extension과 비슷)

     

    • @implementation/@end
      @implementation ViewController 
      
      - (void)viewDidLoad { 
      	[super viewDidLoad]; 
          // Do any additional setup after loading the view. 
      } 
      
      @end
      구현부로 메서드를 직접 구현한다.

     

    클래스

    개요

    Objective-C는 대부분의 객체가 상속받는, 가장 기본적인 기능을 기술하고 있는 루트 클래스인 NSObject를 정의한다.

     

     

    @interface Person : NSObject 
    
    @property NSString *name; 
    @property NSString *sex; 
    
    @end

    클래스 정의는 다음과 같이 한다.

    우선 가장 기본적인 기능을 기술하는 루트 클래스인 NSObject 클래스를 상속받고 해당 클래스가 public하게 상호작용 하기 위한 방식을 @interface - @end 키워드 쌍 사이에 작성해줄 것이다.

     

     

    💡클래스 이름은 앱, 심지어 앱에 포함되는 다른 라이브러리나 프레임워크 내에서의 다른 클래스와도 겹치면 안된다! 따라서 일반적인 클래스 이름 앞에 접두어가 붙는 경우가 많다!

    @interface WLPerson : NSObject

    person앞에 WL 이라는 나만의 접두어를 붙여서 중복을 피한다.

     

    변수

    위의 예에서 Person 클래스는 Objective-C 객체인 NSString 타입의 name, sex 변수를 갖는다.

    Objective-C 객체이기 때문에 변수명 앞에 *를 표시해준다.

    @property NSNumber *yearOfBirth; 
    @property int yearOfBirth;

    숫자 타입 변수를 선언하고 싶으면 이렇게 2가지 방법이 있다.

     

    메서드

    - (void)myMethod;

    반환 값 및 매개변수가 없는 메소드 선언은 다음과 같이하고, - 기호는 인스턴스 메서드임을 나타낸다. (클래스 메서드와 다르다!)

    인스턴스 메서드는 해당 클래스의 모든 인스턴스에서 사용가능함.

     

    - (void)myMethodWithParameter:(Type명)value; 
    - (void)myMethodWithFirstValue:(Type명)value1 secondValue:(Type명)value2;

    매개변수를 가지는 메서드를 위와 같이 선언한다.

    매개변수가 여러개일 때가 좀 특이한데, 저 secondValue: 부분까지 함수의 이름, 즉 myMethodWithFirstValue:secondValue: 가 함수명이 되기 때문에 파라미터 순서를 바꾼다거나 할 수 없다. 단 value1, value2 부분 이름은 마음대로 써도 됨.

     

    + (id)string;

    클래스 메서드는 인스턴스 메서드와 달리 + 기호를 가진다. 클래스 메서드는 인스턴스 메서드와 달리 인스턴스를 생성하지 않고 클래스 그 자체로 사용할 수 있는 메서드. 인스턴스 내부의 메서드와 관련없이 클래스가 같으면 같은 결과를 낼 때 사용.

     

     


    여기까지가 Objective-C의 가장 기본적인 내용이랑 apple의 Objective-C 프로그래밍 가이드의 제일 첫 장,

    "Defining Classes" 의 내용이다. 

    다음부터는 프로그래밍 가이드 내용을 번역하고 공부해가면서 포스팅 해봐야지~ 

     

     

     

     

    참고 자료

    About Objective-C

    Objective-C) Swift 개발자를 위한 Objective-C (1) - .h 파일 살펴 보기

    https://www.tutorialspoint.com/objective_c/objective_c_basic_syntax.htm

    printf와 NSLog에 NSString 출력하기

    [Objective-C] 정적변수, static, extern

    댓글

Designed by Tistory.