Swift

@discardableResult를 왜 쓰지?

GREEN.1229 2023. 6. 1. 15:34

안녕하세요. 그린입니다🍏

이번 포스팅에서는 @discardableResult에 대해 왜 쓰는지 어떨때 쓰는지에 대해 학습해보겠습니다🙋🏻

 

의문의 시작점

사실 @discardableResult에 대해 문득 왜 써야되는지 궁금해서 생각해보다가 포스팅을 하게 되었습니다.

보통 리턴 값이 존재하는 메서드를 호출 시 해당 리턴 값을 사용하지 않아도 경고 메시지를 띄워주지 않을때 사용하잖아요?

근데 생각해보면 리턴 값을 사용하지 않을거면 왜 해당 메서드를 선언할때 리턴 값을 가지게 함수 시그니처에 지정해줄까?라는 의문이 생겼어요🫠

어차피 리턴 값을 사용하지 않을거면 리턴 타입을 Void 즉 없다고 선언하는게 더 맞지 않나!?😳라고 꼬리 의문점들이 들었습니다!

 

그래서 한번 @discardableResult에 대해 알아보고 어떤 상황에서 유의미하게 쓰이는지 테스트 해보려해요!

 

@discardableResult

우선 @discardableResult의 네이밍에서도 볼 수 있듯이 discardable이라는 단어가 사용됩니다.

단어 뜻에서도 볼 수 있듯이 Result 즉, 결과를 무시한다 혹은 제외한다라는 의미로 해석할 수 있어요.

보시면 기본적으로 내장된 선언 어트리뷰트입니다.

그래서 해당 어트리뷰트를 사용하면 리턴 값을 무시할 수 있습니다.

 

간단히 예시로 한번 봐볼까요?

 

import Foundation

func sum() {
  add(a: 1, b: 2)
}

func add(a: Int, b: Int) -> Int {
  return a + b
}

요런 코드가 있다고 가정해볼께요.

add는 a와 b를 더한 값을 리턴하는 메서드입니다.

해당 메서드를 sum 메서드에서 호출할때 리턴 값이 사용되지 않죠?

그럼 아래와 같이 리턴 값을 사용하고 있지 않아!! 라고 경고 메시지를 띄웁니다.

경고일뿐 코드가 잘못된건 아니기에 컴파일이나 런타임에도 전혀 영향을 끼치진 않죠.

 

요럴때 @discardableResult을 사용하면 무시할 수 있어요!

import Foundation

func sum() {
  add(a: 1, b: 2)
}

@discardableResult
func add(a: Int, b: Int) -> Int {
  return a + b
}

요렇게 간단히 붙여주기만 한다면 실제 sum 메서드에서 add 메서드를 호출하여 리턴 값을 사용하지 않더라도 컴파일 시 경고 메시지를 띄우지 않습니다.

단순히 경고 메시지를 띄우지 않는 차이밖에 없긴해요.

 

자 그럼 @discardableResult는 뭔지 알겠는데 그래서 위에 서두에서 말한것처럼
이걸 쓸 유의미한 상황이 언제가 있어??🤔
라는 질문에 대해 한번 찾아보겠습니다!

 

@discardableResult 그래서 언제 쓰는데?

진짜 간단히 생각해보면 답이 나오더라구요.

한 메서드를 구현해놓고 내부 로직은 동일한데 정말 리턴 값을 사용하는 경우와 사용하지 않아도 되는 경우가 존재할 수 있습니다.

먼저 코드로 보실까요?

import Foundation

@discardableResult
func updateDatabase(_ value: Int) -> Bool {
  // DB 값 업데이트 코드
  // 업데이트 성공여부에 따라 T/F 반환
  return result
}

// 리턴 값 사용
if updateDatabase(10) {
  print("DB 값 업데이트 성공! 🎉")
} else {
  print("실패🥵")
}

// 리턴 값 미사용
updateDatabase(10)

자 요런 코드가 있어요!

@discardableResult로 updateDatabase라는 메서드를 만듭니다.

해당 메서드는 값을 전달받아 DB 값을 업데이트하고 성공 여부를 반환합니다.

 

그 밑에 우선 리턴 값을 사용하는 경우를 보시면 성공 여부를 조건으로 print를 해주고 있습니다.

이는 다른 로직들이 들어올 수 있는것처럼 성공과 실패에 대해 리턴 값을 이용해 유의미한 다른 작업을 해줄 수 있죠.

 

마지막 밑에는 리턴 값을 미사용하는 경우입니다.

리턴 값을 사용하지 않고 그냥 나는 DB 값만 업데이트해줄래~ 성공/실패는 나한테 중요하지 않아! 이럴 경우도 있겠죠?

그럴때 사용됩니다.

 

근데 이걸 리턴 값이 존재하는 경우랑 미존재하는 경우 두 메서드를 만들면 내부 로직은 동일한 사실상 중복 코드가 나옵니다.

그렇기에 조금 더 코드를 효율적으로 만들어줄 수 있는 @discardableResult를 사용하는 이유라고 생각합니다.

 

끝🎉

 

마무리

정말 아주 간단한 질문과 생각해보면 너무 쉬운 답이였는데 가끔 너무 어렵게 생각해서 답을 못찾고 해메는 경우가 있더라구요.

혹시 저만 그런지 다른 분들도 이럴때가 있는지 궁금하네요🥲