Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby 문자열(String) 메서드 완벽 가이드: 실전 예제로 배우는 21가지 핵심 기능

문자열(string)은 문자들의 연속된 나열입니다.

Ruby에서 문자열은 객체이기 때문에 다양한 메서드를 활용해 원하는 작업을 수행할 수 있습니다.

이 글에서는 가장 유용한 Ruby 문자열 메서드들을 실제 예제와 함께 자세히 살펴보겠습니다!

1. 문자열 길이 구하는 방법

아주 간단합니다:

"ruby".size
# 4

size 대신 length를 사용할 수도 있으며, 두 메서드는 완전히 동일하게 동작합니다.

2. 문자열이 비어 있는지 확인하는 방법

빈 문자열(empty string)은 길이가 0인 문자열을 의미합니다.

다음과 같이 확인할 수 있습니다:

"".size == 0
# true

하지만 더 좋은 방법은 empty? 메서드를 사용하는 것입니다.

예제:

"".empty?
# true

참고로 '공백 문자열(blank string)'은 길이가 0이거나, 오직 공백 문자(whitespace)로만 이루어진 문자열을 말합니다.

3. 문자열 보간(String Interpolation)이란?

문자열 보간을 사용하면 여러 문자열을 손쉽게 조합할 수 있습니다:

name = "Jesus"

puts "Hello #{name}"

많은 사람들이 모르는 사실 중 하나는, 보간 내부에 실제 코드를 넣을 수도 있다는 점입니다.

예제:

puts "The total is #{1+1}"

# "the total is 2"

Ruby는 문자열 보간 블록에 대해 to_s 메서드를 호출하여 해당 객체를 문자열로 변환합니다.

4. 부분 문자열(Substring) 추출 방법

부분 문자열은 문자열의 일부분으로, 시작 부분·중간·끝 등 특정 부분만 필요할 때 유용합니다.

Ruby에서 부분 문자열을 어떻게 얻을까요?

한 가지 방법은 대괄호 안에 시작 인덱스와 문자 개수를 쉼표로 구분하여 지정하는 것입니다.

예제:

string = "abc123"

string[0,3]
# "abc"

string[3,3]
# "123"

첫 번째 숫자는 시작 인덱스이고, 두 번째 숫자는 가져올 문자의 개수입니다.

범위(range)를 사용하면 "마지막 문자 하나만 빼고 전부 가져오기" 같은 작업도 가능합니다.

예제:

string = "abc123"

string[0..-2]
# "abc12"

여기서 첫 번째 인덱스는 여전히 시작 위치이지만, 두 번째 인덱스는 끝 인덱스(포함)입니다. -2는 뒤에서 두 번째 문자를, -1은 문자열의 끝을 의미합니다.

부분 문자열을 삭제하거나 교체하고 싶다면 다음과 같이 할 수 있습니다:

string[0..2] = ""

p string
# "123"

아주 편리하죠!

5. 문자열 포함 여부 확인 방법

한 문자열이 다른 문자열에 포함되어 있는지 확인하는 가장 쉬운 방법은 무엇일까요?

include? 메서드입니다:

string = "Today is Saturday"

string.include?("Saturday")
# true

index 메서드를 사용할 수도 있습니다:

string = "Today is Sunday"

string.index("day")
# 2

이 메서드는 부분 단어를 찾으며, true/false 대신 해당 문자열이 시작되는 인덱스를 반환합니다.

위 예제에서 index는 "Today" 안의 "day"를 찾아낸 것입니다.

패턴을 찾고 싶다면(예: "day"라는 단어가 포함된 모든 단어 찾기) 정규 표현식(regular expression)을 사용해야 합니다.

6. 문자열 패딩(Padding) 방법

문자열을 채우는 한 가지 방법은 두 개의 인수를 받는 rjust 메서드를 사용하는 것입니다:

binary_string = "1101"
binary_string.rjust(8, "0")

# "00001101"

오른쪽을 채우고 싶다면 ljust를 사용하세요:

binary_string = "1111"
binary_string.ljust(8, "0")

# "11110000"

7. 대소문자 구분 없이 문자열 비교하기

문자열 비교는 기본적으로 대소문자를 구분하므로, 비교하려는 두 문자열이 같은 대소문자 상태인지 확인해야 합니다.

일반적인 방법은 비교식 양쪽 모두에 downcase 또는 upcase를 적용하는 것입니다.

예제:

lang1 = "ruby"
lang2 = "Ruby"

lang1.upcase == lang2.upcase

대소문자를 구분하지 않는 비교를 수행하는 casecmp? 메서드도 있지만, 실제로는 거의 사용되지 않습니다.

위의 예제 방식을 그대로 사용하는 것이 좋습니다.

8. 문자열 앞뒤 공백 제거(Trim) 방법

파일이나 웹사이트에서 데이터를 읽어오면 문자열에 불필요한 공백이 포함되는 경우가 많습니다.

strip 메서드로 이런 여분의 공백을 제거할 수 있습니다:

extra_space = "   test    "
extra_space.strip

# "test"

한쪽(왼쪽/오른쪽)의 공백만 제거하고 싶다면 lstrip 또는 rstrip 메서드를 사용하세요.

9. 문자열 접두사(Prefix)와 접미사(Suffix)

start_with? 메서드를 사용하면 문자열이 특정 접두사로 시작하는지 확인할 수 있습니다.

예제:

string = "ruby programming"

string.start_with? "ruby"
# true

end_with? 메서드도 있습니다:

string = "ruby programming"

string.end_with? "programming"
# true

또한 Ruby 2.5부터는 delete_prefixdelete_suffix 메서드가 도입되어 유용하게 활용할 수 있습니다.

예제:

string = "bacon is expensive"

string.delete_suffix(" is expensive")

# "bacon"

10. 문자열을 문자 배열로 변환하기

split 메서드를 사용하면 문자열을 문자 배열로 쉽게 분해할 수 있습니다.

예제:

string = "a b c d"

string.split
# ["a", "b", "c", "d"]

기본적으로 split은 공백을 구분자로 사용하지만, 인수를 전달하여 다른 구분자를 지정할 수도 있습니다.

쉼표로 구분된 값(CSV) 목록을 분할하는 방법은 다음과 같습니다:

csv = "a,b,c,d"

string.split(",")
# ["a", "b", "c", "d"]

다만 CSV 데이터를 본격적으로 다룬다면 표준 라이브러리의 CSV 클래스를 사용하는 것을 고려해 보세요. 이 클래스는 열 헤더 읽기 같은 기능을 제공해 작업을 훨씬 쉽게 만들어 줍니다.

11. 배열을 문자열로 변환하기

문자열 배열을 하나의 큰 문자열로 합치려면 join 메서드를 사용하면 됩니다.

예제:

arr = ['a', 'b', 'c']

arr.join
# "abc"

join에 인수를 전달할 수도 있는데, 이 인수는 요소 사이에 들어갈 구분 문자입니다.

예제:

arr = ['a', 'b', 'c']

arr.join("-")
# "a-b-c"

12. 문자열을 정수(Integer)로 변환하기

"49" 같은 문자열을 정수 49로 변환하려면 to_i 메서드를 사용하세요.

예제:

"49".to_i

주의할 점은, 숫자가 전혀 포함되지 않은 문자열에 이 메서드를 사용하면 0이 반환된다는 것입니다.

예제:

"a".to_i
# 0

13. 문자열이 숫자인지 확인하기

문자열이 오직 정수로만 이루어져 있는지 알고 싶으신가요?

다음과 같이 할 수 있습니다:

"123".match?(/\A-?\d+\Z/)
# true

"123bb".match?(/\A-?\d+\Z/)
# false

참고: match? 메서드는 Ruby 2.4에서 도입되었습니다. 그 이전 버전에서는 물음표 없이 match를 사용하세요.

이 코드는 정규 표현식을 사용하는데, 해석하면 다음과 같습니다:

"문자열의 시작(\A)부터 선택적인 대시(-?, 음수 처리용)가 있는지 확인하고, 그 뒤에 숫자가 하나 이상 있으며(\d+), 문자열 끝(\Z)까지 다른 문자가 없어야 한다."

14. 문자 추가(연결) 방법

기존 문자열에 문자를 덧붙여 큰 문자열을 만들 수 있습니다. 이를 문자열 연결(concatenation)이라고도 부릅니다.

<< 메서드를 사용하는 방법은 다음과 같습니다:

string = ""

string << "hello"
string << " "
string << "there"

# "hello there"

문자열 연결 시 +=는 사용하지 마세요. 매번 새로운 문자열 객체가 생성되어 성능에 좋지 않습니다!

15. 문자열의 각 문자 순회하기

때로는 문자열의 개별 문자 하나하나를 다루는 것이 유용합니다.

그중 한 가지 방법은 each_char 메서드를 사용하는 것입니다:

"rubyguides".each_char { |ch| puts ch }

chars 메서드로 문자열을 문자 배열로 변환한 뒤, 배열에 each를 사용해 순회할 수도 있습니다.

예제:

array_of_characters = "rubyguides".chars
# ["r", "u", "b", "y", "g", "u", "i", "d", "e", "s"]

16. 문자열 대소문자 변환하기

문자열을 모두 대문자로 변환하려면 upcase 메서드를 사용하세요.

예제:

"abcd".upcase
# "ABCD"

반대로 소문자로 변환하려면 downcase 메서드를 사용합니다.

예제:

"ABCD".downcase
# "abcd"

17. 여러 줄 문자열(Multiline String) 만들기

여러 줄로 된 문자열을 만드는 방법은 두 가지가 있습니다.

첫 번째는 heredoc을 사용하는 방법입니다:

b = <<-STRING
aaa
bbb
ccc
STRING

두 번째는 %Q를 사용하는 방법입니다:

a = %Q(aaa
bbb
ccc
)

18. gsub 메서드로 문자열 내 텍스트 치환하기

문자열 내부의 텍스트를 교체하려면 gsub 메서드를 사용하세요.

"dogs"를 "cats"로 바꿔 보겠습니다:

string = "We have many dogs"

string.gsub("dogs", "cats")

# "We have many cats"

텍스트를 삭제하고 싶다면 두 번째 인수로 빈 문자열을 전달하면 됩니다.

예제:

string = "abccc"

string.gsub("c", "")

# "ab"

중요한 점:

gsub 메서드는 새로운 문자열을 반환합니다.

원본 문자열에 직접 변경 사항을 적용하고 싶다면 gsub! 메서드를 사용하세요.

gsub 메서드는 정규 표현식도 인수로 받을 수 있어, 특정 단어가 아닌 패턴 자체를 교체할 수 있습니다.

예제:

string = "We have 3 cats"

string.gsub(/\d+/, "5")

# "We have 5 cats"

이 코드는 문자열의 모든 숫자(\d+)를 5로 교체합니다.

블록을 사용하는 또 다른 방법도 있습니다:

title = "the lord of the rings"

title.gsub(/\w+/) { |word| word.capitalize }
# "The Lord Of The Rings"

gsubsub의 차이점은 무엇일까요?

subgsub과 동일하지만 첫 번째 일치 항목만 교체합니다.

반면 gsub는 일치하는 모든 항목을 교체합니다.

19. 문자열의 마지막 문자 제거하기

사용자에게 입력을 받으면(Kernel#gets 메서드 사용) 문자열 끝에 줄바꿈 문자(\n)가 붙게 되며, 이 때문에 문자열을 직접 비교할 수 없게 됩니다.

예제:

puts "What's your name?"
name = gets

# type something...

이런 불필요한 줄바꿈 문자(\n)를 제거하는 가장 좋은 방법은 chomp 메서드를 사용하는 것입니다.

예제:

name = gets.chomp

Ruby 2.3부터 chomp 메서드는 선택적 인수를 받아 원하는 문자를 직접 지정해 제거할 수 있습니다.

예제:

"abcd?".chomp("?")
# "abcd"

만약 해당 문자가 존재하지 않으면 원본 문자열이 그대로 반환됩니다.

20. 문자열 인코딩 변경하기

문자열은 바이트(byte)의 연속으로 저장되며, 인코딩에 따라 우리가 볼 수 있는 문자로 변환됩니다.

예를 들어 ASCII 인코딩에서 숫자 65는 문자 "A"를 나타냅니다.

하지만 UTF-8처럼 더 복잡한 인코딩도 있습니다. UTF-8은 다양한 언어의 문자(중국어 등)는 물론 이모지까지 표현할 수 있습니다.

문자열의 현재 인코딩을 확인하려면 encoding 메서드를 사용하세요.

"abc".encoding

# Encoding:UTF-8

디스크에서 파일을 읽거나 웹사이트에서 데이터를 내려받을 때 인코딩 문제에 직면할 수 있습니다.

이런 경우 인코딩을 강제로 지정하면 문제를 해결할 수 있는 경우가 많습니다.

예제:

"abc".force_encoding("UTF-8")

21. 문자 개수 세기

count 메서드를 사용하면 특정 문자가 문자열에 몇 번 나타나는지 셀 수 있습니다.

예제:

str = "aaab"

str.count("a")
# 3

str.count("b")
# 1

마치며

이번 글에서는 문자열을 배열로 분해하는 join & split, 문자열 내 텍스트를 교체하는 gsub, 여분의 공백을 제거하는 strip 등 다양한 문자열 메서드들을 살펴보았습니다.

나중에 다시 참조하고 싶다면 이 페이지를 즐겨찾기에 추가하고, 주변의 Ruby 개발자들에게도 공유해 주세요 🙂

읽어주셔서 감사합니다!