ruby의 !(Exclamation mark / Bang)의 의미

2023. 11. 24. 00:30· Backend/Ruby
목차
  1. 서론
  2. method에 ! 가 내포하는 의미
  3. 위험하다는건 알겠어. 그렇다면 느낌표를 붙이면 루비가 따로 뭘 해주는걸까?
  4. 그럼 위 두가지 상황이 무조건적으로 위험한거야?
  5. 결론
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
  1. 서론
  2. method에 ! 가 내포하는 의미
  3. 위험하다는건 알겠어. 그렇다면 느낌표를 붙이면 루비가 따로 뭘 해주는걸까?
  4. 그럼 위 두가지 상황이 무조건적으로 위험한거야?
  5. 결론
'Backend/Ruby' 카테고리의 다른 글
  • [번역] What’s new in Ruby 3.3(Ruby 3.3의 새로운 기능)
  • ruby의 ?(Question Mark / Boolean)의 의미
  • ruby의 배열내의 카운트를 효과적으로 세는 법
  • Numeric의 zero? & positive? & negative?
Seyun(Marco)
Seyun(Marco)
개발, PO, PM, 기획과 관련된 서비스 관련 업무에 관심이 있습니다. 또한 성장,교육과 관련된 주제에 대해서도 관심이 많습니다. 티타임을 좋아하는 사람으로써, 혹시 티타임에 관심이 있으신 분은 ksy90101@gmail.com로 메일 보내주시면 감사하겠습니다 :) 과제를 제공해주고 피드백을 주는 서비스를 오픈하였습니다. 관심있으신 분들은 https://jobskill.notion.site/ 해당 사이트를 참고해주세요.
Enthusiastically, Steady, Slowly개발, PO, PM, 기획과 관련된 서비스 관련 업무에 관심이 있습니다. 또한 성장,교육과 관련된 주제에 대해서도 관심이 많습니다. 티타임을 좋아하는 사람으로써, 혹시 티타임에 관심이 있으신 분은 ksy90101@gmail.com로 메일 보내주시면 감사하겠습니다 :) 과제를 제공해주고 피드백을 주는 서비스를 오픈하였습니다. 관심있으신 분들은 https://jobskill.notion.site/ 해당 사이트를 참고해주세요.
250x250
Seyun(Marco)
Enthusiastically, Steady, Slowly
Seyun(Marco)
전체
오늘
어제
  • 분류 전체보기 (258)
    • Common (31)
      • ComputerScience (10)
      • Web (9)
      • Git (1)
      • 세미나 (8)
      • Testing (3)
    • Backend (129)
      • Java (35)
      • Kotlin (3)
      • Spring (26)
      • Ruby (11)
      • RubyOnRails (17)
      • Python (1)
      • Django (3)
      • Infra (3)
      • DataBase (9)
      • SQL (21)
    • Frontend (30)
      • HTML&CSS (1)
      • JavaScript (16)
      • TypeScript (1)
      • Vue (5)
      • Nuxt.js (3)
      • React (4)
    • Book (30)
      • 이펙티브 자바 3판 (9)
    • Lecture (26)
      • [인프런] Vue.js 시작하기 - Age of .. (14)
      • [Tacademy] JPA 프로그래밍 기본기 다지.. (8)
    • 회고 (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • System.out.printlin
  • rubyonrails
  • locale
  • scanner
  • 우아콘
  • REST API
  • MVC
  • Nuxt3
  • JAR index
  • SCSS
  • Finalization
  • JavaScriprt
  • RESTful
  • system.out.println
  • ruby
  • java
  • 멱등성
  • IBM Plex Sans
  • JUnit
  • 개발문화

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Seyun(Marco)
ruby의 !(Exclamation mark / Bang)의 의미
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.