Haru's 개발 블로그

[Objective-C] 기본 표기법 및 객체 지향 프로그래밍 본문

IOS/Objective-C

[Objective-C] 기본 표기법 및 객체 지향 프로그래밍

Haru_29 2023. 2. 27. 23:31

NSLog

  • 디버그 영역의 콘솔에 정보 출력하기
  • NSLog(@”문자열 포맷”,인자)
  • 문자열: @”문자열”
  • 포맷 문자열과 인자 대치

포맷 문자열

  • 정수형
    • %d, %u(unsigned)
    • %ld, %lu(long 타입)
  • 실수형
    • %f, %e(지수형)
  • 16진수, 8진수
    • %x,%o
  • 객체형
    • %@
  • 다수의 데이터 사용
    • NSLog(@”%d + %d = %d”, 1, 2, (1+2));
  • 포맷 문자열

 

클래스

어플리케이션이란?

  • 컨텐츠를 얻어와서 사용자에게 출력
  • 사용자의 동작에 반응하여 컨텐츠 가공
  • 컨텐츠의 공유

이때 어플리케이션에서 클래스란?

  • 데이터와 데이터를 조작하는 행위의 단위

객체

  • 실제 데이터가 반영하여 동작 중인 개체(instance, object)
  • 클래스에서 객체 생성

객체 생성하기

  • 객체 생성: 객체 생성하는 행위를 동작
  • 객체 생성 메소드 표기
    • [[”클래스 이름” alloc]init]
  • NSObject 객체 생성하는 코드
    • [[NSObject alloc]init]
  • 객체 생성 → 메모리 공간에 할당
  • 주소: 읽고 쓰기 어렵다 ex)0x100114580
  • 사용하기 쉽도록 포인터 이용
    • NSObject *obj = [[NSObject alloc]init];
  • 하나의 객체에 다수의 포인터 사용
    • NSObject *obj2 = obj;

  • 객체 및 포인터 만들어보고 확인해보기

 

메소드란?

  • 메소드 : 클래스의 행위를 정의
  • 동작 수행 : 객체에 메소드를 호출
  • 메세지 : 객체에 메소드를 호출해서 동작 수행
  • 리시버 : 메세지를 받아서 종작을 수행하는 객체
  • 센더 : 메세지를 보내는 객체
  • Objective-C에서 NSString 클래스의 length 메소드란?
    • (NSUInteger)length
  • 메소드 호출 표기 : [리시버 메세지]
  • 문자열 객체에 length 메소드 호출
    • [str length];
  • 메소드 연속 호출
    • [[NSString alloc] init]
  • 객체가 동작 결과를 센더에게 알려주는 법
    • length 메소드 : 정수형 반환값
      • (NSUInteger)length
    • 반환값 저장하기
      • NSUInteger length = [str length];
    • void : 반환값이 없는 경우
      • (void)appendString:(NSString *)aString;

 

매소드 선언에서 데이터 타입 정의

  • 메소드 실행 과정에서 정보받기 → 메소드의 실행 결과를 반환

Objective-C에서 원시 타입

  • 씨 언어의 원시 타입을 그대로 사용
  • 정수형
    • char, short, int, long
  • 실수형
    • float, double, long double
  • 부울형은 BOOL 사용, YES나 NO
    • BOOL b = YES;
  • NSInteger : 플랫폼 별 크기 설정
    • iOS 환경
    • 32비트 환경: int, 4바이트
    • 64비트 환경: long, 8바이트
  • NSUInteger : unsigned
  • 반환값, 파라미터가 객체 : 클래스 이름과 *
    • (NSString *)uppercaseString;
  • 구조체, *없이 사용
    • (NSRange)rangeOfString:(NSString *)aString;

메소드 구현 실습

  1. length 메소드 실습
  2. NSString에 정의된 다른 메소드 사용하기

 

 

메소드의 파라미터

  • 메소드 호출시 정보 전달
  • 파라미터 레이블과 콜론(:) 사용

NSString의 compare 메소드

  • (NSComparisonResult)compare:(NSString *)string
  • (NSComparisonResult)compare:(NSString *)string options: (NSStringCompareOptions)mask
  • (NSComparisonResult)compare:(NSString *)string options: (NSStringCompareOptions)mask range:(NSRange)compareRange
  • 콜론 사용, 메소드 레이블
  • 반환 타입 : NSComparisonResult
  • enum으로 정의된 상수
typedef NS_ENUM(NSInterger, NSComparisonResult) {
	NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending
};

파라미터가 정의된 메소드 구현 실습

 

인스턴스 메소드와 클래스 메소드

  • 클래스 메소드
    • (+) 기호 사용
    • 리시버가 클래스
    • alloc 메소드, 팩토리 메소드
  • 메소드 정의 예제
      • (instancetype)string;
  • 인스턴스 메소드
    • (-) 기호 사용
    • 리시버가 객체
    • 객체 생성 과정 필요
    • 객체에 설정된 정보 사용 가능
  • 메소드 정의 예제
    • -(NSUInteger)length;
  • 객체를 생성하는 메소드
    • alloc/init
  • 다양한 init 계열의 메소드(NSString 클래스)
    • -(id)init;
    • -(id)initWithString:(NSString *)aString;
    • -(id)initWithFormat:(NSString *)format, …;
    • -(id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding;
NSString *str1 = [[NSString alloc]initWithString:@"Hello Objective C"];
NSString *str2 = [[NSString alloc]initWithFormat:@"Hello %@", @"Objective C"];
NSLog(@"str1 :%@",str1);
NSLog(@"str2 :%@",str2);

팩토리 메소드

  • 팩토리 메소드 : 객체를 생성하는 목적의 코드 작성 패턴
  • 팩토리 메소드 이름 : 클래스의 이름으로 시작
  • NSString 클래스의 팩토리 메소드
      • (instancetype)string;
      • (instancetype)stringWithString:(NSString *)string;
      • (instancetype)stringWithFormat:(NSString *)format, …
      • NS_FORMAT_FUNCTION(1,2)
  • 코드 예제
    • NSString *str = [NSString stringWithFormat:@”Hello %@”,@”Objective C”];
    NSString *str1 = [NSString stringWithString:@"Factory Method"];
    NSString *str2 = [NSString stringWithFormat:@"Factory : %@", @"Method"];
    NSLog(@"str1 : %@", str1);
    NSLog(@"str2 : %@", str2);
    

포인터 nil

  • nil : 아무런 객체를 가리키지 않는 상태
  • 포인터 변수만 선언한 경우
  • nil 상태를 이용한 객체 생성(Lazy Initialization)
NSString *str;
        NSLog(@"str : %@", str);
        if (nil == str) {
            str = [NSString stringWithFormat:@"Hello %@",@"Objective C"];
        }
        NSLog(@"str : %@", str);

  • nil에 메소드 호출 → 무시
  • 반환값은 0 or nil
NSString *str = nil;
// nill에다가 uppercaseString 메소드를 호출하게 되면 nill이 나옴
NSLog(@"Upper Case String : %@", [str uppercaseString]);
// nill에다가 length라는 메소드를 호출하게되면 0이 나옴
NSLog(@"Length : %lu", (unsigned long)[str length]);

Comments