광어네 맛집

[Objective C] self & _ 비교 본문

Objective-C [레거시 뿌수기!]/Objective-C

[Objective C] self & _ 비교

Lautner Jacob 2022. 4. 22. 12:17
728x90
반응형

이제 날씨도 더워지고 봄은 어디갔나 ㅜㅜ

오늘은 self와 _를 비교하고자 함!

바로 알아봅시다!

 


 

'self' 는 setter & getter 속성을 통해 액세스함!

'_'는 직접 액세스 함! ( 즉, setter & getter를 거치지 않음 )

 

이걸 몰랐을 때는 둘 다 같은 개념인줄;

다음 예시를 봅시다

 

다음과 같이 헤더 파일을 설정해주고

메인 파일에서는 받은 값을 setter를 통해서 입력해줍니다!

//Header file
@property (nonatomic, strong) NSString *tesNaming;

//Main file
- (void)setTestNaming:(NSString *)testNaming {
  self.testNaming = testNaming;
}

 

여기까지는 문제 없음!

근데 사용할 때가 문제임;

 

위에서 구현한 함수를 다음과 같이 사용하면 에러남

// viewDidLoad 내부

[self setTestNaming:@"물개"];

 

왜냐면 self내부에서 self를 받으니까 무한 반복이 됨

한참 뒤에 에러가 어떻게 뜨냐면 ㅋㅋㅋㅋㅋㅋ

 

그래서 우리는 외부에서 받을 때 self를 쓰면 안됨

아래처럼 써야함

//Main file
- (void)setTestNaming:(NSString *)testNaming {
  _testNaming = testNaming;
}

 

그럼 self는 쓰지마?

이건 또 아님! 

때에 따라 다른데 

 

// ViewDidLoad 내부
[self underBarInputNaming:@"고양이"];
[self selfInputNaming:@"강아지"];
NSLog(@"%@는 외부에서 입력한 값", self.testNaming);
NSLog(@"%@는 외부에서 입력한 값", _testNaming);

// Function 구현
- (void)selfInputNaming:(NSString *)name {
  NSLog(@"입력한 이전 값은 %@입니다 테스트 중!", self.testNaming);
  self.testNaming = name;
  NSLog(@"입력한 이후 값은 %@입니다 테스트 중!", self.testNaming);
  NSLog(@"입력한 값은 %@입니다 테스트 중!", name);
}

- (void)underBarInputNaming:(NSString *)name {
  NSLog(@"입력한 이전 값은 %@입니다 테스트 중!", _testNaming);
  _testNaming = name;
  NSLog(@"입력한 이후 값은 %@입니다 테스트 중!", _testNaming);
  NSLog(@"입력한 값은 %@입니다 테스트 중!", name);
}

 

결과는 잘 동작함!

 

마지막으로 정상적인 코드와 결과는 아래와 같음!

// ViewDidLoad 내부
[self setTestNaming:@"물개"];

// Function
- (void)setTestNaming:(NSString *)testNaming {
  _testNaming = testNaming;
}

 

 


 

너무 많이 프린트했나;

성격 상 이것도 궁금하고 저것도 궁금해서 한번 다 프린트 해봄!

 

그럼 오늘도 화이팅!

 

 

 

728x90
반응형