1. 사전 프로젝트 코드 세팅하고 오기

 

https://growingsaja.tistory.com/869

 

[Objective-C] 프로젝트 기본 세팅 소스코드 예시

1. AppDelegate 수정 with 설명 // vim AppDelegate.h #import // MARK: - [클래스 설명] /* // ----------------------------------------- 1. 애플리케이션 딜리게이트 (선언부) 2. 전역변수 , 메소드 , 인스턴스변수 (클래스 생

growingsaja.tistory.com

 

 

 

 

 

2. 클래스, 인스턴스 메소드 사용 기본 예제 소스코드

 

 - 공부용 소스 코드이므로, 실질적으로 많이 쓰는 형태는 아닙니다.

 - 실질적으로 많이 쓰는 형태의 소스 코드는 본 게시글의 4번에서 확인할 수 있습니다.

 

// vim Test/TestClass.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>


// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. TestClass (선언부)
2. 전역변수 , 메소드 , 인스턴스변수 (클래스 생성자) 등 선언
// -----------------------------------------
*/



// -----------------------------------------
/*
MARK: [요약 설명]
1. objc 에서는 객체 인스턴스를 생성하기 위해서 우선, 메모리 할당 >> 다음, 초기화를 진행합니다
2. 클래스 생성자 초기화는 헤더 h 파일에 선언된 @interface 내부에 선언합니다
*/
// -----------------------------------------



// -----------------------------------------
// [클래스 내부 함수로 구현 실시]
@interface TestClass : NSObject {
    
    // [클래스 생성자 초기화 변수 선언]
    NSString *name;
    int age;
}


// [일반 클래스 생성자 초기화]
-(id) init;


// [데이터 사용해 클래스 생성자 초기화]
-(id) initName:(NSString *)nameData initAge:(int)ageData;


// [인스턴스 메소드 선언 실시]
-(NSString *) formatInfo;

-(NSString *) nameInfo;
-(int *) ageInfo;



@end
// -----------------------------------------

 

// vim Test/TestClass.m

#import <Foundation/Foundation.h>


// MARK: - [헤더 파일 imort]
// -----------------------------------------
#import "TestClass.h"
// -----------------------------------------



// MARK: - [몸체 [구현부] 정의]
// -----------------------------------------
@implementation TestClass
// -----------------------------------------



// MARK: - [일반 init 클래스 생성자 정의]
- init {
    self = [super init];
    if (self != nil){
        
        // [변수값 널 데이터 삽입]
        name = @"홍길동";
        age = 0;
    }
    return self;
}



// MARK: - [데이터 삽입 init 클래스 생성자 정의]
- (id) initName:(NSString *)nameData initAge:(int)ageData {
    self = [super init];
    if (self != nil){
        name = nameData; // 변수에 인풋으로 들어온 데이터 삽입
        age = ageData; // 변수에 인풋으로 들어온 데이터 삽입
    }
    return self;
}



// MARK: - [변수값 리턴 반환 메소드 구현 실시]
- (NSString *) formatInfo {
    
    // [변수 값을 포맷해서 리턴 NSString 에 담고 반환 실시]
    return [NSString stringWithFormat:@"이름=%@ , 나이=%d", name, age];
}

// MARK: - [변수값 리턴 반환 메소드 : 이름]
- (NSString *) nameInfo {
    return name;
}

- (int *) ageInfo {
    return &(age);
}


// -----------------------------------------
@end
// -----------------------------------------

 

// vim ViewController.m

// ViewController.h 파일을 import하여 해당 클래스의 정의를 가져옵니다.
#import "ViewController.h"
#import "Test/TestClass.h"

// MARK: - [헤더 [선언부] 호출]
@interface ViewController ()
@end
@implementation ViewController



// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. ViewController (구현부)
2. ios 13 이상 사용 : API_AVAILABLE(ios(13.0))
// -----------------------------------------
*/



// MARK: - [뷰 로드 실시]
// 메서드를 구현합니다. 이 메서드는 뷰 컨트롤러의 뷰가 메모리에 로드된 후에 호출되는 메서드입니다.
- (void)viewDidLoad {
    // 부모 클래스인 UIViewController의 viewDidLoad 메서드를 호출합니다.
    [super viewDidLoad];
    NSLog(@"[ViewController >> viewDidLoad() :: 뷰 로드 실시]");
    // MARK: [프로토콜 메소드 호출 실시]
}



// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"[ViewController >> viewWillAppear() :: 뷰 로드 완료]");
}



// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"[ViewController >> viewDidAppear() :: 뷰 화면 표시]");
    
    // [테스트 메인 함수 호출]
    [self testMain];
}


// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"[ViewController >> viewWillDisappear() :: 뷰 정지 상태]");
}


// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"[ViewController >> viewDidDisappear() :: 뷰 종료 상태]");
}


// MARK: - [헤더 파일에 정의 없이 : void 메소드 구현]
- (void)testMain {
    NSLog(@"[ViewController >> testMain() :: 테스트 메소드 수행]");
    
    
    // MARK: [클래스 생성자 초기화 및 메소드 호출 실시]
    // MARK: [사전 헤더 파일 import 필요 : #import "TestClass.h"]
    
    
    // [일반 init 클래스 생성자 초기화 실시]
    TestClass *ts_1 = [[TestClass alloc] init];
    NSString *result_1 = ts_1.formatInfo; // [메소드 호출]
    NSLog(@"[일반 클래스 생성자 초기화 :: %@]", result_1);
    
    
    // [데이터 삽입 클래스 생성자 초기화 실시]
    TestClass *ts_2 = [[TestClass alloc] initName:@"사자gro~5" initAge:29];
    NSLog(@"[데이터 삽입 클래스 생성자 초기화]");
    NSString *result_2 = ts_2.formatInfo; // [메소드 호출]
    NSLog(@"[입력 정보 출력 :: %@]", result_2);
    
    NSString *resultOfName = ts_2.nameInfo;
    NSLog(@"[너 이름이 뭐니? :: I am %@!]", resultOfName);
    int *resultOfAge = ts_2.ageInfo;
    NSLog(@"[너 몇살이니? :: I'm %d years old.]", *resultOfAge);
}


// -----------------------------------------
@end
// -----------------------------------------

 

 

 

 

 

3. 클래스, 인스턴스 메소드 사용 기본 예제 소스코드 실행 결과

 

 

 

 

 

 

4. 많이 사용하는 형태의 클래스 예시 코드

 

property, instancetype 사용해 간단하게 구현할 수 있습니다.

 

// vim Test/TestClass.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>


// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. TestClass (선언부)
2. 전역변수 , 메소드 , 인스턴스변수 (클래스 생성자) 등 선언
// -----------------------------------------
*/



// -----------------------------------------
/*
MARK: [요약 설명]
1. objc 에서는 객체 인스턴스를 생성하기 위해서 우선, 메모리 할당 >> 다음, 초기화를 진행합니다
2. 클래스 생성자 초기화는 헤더 h 파일에 선언된 @interface 내부에 선언합니다
*/
// -----------------------------------------



// -----------------------------------------
// Objective-C에서 클래스를 선언하는 구문입니다.
// NSObject로부터 상속받는 것은 표준 클래스 이므로 NSObject를 상속받습니다.
@interface TestClass : NSObject

// 프로퍼티 선언을 통해 인스턴스 변수와 getter, setter 메서드를 한 번에 정의합니다.
// nonatomic: 프로퍼티에 대한 접근이 스레드 안전하지 않음을 나타냅니다. 성능 향상을 위해 사용되며 일반적으로 추가됩니다.
// strong: 참조계수를 증가시키는 소유권을 의미하며 객체가 메모리에서 해제되지 않도록 합니다. 문자열 객체에 대한 프로퍼티이므로 strong을 사용합니다.
@property (nonatomic, strong) NSString* name;

// assign: int와 같은 기본 자료형의 프로퍼티에 사용됩니다. 프로퍼티의 값만 저장하며 참조 유지를 하지 않습니다.
@property (nonatomic, assign) NSInteger age;

// initName:initAge: 메서드는 클래스를 초기화하는 생성자입니다. 초기화 작업을 수행한 후 인스턴스를 반환합니다.
-(instancetype) initName:(NSString *)nameData initAge:(int)ageData;

// updateName:fromIndex: 메서드는 이름을 수정하는 용도로 작성되었습니다.
// newIndex에서부터 newNameData로 바꾸는 작업을 수행합니다.
-(void) updateName:(NSString *)newNameData fromIndex:(int)index;

@end
// -----------------------------------------
// -----------------------------------------

 

// vim Test/TestClass.m

#import <Foundation/Foundation.h>


// MARK: - [헤더 파일 imort]
// -----------------------------------------
#import "TestClass.h"
// -----------------------------------------



// MARK: - [몸체 [구현부] 정의]
// -----------------------------------------
@implementation TestClass
// -----------------------------------------

// initName:initAge: 메서드는 이름과 나이를 매개변수로 받아 클래스 인스턴스를 초기화합니다.
- (instancetype) initName:(NSString *)nameData initAge:(int)ageData {
    // 부모 클래스의 초기화 메서드를 호출합니다.
    self = [super init];
    // 초기화가 성공적으로 이루어졌을 때 인스턴스 변수를 설정합니다.
    if (self != nil) {
        _name = nameData; // 인풋으로 들어온 데이터를 변수에 삽입합니다.
        _age = ageData; // 인풋으로 들어온 데이터를 변수에 삽입합니다.
    }
    // 초기화된 인스턴스를 반환합니다.
    return self;
}

// updateName:fromIndex: 메서드는 새로운 이름 문자열과 시작 인덱스를 매개변수로 받아 name 변수를 변경합니다.
- (void) updateName:(NSString *)newNameData fromIndex:(int)index {
    // 새로운 이름이 비어있거나 시작 인덱스가 현재 이름의 길이를 초과하는 경우, 에러 메시지를 출력하고 함수를 종료합니다.
    if (newNameData.length == 0 || index > self.name.length) {
        NSLog(@"Invalid Input. Cannot Update Name.");
        return;
    }
    
    // 현재 이름의 시작 인덱스까지의 부분 문자열을 가져옵니다.
    NSString *originalSubString = [self.name substringToIndex:index];
    // 원래 문자열과 새로운 이름 데이터를 결합하여 업데이트된 이름을 만듭니다.
    NSString *updatedName = [NSString stringWithFormat:@"%@%@", originalSubString, newNameData];
    
    // 업데이트된 이름을 현재 인스턴스의 name 프로퍼티에 설정합니다.
    self.name = updatedName;
}

// 클래스 구현부 종료
// -----------------------------------------
@end
// -----------------------------------------

 

// vim ViewController.m

// ViewController.h 파일을 import하여 해당 클래스의 정의를 가져옵니다.
#import "ViewController.h"
#import "Test/TestClass.h"

// MARK: - [헤더 [선언부] 호출]
@interface ViewController ()
@end
@implementation ViewController



// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. ViewController (구현부)
2. ios 13 이상 사용 : API_AVAILABLE(ios(13.0))
// -----------------------------------------
*/



// MARK: - [뷰 로드 실시]
// 메서드를 구현합니다. 이 메서드는 뷰 컨트롤러의 뷰가 메모리에 로드된 후에 호출되는 메서드입니다.
- (void)viewDidLoad {
    // 부모 클래스인 UIViewController의 viewDidLoad 메서드를 호출합니다.
    [super viewDidLoad];
    NSLog(@"[ViewController >> viewDidLoad() :: 뷰 로드 실시]");
    // MARK: [프로토콜 메소드 호출 실시]
}



// MARK: - [뷰 로드 완료]
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSLog(@"[ViewController >> viewWillAppear() :: 뷰 로드 완료]");
}



// MARK: - [뷰 화면 표시]
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"[ViewController >> viewDidAppear() :: 뷰 화면 표시]");
    
    // [테스트 메인 함수 호출]
    [self testMain];
}


// MARK: - [뷰 정지 상태]
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSLog(@"[ViewController >> viewWillDisappear() :: 뷰 정지 상태]");
}


// MARK: - [뷰 종료 상태]
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    NSLog(@"[ViewController >> viewDidDisappear() :: 뷰 종료 상태]");
}


// MARK: - [헤더 파일에 정의 없이 : void 메소드 구현]
- (void)testMain {
    NSLog(@"[ViewController >> testMain() :: 테스트 메소드 수행]");
    
    
    // MARK: [클래스 생성자 초기화 및 메소드 호출 실시]
    // MARK: [사전 헤더 파일 import 필요 : #import "TestClass.h"]
    
    // [데이터 삽입 클래스 생성자 초기화 실시]
    NSLog(@"[데이터 삽입 클래스 생성자 초기화]");
    TestClass *user2 = [[TestClass alloc] initName:@"사자gro~5" initAge:29];
    
    NSLog(@"[너 이름이 뭐니? :: I am %@!]", user2.name);
    NSLog(@"[너 몇살이니? :: I'm %ld years old.]", (long)user2.age);
    
    // [이름 변경]
    [user2 updateName:@"호랑이어흥이" fromIndex:4];
    NSLog(@"[근데 방급 바뀌어서 나는 %ld살 %@ 라고 해.]", (long)user2.age, user2.name);
    
}


// -----------------------------------------
@end
// -----------------------------------------

 

 

 

 

 

5. 많이 사용하는 형태의 클래스 예시 코드 실행 결과 확인

 

 

 

 

 

+ Recent posts