I. 기본 문법
1. 기초 개념
•
Methods
def greet(name)
"Hello, #{name}!"
end
puts greet("Alice")
Ruby
복사
•
Symbols
변경불가(Immutable)하고 메모리 효율적으로 저장되는 문자열입니다. 왜냐하면 이하의 예시와 같이 같은 이름의 심볼은 동일한 객체이기 때문입니다. 반면 일반 문자열의 경우 각각 다른 객체입니다. 이 사실은 객체를 비교할 때, id를 기준으로 비교하면 상대적으로 빠른 성능을 보여줍니다.
:username
:logged_in
Ruby
복사
symbol1 = :my_symbol
symbol2 = :my_symbol
symbol1.object_id == symbol2.object_id # This will be true
string1 = "mystring"
string2 = "mystring"
string1.object_id == string2.object_id # This will be false
Ruby
복사
•
IF
age = 18
if age >= 18
puts "Adult"
else
puts "Minor"
end
Ruby
복사
if !condition
# code if condition is false
end
unless condition
# code if condition is false
end
Ruby
복사
•
Iterating
# next는 java의 continue와 같다
for i in 1..5
next if i == 3
puts i
end
Ruby
복사
[1, 2, 3].each do |num|
puts num
end
Ruby
복사
def solution(n)
(1..n).each do |num|
puts num
end
end
Ruby
복사
•
Pretty printing
require 'pp'
pp [{id: 1, name: "Alice"}, {id: 2, name: "Bob"}]
Ruby
복사
•
type converting
"5".to_i # 5
"55.5".to_i # 55
"55.5".to_f # 55.5
25.to_s # "25"
(25.5).to_s # "25.5"
["Sammy", "Shark"].to_s # "[\"Sammy\", \"Shark\"]"
"first_name".to_sym # :first_name
Ruby
복사
2. 문자열 다루기
•
문자열 붙이기
greeting = "Hello"
name = "Alice"
message = greeting + ", " + name + "!"
Ruby
복사
•
변수 집어넣기
age = 30
message = "I am #{age} years old."
Ruby
복사
•
부분 문자열 추출
str = "Hello Ruby"
sub_str1 = str[0, 5] # "Hello"
sub_str2 = str[6..-1] # "Ruby"
Ruby
복사
•
문자열 대체
str = "Hello Python"
new_str = str.gsub("Python", "Ruby") # "Hello Ruby"
Ruby
복사
•
문자 케이스
str = "Hello Ruby"
puts str.upcase # Convert to uppercase
puts str.downcase # Convert to lowercase
Ruby
복사
•
공백 제거
str = " Hello Ruby "
stripped = str.strip # "Hello Ruby"
Ruby
복사
•
문자열을 문자 배열로 자르고 다시 합치기
문자열로 다시 합칠 때 연속된 공백 살리기
str = "Hello Ruby"
words = str.split(/(\s+)/) # ["Hello", " ", "Ruby"]
answer = words.join("") # "Hello Ruby"
Ruby
복사
연속된 공백을 단일 공백으로 처리하기
str = "Hello Ruby"
words = str.split(" ") # ["Hello", "Ruby"]
answer = words.join(" ") # "Hello Ruby"
Ruby
복사
•
정규표현식 활용
str = "The year is 2024"
year = str[/\d+/] # "2024"
def letter?(lookAhead)
lookAhead.match?(/[[:alpha:]]/)
end
def numeric?(lookAhead)
lookAhead.match?(/[[:digit:]]/)
end
Ruby
복사
3. 메소드 활용
•
Chaining & Blocks
each: 반환 값이 없이 내부 요소를 토대로 순회합니다
select: Blocks 내부의 조건에 맞는 요소만 남깁니다. python과 java의 filter와 같습니다
map: 내부 요소를 변경합니다.
def solution(n)
answer = 0
(1..n).each do |num|
if n % num == 0
answer += num
end
end
return answer
end
# to
def solution(n)
(1..n).select { |num| n % num == 0 }.sum
end
Ruby
복사
def solution(d, budget)
answer = []
d.sort.each{|num| answer << num if answer.sum + num <= budget }
answer.size
end
Ruby
복사
def solution(s)
nums = s.split(" ").map {|num| num.to_i }
"#{nums.min} #{nums.max}"
end
Ruby
복사
4. 컬렉션
•
Arrays
array = [1, "two", 3.0]
Ruby
복사
•
Hashes
hash = { name: "Alice", age: 30 }
Ruby
복사
5. 클래스 활용
•
Accessors(접근자 메소드)
attr_accessor: 읽기 및 쓰기가 모두 가능한 접근자 메소드를 생성합니다.
attr_reader: 읽기만 가능한 접근자 메소드를 생성합니다.
attr_writer: 쓰기만 가능한 접근자 메소드를 생성합니다.
class Userv
attr_reader :id
attr_accessor :name
attr_writer :nickname
end
user = User.new
user.name = "Alice"
puts user.name
Ruby
복사
•
Object variables
class Car
def initialize(model)
@model = model
end
end
car = Car.new("Toyota")
Ruby
복사
•
객체 뜯어보기
class Blurb
attr_accessor :content, :time, :mood
def initialize(mood, content="")
@time = Time.now
@content = content[0..39]
@mood = mood
end
def moodify
if @mood == :sad
return ":-("
elsif @mood == :happy
return ":-)"
# Add other moods here
end
# The default mood
":-|"
end
end
class Blurbalizer
def initialize(title)
@title = title
@blurbs = []
end
def add_a_blurb(mood, content)
@blurbs << Blurb.new(mood, content)
end
def show_timeline
puts "Blurbalizer: #{@title} has #{@blurbs.count} Blurbs"
@blurbs.sort_by { |t|
t.time
}.reverse.each { |t|
puts "#{t.content.ljust(40)} #{t.time}"
}
end
end
myapp.show_timeline
Ruby
복사
II. 활용
•
array index 접근
class ParkingSystem
def initialize(big, medium, small)
@parking_slot = [0, big, medium, small]
end
def add_car(car_type)
if @parking_slot[car_type] <= 0
return false
else
@parking_slot[car_type] -= 1
return true
end
end
end
Ruby
복사
•
해시 접근
class ParkingSystem
def initialize(big, medium, small)
@capacity = {
1 => big,
2 => medium,
3 => small
}
@current = {
1 => 0,
2 => 0,
3 => 0,
}
end
def add_car(car_type)
return false if @current[car_type] == @capacity[car_type]
@current[car_type] += 1
true
end
end
Ruby
복사
•
케이스별 분기 접근
class ParkingSystem
def initialize(big, medium, small)
@big_limit = big
@medium_limit = medium
@small_limit = small
@big_curr = 0
@medium_curr = 0
@small_curr = 0
end
def add_car(car_type)
if car_type == 1
if @big_curr == @big_limit
return false
else
@big_curr += 1
end
elsif car_type == 2
if @medium_curr == @medium_limit
return false
else
@medium_curr += 1
end
elsif car_type == 3
if @small_curr == @small_limit
return false
else
@small_curr += 1
end
end
return true
end
end
Ruby
복사