소개
프로그램을 작성할 때 데이터 유형을 사용하여 데이터를 분류합니다. 데이터 유형은 컴퓨터에게 프로그램에서 데이터를 처리하는 방법을 알려줍니다. 또한 데이터를 사용하여 수행할 수 있는 작업, 즉 수행할 수 있는 작업을 결정합니다.
데이터 유형에 대해 생각하는 한 가지 방법은 실제 세계에서 사용하는 다양한 유형의 데이터를 고려하는 것입니다. 예를 들어, 우리는 정수 (0, 1, 2, …), 정수 (…, -1, 0, 1, …), 그리고 무리수 (π)를 사용합니다.
일반적으로 수학에서는 다른 유형의 숫자를 결합하여 어떤 종류의 답변을 얻을 수 있습니다. 예를 들어, 우리는 π에 5를 더하고 싶을 수 있습니다:
5 + π
우리는 무리수를 고려하여 방정식을 답변으로 유지하거나, π를 소수점 이하 자릿수가 적은 숫자로 반올림하여 숫자를 더할 수 있습니다:
5 + π = 5 + 3.14 = 8.14
그러나 단어와 같은 다른 데이터 유형으로 숫자를 평가하려고하면 상황이 좀 더 이상해집니다. 다음 방정식을 어떻게 해결할까요?
sky + 8
이것은 우리가 즉시 해결할 수 있는 것은 아닙니다. 컴퓨터도 할 수 없습니다. 왜냐하면 데이터가 두 가지 다른 유형이기 때문입니다. “하늘”은 단어이고 8
은 정수입니다. 프로그램을 작성할 때 값들을 할당하는 방법과 덧셈, 뺄셈, 곱셈 등과 같은 연산을 통해 값을 조작하는 방법에 대해 주의해야 합니다.
이 튜토리얼에서는 루비에서 가장 중요한 데이터 유형인 정수, 부동 소수점, 문자열, 심볼, 배열 및 해시에 대해 알아보게 될 것입니다. 이는 데이터 유형에 대한 철저한 조사는 아니지만 프로그램에서 사용 가능한 옵션에 익숙해지는 데 도움이 될 것입니다.
그런 다음 동적 형식을 살펴보게 될 것입니다. 루비 프로그램은 변수가 포함하는 내용에 따라 데이터 유형을 결정하기 때문에 동적 형식이 어떻게 작동하는지 이해하는 것은 자신의 프로그램에서 어려운 상황을 피하는 데 도움이 될 것입니다. 또한 변수에는 어떤 값이든 포함될 수 있으므로 변수의 데이터 유형을 식별하는 방법을 배우게 될 것입니다.
먼저 루비에서 정수를 다루는 방법을 살펴보겠습니다.
정수
수학에서와 마찬가지로, 컴퓨터 프로그래밍에서의 정수는 양수, 음수 또는 0 (…, -1
, 0
, 1
, …)인 정수로, 정수는 일반적으로 int
로 알려져 있습니다.
다음과 같이 정수를 출력할 수 있습니다:
print -25
Output-25
또한 정수를 변수에 저장한 다음 변수를 참조하여 값을 출력할 수도 있습니다:
my_int = -25
print my_int
Output-25
정수로도 수학 연산을 수행할 수 있습니다. 예를 들어, 두 수의 합을 계산하고 결과를 출력할 수 있습니다.
sum = 116 - 68
print sum
Output48
큰 수를 쓸 때 우리는 읽기 쉽게 하기 위해 쉼표를 사용하는 경향이 있습니다. 예를 들어, “백만”을 나타내기 위해 1,000,000
이라고 씁니다. 코드에서는 쉼표를 사용할 수 없지만, 루비에서는 큰 수를 더 읽기 쉽게 만들기 위해 밑줄(_
) 문자를 사용할 수 있습니다.
실제로 해보세요:
large_number = 1_234_567
print large_number
밑줄을 제외한 숫자만 출력됩니다:
Output1234567
밑줄은 프로그램에서 큰 수를 표현해야 할 때 더 읽기 쉬운 코드를 작성할 수 있게 해줍니다.
루비 언어에 대해 더 배우면 정수와 함께 작업할 많은 기회가 생깁니다. 이제 실수와 함께 작업하는 방법을 알아보겠습니다.
부동 소수점 수
A floating-point number or a float represents a real number. Real numbers can be either a rational or an irrational number; numbers that contain a fractional part, such as 9.0
or -116.42
. In other words, a float in a Ruby program is a number that contains a decimal point.
루비에서 부동 소수점 수를 출력할 때는 정수와 마찬가지로 출력할 수 있습니다:
print 17.3
Output17.3
변수를 선언하고 실수를 할당할 수도 있습니다:
my_float = 17.3
print my_float
Output17.3
정수와 마찬가지로 루비에서 실수로도 계산할 수 있습니다:
sum = 564.0 + 365.24
print sum
Output929.24
루비에서 정수와 실수를 더하면 실수가 됩니다:
sum = 564 + 365.24
print sum
Output929.24
루비는 소수점 없이 쓰인 숫자(예: 138
)를 정수로, 소수점이 있는 숫자(예: 138.0
)를 실수로 간주합니다.
다음으로, 루비에서 부울 값을 살펴보겠습니다.
부울 데이터 유형
부울은 컴퓨터 과학에서 알고리즘에 영향을 주는 수학 논리 분기에 연관된 진리 값을 나타내는 데 사용됩니다. 루비에서는 이 데이터 유형을 true
또는 false
중 하나의 값으로 나타냅니다.
수학에서 많은 연산은 참 또는 거짓으로 평가되는 답을 제공합니다:
- 크다
- 500 > 100
true
- 1 > 5
false
- 작다
- 200 < 400
true
- 4 < 2
false
- 같다
- 5 = 5
true
- 500 = 400
false
숫자와 마찬가지로, 변수에 true
또는 false
값을 저장할 수 있습니다:
result = 5 > 8
그런 다음 print()
함수를 호출하여 부울 값을 출력할 수 있습니다:
print result
5가 8보다 크지 않기 때문에 다음 결과가 표시됩니다:
Outputfalse
루비에서 더 많은 프로그램을 작성하면 부울이 어떻게 작동하며, 다른 함수와 연산이 true
또는 false
으로 평가되는 경우 프로그램의 진행이 어떻게 변경되는지에 대해 더 익숙해질 것입니다.
이제 프로그램에서 텍스트 작업을 살펴보겠습니다.
문자열
A string is a sequence of one or more characters, such as letters, numbers, and symbols. Strings primarily exist within either single quotes ('
) or double quotes ("
) in Ruby, so to create a string, enclose a sequence of characters in quotes, like this:
"This is a string in double quotes."
작은 프로그램 “Hello, World!”는 컴퓨터 프로그래밍에서 문자열을 사용하는 방법을 보여줍니다. “Hello, World!”라는 구문을 구성하는 문자들은 문자열입니다.
print "Hello, World!"
다른 데이터 유형과 마찬가지로 문자열을 변수에 저장할 수 있습니다:
output = "Hello, World!"
변수를 호출하여 문자열을 출력할 수 있습니다:
print output
OutputHello, World!
숫자와 마찬가지로, 우리의 프로그램 내에서 문자열을 조작하여 원하는 결과를 얻기 위해 많은 작업을 수행할 수 있습니다. 문자열은 사용자에게 정보를 전달하고, 사용자가 프로그램에 정보를 다시 전달하기 위해 중요합니다.
때로는 데이터 목록을 처리해야할 때가 있습니다. 그럴 때 배열이 유용합니다.
배열
배열은 하나의 변수 내에서 여러 값을 보유할 수 있습니다. 이는 배열 내의 값 목록을 포함하고, 이를 반복(iterate)할 수 있다는 것을 의미합니다. 배열 내에 있는 각 항목 또는 값은 요소라고 합니다.
배열은 대괄호 [ ]
사이에 쉼표로 구분된 값을 지정하여 정의됩니다.
정수 배열은 다음과 같이 보입니다:
[-3, -2, -1, 0, 1, 2, 3]
A array of floats looks like this:
[3.14, 9.23, 111.11, 312.12, 1.05]
문자열 목록은 다음과 같습니다:
['shark', 'cuttlefish', 'squid', 'mantis shrimp']
다른 데이터 유형과 마찬가지로 배열을 변수에 할당할 수 있습니다:
sea_creatures = ['shark', 'cuttlefish', 'squid', 'mantis shrimp']
변수를 출력하면 생성한 배열과 정확히 같은 출력이 표시됩니다:
print sea_creatures
['shark', 'cuttlefish', 'squid', 'mantis shrimp']
인덱스 번호를 사용하여 배열의 개별 요소에 액세스할 수 있으며, 첫 번째 인덱스는 0
부터 시작합니다.
puts sea_creatures[0] # 상어
puts sea_creatures[2] # 오징어
마지막 값을 출력하려면 인덱스 -1
을 사용할 수 있습니다. 루비는 또한 처음과 마지막 항목을 선택하기 위한 .first
와 .last
메서드를 제공합니다:
puts sea_creatures.first # 상어
puts sea_creatures.last # 사마귀
루비의 배열은 여러 가지 유형의 데이터를 가질 수 있습니다. 문자열, 심볼 및 다른 배열을 배열에 저장할 수 있습니다:
record = [
:en,
"Sammy",
42,
[
"coral",
"reef"
]
]
루비의 배열은 가변적이므로 값 추가, 값 제거 및 배열 항목 수정도 가능합니다.
때로는 프로그램에서 항목에 라벨을 지정해야 할 필요가 있습니다. 그것이 심볼의 역할입니다.
심볼
A symbol is a special data type that acts like a label or an identifier in a Ruby program. Symbols are immutable, which means that they cannot be changed. A symbol looks like a variable declaration without a value. Here’s an example of a symbol:
:time_zone
루비에서는 일반적으로 중요한 것을 식별하는 데 심볼을 사용하고, 다루거나 조작해야 하는 텍스트에는 문자열을 사용합니다. 루비 프로그램의 각 문자열은 고유한 메모리 위치를 가진 별도의 객체입니다. 심지어 문자열이 동일하더라도 그렇습니다.
그러나 같은 심볼을 여러 번 참조하면 프로그램 전체에서 동일한 객체를 참조하므로, 동일한 메모리 위치를 참조하게 됩니다.
해시를 살펴보면 이 개념을 실제로 확인할 수 있습니다. 해시는 키와 값을 연결할 수 있게 해줍니다.
해시
A hash is a dictionary-like collection of keys and values. These key-value pairs provide a useful way to store and access data. Hashes are often used to hold data that are related, such as the information about a user. You define a hash like this:
{"first_name" => "Sammy", "last_name" => "Shark"}
해시를 다른 데이터 유형과 마찬가지로 변수에 할당할 수 있습니다:
user = {"first_name" => "Sammy", "last_name" => "Shark"}
user
해시에서 값을 검색하려면 값에 해당하는 키를 사용합니다:
print user["first_name"] # "Sammy"
print user["last_name"] # "Shark"
문자열 대신 심볼을 해시의 키로 사용할 수 있습니다:
user = {:first_name => "Sammy", :last_name => "Shark"}
가능한 경우 심볼을 키로 사용하는 것이 좋습니다. 심볼의 각 인스턴스는 동일한 객체를 가리키지만, 문자열의 각 인스턴스는 고유한 객체를 참조합니다. 심볼을 키로 사용하면 약간 더 나은 성능과 더 적은 메모리 사용량을 얻을 수 있습니다.
키로 심볼을 사용할 때는 값을 검색하기 위해 심볼을 사용합니다:
print user[:first_name] # "Sammy"
print user[:last_name] # "Shark"
해시를 정의할 때 약간 다른 구문을 사용할 수도 있습니다:
user = {first_name: "Sammy", last_name: "Shark"}
이 구문은 JavaScript 및 기타 언어에서 사용되는 구문과 유사합니다. 이 구문은 키를 심볼로 정의하므로 :first_name
및 :last_name
대신 문자열 "first_name"
및 "last_name"
을 사용하여 항목에 액세스합니다.
여러 데이터 유형을 살펴보았으므로 이제 Ruby가 해당 유형과 함께 작동하는 방법을 살펴보겠습니다.
동적 타이핑
Ruby에서는 값을 할당하기 전에 명시적으로 데이터 유형을 선언하지 않습니다. 값의 할당이 데이터 유형을 결정합니다. Ruby는 동적 타이핑을 사용하여 유형 검사를 컴파일 시간이 아닌 런타임에 수행합니다. Ruby는 변수에 저장된 데이터에서 데이터 유형을 결정합니다. 이는 Python의 데이터 유형 및 JavaScript의 데이터 유형과 유사합니다.
다음 예제에서 변수 t
는 사용 가능한 모든 데이터 유형으로 설정할 수 있습니다:
t = 42 # t is an Integer
t = "Sammy" # t is a String
t = :sammy # t is a Symbol
t = true # t is a boolean (true)
t # t is nil
동적으로 유형을 지정하는 언어에서는 기존 변수를 다른 데이터 유형을 저장하는 데 재사용할 수 있습니다.
이는 한 유형에서 다른 유형으로 데이터를 변환할 때 유용합니다. 예를 들어, 숫자 값을 사용자에게 요청하는 다음 코드가 있을 수 있습니다:
print "Please enter the length of the room: "
length = gets.chop
키보드로부터 얻은 데이터는 항상 문자열입니다. 따라서 수학 연산을 수행하기 위해 length
변수의 데이터를 숫자로 변환해야합니다. 변수의 데이터 유형을 할당하기 전에 선언해야하는 정적으로 유형화된 언어에서는 변환된 데이터를 보유하기 위해 새 변수가 필요합니다. 그러나 루비에서는 동적으로 유형화되기 때문에 필요하다면 length
변수를 재사용할 수 있습니다.
# 금액을 부동소수점으로 변환합니다.
length = length.to_f
to_f
메소드는 문자열을 부동소수점으로 변환합니다. 루비는 또한 문자열을 정수로 변환하는 to_i
메소드를 제공하며 대부분의 객체는 to_s
메소드를 사용하여 문자열로 변환 할 수 있습니다 :
42.to_s # "42"
(42.5).to_s # "42.5"
["Sammy", "Shark"].to_s # "[\"Sammy\", \"Shark\"]"
루비는 동적으로 유형화되지만 데이터 유형을 동일한 유형으로 변환하지 않고 서로 다른 유형의 데이터에 연산을 수행 할 수 없도록합니다. 예를 들어, 이 코드는 오류가 발생합니다 :
print 5 + "5"
OutputTypeError: String can't be coerced into Integer
이 코드도 오류가 발생합니다 :
print "5" + 5
OutputTypeError: no implicit conversion of Integer into String
숫자를 더하여 10
을 얻으려면 문자열을 정수로 변환하십시오. 문자열을 연결하여 "55"
를 얻으려면 정수를 문자열로 변환하십시오.
동적 유형화는 유연성을 제공하지만, 단점은 변수가 모든 사용 가능한 유형을 포함 할 수 있으므로 작업 중인 데이터 유형을 항상 확실하게 알 수 없다는 것입니다. Ruby는 데이터 유형을 식별하는 방법을 제공합니다.
데이터 유형 식별
Ruby에서는 거의 모든 것이 객체입니다. 정수, 실수, 배열, 심볼 및 해시는 모두 Ruby 객체이며, 이들은 모두 어떤 유형인지를 알려주는 class
라는 메서드를 가지고 있습니다. 심지어 부울 값인 true
와 false
및 값 nil
도 객체입니다. 직접 해보세요:
42.class # 정수
(42.2).class # 실수
["Sammy", "Shark"].class # 배열
true.class # TrueClass
nil.class # NilClass
또한, 다음과 같이 kind_of?
메서드를 사용하여 특정 유형의 데이터를 확인할 수 있습니다:
42.kind_of?(Integer) # true
특히 변수가 있고 해당 변수의 유형을 확인하려는 경우에 유용합니다:
# 코드의 어딘가에서...
sharks = ["Hammerhead", "Tiger", "Great White"]
...
# 다른 곳에서...
sharks.kind_of?(Hash) # false
sharks.kind_of?(Array) # true
이를 사용하여 외부 소스에서 오는 데이터가 올바른지 확인할 수도 있습니다.
if data.kind_of? String
data = data.to_f
end
루비는 kind_of?
와 동일한 작업을 수행하지만 일부 개발자에게는 좀 더 읽기 쉬울 수 있는 is_a?
메소드를 제공합니다.
if data.is_a? String
data = data.to_f
end
class
, kind_of?
, is_a?
를 사용하면 올바른 유형의 데이터를 다룰 수 있습니다. 루비에 대해 더 많이 배우면 데이터의 유형을 명시적으로 확인하지 않고도 데이터를 처리하는 다른 방법을 발견할 수 있습니다.
결론
루비 프로그램에서는 다양한 데이터 유형을 사용합니다. 이제 루비 프로그램에서 사용할 수 있는 주요 데이터 유형에 대해 더 잘 이해하게 되었습니다.
다음 튜토리얼을 참조하여 루비의 데이터 유형을 계속 탐색해보세요:
Source:
https://www.digitalocean.com/community/tutorials/understanding-data-types-in-ruby