728x90
ruby의 !(Exclamation mark / Bang)의 의미
서론
- 루비를 사용하다 보면, 메서드에 ! 가 붙여 있는 경우를 많이 보게 됩니다.
- ! 를 붙이는 이유와 어떤 변경점이 있는지, ruby의 구현되어 있는 메서드들을 간단히 살펴보는 시간을 가져볼 예정입니다.
- ! 를 붙이는것은 Exclamation Mark라고 하지만, 실질적으로 메서드에 붙어 있다면 Bang Methods라고 많이 합니다.
method에 ! 가 내포하는 의미
- 일단 한마디로 정의한다면 dangerous methods(위험한 메서드) 라는 의미를 가지고 있습니다.
- 대체 뭐가 그렇게 위험하길래 ! 라는 mark까지 만들었고, 이걸 위험하다라고 경고를 준다는것일까요?
- 첫번째 이유는 해당 메서드를 사용한다면 원본 객체가 수정된다는 의미를 의미합니다.
- 예를들어 아래와 같은 예시를 봅시다. upcase 메서드는 대문자로 변환해주는 메서드입니다.
string = "marco" pp string.upcase # MARCO pp string # marco pp string.upcase! # MARCO pp string # MARCO
- 위 예시에서 같은 메서드를 쓰지만, ! 만 붙였는데 string에 대한 객체가 변경되는 모습을 볼수 있습니다.
- 이런식으로 객체 자체의 값을 변경되는것을 위험함이라고 나타내게 됩니다.
- 두번째 이유는 성공적으로 실행을 하는걸 기대하지만, 그렇지 않다면 예외가 발생할수 있다는것을 의미합니다.
- 즉, 쉽게 생각하면 예외가 발생할수도 있다라는 것을 메서드를 통해서 알려주는 것입니다.
- 예시를 보면, update라는 메서드는 ActvieRecord에서 해당 엔티티의 상태를 변경하기 위해 UPDATE 쿼리를 날리는 메서드입니다.
@post.update(post_params) # 성공시 true, 실패시 false
- 위 코드에서 ! 가 없습니다. 이런 경우 성공과 실패를 boolean으로 나타내게 되며, 실패를 하게 되었을때 예를들어 따로 if문으로 분기를 해줘야 할수도 있습니다.
@post.update!(post_params) # 실패시, Raise Exception
- ! 를 붙였다면, 실패시 false가 아니라 예외가 발생하게 됩니다.
위험하다는건 알겠어. 그렇다면 느낌표를 붙이면 루비가 따로 뭘 해주는걸까?
- 일단 결론부터 말하자면, Ruby의 명명 규칙일뿐입니다.
- 내가 메서드를 만들때 해당 메서드는 예외가 발생하지 않지만, ! 를 붙여도 상관없습니다. 루비는 잘못된것이라고 알려주지 않습니다.
- 그렇지만, 동료 개발자들과 소통하기 위해 또한 루비가 생각하는 하나의 중요한 부분이지 않을까 생각이 듭니다.
그럼 위 두가지 상황이 무조건적으로 위험한거야?
- 결론적으로 아닐수 있습니다.
- 대표적으로 첫번째 이유에서 인스턴스 값을 변경한다고 했는데, ! 를 쓰지 않는 예를들어 upcase를 쓴다면 추가적으로 메모리를 쓰는것이며, ! 를 써서 해당 인스턴스 값만 변경한다면 추가적인 인스턴스 또는 배열이 새롭게 메모리를 쓰지 않기 때문에 절약하는 장점이 있게 됩니다.
결론
- 루비의 컨벤션중에 Bang Method라는것이 있고, 두가지의 이유덕분에 나오게 됩니다.
- 사실 무조건 위험하다! 라는 개념보단, 잠재적으로 위험한 느낌. 위험할수도 있다~ 라는 의미로 쓰는것이라고 생각하면 좋습니다.
- 자매품(?)으로 boolean Method(_? )에 대해서도 글을 작성했으니 참고해주세요.
- 각 언어에서 통용적으로 사용하는 컨벤션을 꼭 알아둬야 한다고 생각합니다. 이유는 동료 개발자와의 협업도 중요하지만, 실제 라이브러리나 ruby API를 이해하기위해선 꼭 알아둬야 하는 개념이 아닐까 생각이 듭니다.
cf)
- 교육 및 성장, 경험과 관련된 이야기(취준, 이직 또는 교육 관계자)에 대해서 커피챗을 하는것에 대해 관심이 많습니다. 같이 이야기 해보고 싶으신 분이 있다면 댓글에 남겨주세요! 혹은 메일(ksy90101@gmail.com)로 연락주세요!
- 멘토링 및 교육에 대해서 같이 이야기 나눠보고 싶으신 분도 연락주세요!!
728x90
728x90
'Backend > Ruby' 카테고리의 다른 글
[번역] What’s new in Ruby 3.3(Ruby 3.3의 새로운 기능) (0) | 2023.12.24 |
---|---|
ruby의 ?(Question Mark / Boolean)의 의미 (0) | 2023.11.25 |
ruby의 배열내의 카운트를 효과적으로 세는 법 (3) | 2023.11.17 |
Numeric의 zero? & positive? & negative? (0) | 2023.01.29 |
Mastering data structures in Ruby — Doubly linked lists(Ruby의 데이터 구조 마스터 하기 - 이중 연결 목록) (0) | 2021.12.25 |