루비

루비 문자열 탐색: 포함(include?), 시작/끝(start_with?/end_with?), 특정 위치 접근([]) 완벽 가이드

프로그래밍 멘토 2025. 3. 31. 19:00

🎯 이번 시간 학습 목표

지난 시간에는 문자열의 대소문자를 바꾸고(upcase/downcase) 앞뒤 공백을 제거하는(strip) 방법을 배웠습니다. 이번 시간에는 문자열 안을 좀 더 자세히 들여다보는 기술들을 연마해 볼 거예요! 🕵️‍♀️

  • include?: 문자열 안에 특정 내용이 포함되어 있는지 확인하기
  • start_with?: 문자열이 특정 내용으로 시작하는지 확인하기
  • end_with?: 문자열이 특정 내용으로 나는지 확인하기
  • [] (인덱싱): 문자열의 특정 위치에 있는 글자에 접근하기 (기초)

이 기능들을 잘 활용하면 문자열 데이터를 분석하고 원하는 정보를 찾아내는 데 큰 도움이 될 거예요. 마치 탐정이 단서를 찾는 것처럼요! 자, 코드를 통해 직접 탐험해봅시다! 🚀

✨ 오늘 배울 내용 미리보기

함수/메소드 설명 간단 예시
include?(substring) 문자열 안에 substring이 포함되어 있으면 true, 아니면 false를 반환합니다. "ruby".include?("ub")true
start_with?(prefix) 문자열이 prefix로 시작하면 true, 아니면 false를 반환합니다. "hello".start_with?("he")true
end_with?(suffix) 문자열이 suffix로 끝나면 true, 아니면 false를 반환합니다. "world".end_with?("ld")true
[index] 문자열의 index 위치(0부터 시작)에 있는 한 글자를 반환합니다. "code"[1]"o"
[start..end] 문자열의 start 위치부터 end 위치까지의 부분을 반환합니다. "ruby"[1..2]"ub"
[start, length] 문자열의 start 위치부터 length 길이만큼의 부분을 반환합니다. "ruby"[1, 2]"ub"

📌 위 표는 각 메소드의 핵심 기능을 보여줍니다. 아래에서 더 자세한 사용법과 주의사항을 알아볼게요!


🔍 숨은 그림 찾기! include?

문자열 안에 내가 찾고 있는 특정 단어나 글자가 들어있는지 확인하고 싶을 때 include? 메소드를 사용합니다. 결과는 참(true) 또는 거짓(false)으로 알려줘요.

sentence = "Ruby is fun and powerful!"

puts sentence.include?("fun")      # 출력 결과: true
puts sentence.include?("Ruby")     # 출력 결과: true
puts sentence.include?("easy")     # 출력 결과: false
puts sentence.include?("!")        # 출력 결과: true (특수 문자도 가능)
puts sentence.include?("ruby")     # 출력 결과: false (대소문자를 구분합니다!)

주의사항⚠️: include?는 대소문자를 엄격하게 구분합니다. "Ruby"는 포함되어 있지만 "ruby"는 포함되어 있지 않다고 판단하는 것을 볼 수 있죠? 만약 대소문자 구분 없이 확인하고 싶다면, 비교하기 전에 upcasedowncase 메소드를 먼저 적용하는 방법을 사용할 수 있습니다.

sentence = "Ruby is fun!"
search_term = "ruby"

# 먼저 모두 소문자로 바꾼 후 비교
puts sentence.downcase.include?(search_term.downcase) # 출력 결과: true

🚦 시작과 끝을 알려줘! start_with? / end_with?

문자열이 특정 패턴으로 시작하는지 또는 끝나는지 확인해야 할 때가 있습니다. 파일 확장자를 검사하거나, 특정 형식의 메시지를 필터링할 때 유용하게 쓰이죠. 이때 start_with?end_with? 메소드가 활약합니다!

filename = "report.pdf"
url = "https://example.com"

# start_with? 예제
puts filename.start_with?("report")  # 출력 결과: true
puts filename.start_with?("image")   # 출력 결과: false
puts url.start_with?("https://")    # 출력 결과: true
puts url.start_with?("http://")     # 출력 결과: false

# end_with? 예제
puts filename.end_with?(".pdf")      # 출력 결과: true
puts filename.end_with?(".txt")      # 출력 결과: false
puts url.end_with?(".com")         # 출력 결과: true
puts url.end_with?("/")            # 출력 결과: false

# 대소문자를 구분합니다!
puts filename.start_with?("Report")  # 출력 결과: false

이 메소드들 역시 include?처럼 대소문자를 구분한다는 점을 기억하세요!

꿀팁🍯: start_with?end_with?에는 여러 개의 후보 문자열을 전달하여 그중 하나라도 일치하는지 확인할 수도 있습니다. (단, 루비 버전에 따라 지원 여부가 다를 수 있으니 공식 문서를 참고하는 것이 좋습니다.)

# 예시 (Ruby 2.6 이상)
image_file = "photo.jpg"
puts image_file.end_with?(".jpg", ".png", ".gif") # 출력 결과: true

🎯 원하는 글자만 콕! 인덱싱 [] 기초

문자열에서 특정 위치에 있는 글자 하나를 가져오거나, 일부분을 잘라내고 싶을 때 대괄호 []를 사용합니다. 이를 **인덱싱(indexing)** 또는 **슬라이싱(slicing)**이라고 부릅니다.

💥 **중요:** 루비에서 인덱스는 항상 0부터 시작합니다! 첫 번째 글자의 위치는 0, 두 번째는 1, 이런 식이죠.

1️⃣ 특정 위치의 글자 하나 가져오기: `[index]`

word = "Ruby"

puts word[0]  # 출력 결과: "R" (첫 번째 글자)
puts word[1]  # 출력 결과: "u" (두 번째 글자)
puts word[3]  # 출력 결과: "y" (네 번째 글자)

# 음수 인덱스: 뒤에서부터 셉니다!
puts word[-1] # 출력 결과: "y" (마지막 글자)
puts word[-2] # 출력 결과: "b" (뒤에서 두 번째 글자)

음수 인덱스는 특히 마지막 글자나 끝에서 몇 번째 글자에 접근할 때 아주 편리합니다.

2️⃣ 여러 글자 잘라내기 (슬라이싱): `[start..end]` 또는 `[start, length]`

문자열의 일부분을 가져올 때는 두 가지 방법을 주로 사용합니다.

  • [start..end]: start 인덱스부터 end 인덱스까지의 모든 글자를 포함하여 가져옵니다. (.. 사용)
  • [start, length]: start 인덱스부터 시작해서 length 개수만큼의 글자를 가져옵니다.
message = "Hello, World!"

# [start..end] 사용
puts message[0..4]   # 출력 결과: "Hello" (0부터 4까지)
puts message[7..11]  # 출력 결과: "World" (7부터 11까지)
puts message[0..-1]  # 출력 결과: "Hello, World!" (처음부터 끝까지)
puts message[-6..-2] # 출력 결과: "World" (뒤에서 6번째부터 뒤에서 2번째까지)

# [start, length] 사용
puts message[0, 5]   # 출력 결과: "Hello" (0부터 5개)
puts message[7, 5]   # 출력 결과: "World" (7부터 5개)
puts message[-1, 1]  # 출력 결과: "!" (마지막 글자 1개)
🤔 어라? 글자가 아니라 nil이 나와요!
인덱싱을 할 때 지정한 위치(인덱스)가 문자열의 범위를 벗어나면 루비는 오류를 발생시키는 대신 nil(값이 없음)을 반환합니다. 슬라이싱의 경우 빈 문자열("")이나 nil을 반환할 수 있습니다.
word = "Ruby"
puts word[4]     # 출력 결과: nil (인덱스 4는 범위를 벗어남)
puts word[10]    # 출력 결과: nil
puts word[5..10] # 출력 결과: nil
puts word[1, 10] # 출력 결과: "uby" (1부터 시작해서 최대 길이만큼 가져옴)
puts word[4, 2]  # 출력 결과: "" (시작 위치가 범위를 벗어나면 빈 문자열)
주의사항⚠️: nil 값이 반환될 수 있다는 점을 항상 염두에 두고 코드를 작성해야 예기치 않은 오류(예: `nil`에 대해 메소드를 호출하는 경우)를 방지할 수 있습니다.

✨ 문자열 탐색 능력 레벨 업! ✨

와우! 이제 여러분은 루비 문자열 속에서 원하는 정보를 찾아내고(include?, start_with?, end_with?), 특정 부분을 정확하게 짚어내는([]) 탐색 기술까지 마스터했습니다! 🥳

이 능력들은 문자열 데이터를 검증하고, 필요한 부분만 추출하며, 조건에 따라 다른 처리를 하는 등 프로그래밍의 다양한 상황에서 빛을 발할 것입니다.

다음 시간에는 문자열을 특정 기준으로 나누고(split), 문자열 안의 내용을 다른 내용으로 바꾸는(gsub, sub) 강력한 편집 기술을 배워보겠습니다. 문자열 마스터가 되는 그날까지, 함께 달려봐요! 😉