1. 사전 프로젝트 코드 세팅하고 오기
https://growingsaja.tistory.com/869
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. 많이 사용하는 형태의 클래스 예시 코드 실행 결과 확인
'Development > iOS' 카테고리의 다른 글
[Objective-C] 입문하기 - 15 : extern const 사용해 외부 공유 가능한 상수 정의 및 호출 (0) | 2023.06.30 |
---|---|
[Objective-C] 입문하기 - 14 : 날짜 데이터 활용 및 타이머 구현 실습 (0) | 2023.06.27 |
[Objective-C] 입문하기 - 12 : Encoding, Decoding 예제 (0) | 2023.06.26 |
[Objective-C] 입문하기 - 11 : String을 활용한 소스코드 - 응용 (0) | 2023.06.26 |
[Objective-C] 입문하기 - 10 : String을 활용한 소스코드 - 기본 (0) | 2023.06.23 |