💻 프로그래밍/Ruby On Rails

Ruby VS Python 뭐가 다를까? [1부]

피트웨어 제이 (FitwareJay) 2021. 3. 12. 23:06

안녕하세요! 운동하는 개발자 JAY입니다.

오늘은 비스~~읏 하다고 알려져(?) 있는 RubyPython 에 대해서 뭐가 다른지 어떻게 사용되는지 비교해보려고 합니다. 

Deep한 내용은 아니고 문법적으로 무엇이 다르고, 장단점 등을 비교해보려고 합니다.

 

아! 두 언어의 문법을 비교하기전 제가 사용한 언어 버전에 대해서 먼저 공유하겠습니다.

python : 3.8.5
ruby: 2.6.5

그리고 Ruby 공부 하려고 개발환경을 따로 세팅하려다가 구름 IDE를 사용하면 편하게 스터디용(?)으로 사용할 수 있더라고요. 무료로 5개의 컨테이너를 만들 수 있고 ruby뿐만 아니라 다양한 서버 프레임워크를 공부하기 쉽습니다. 

 

구름 IDE 컨테이너 생성 화면과 ruby 프로젝트 컨테이너 실행화면

저는 구름 IDE에서 컨테이너 만들어서 스터디를 했습니다!


👨‍💻 문법 비교


1. 문자열 출력

- Ruby♦️

score = 100
 
puts "무야호!"
puts "제 점수는요 #{score}"
cs

- Python🐍

score = 100

print("무야호!")
print(f"제 점수는요 {score}")
cs

가장 기본적인 문자열 출력부터 봤을 때, Ruby는 좀 더 간결한 문법을 지향하는 것 같습니다. 괄호 같은 게 아예 없는 게 pythonruby의 다른 점 중 하나인 것 같아요. 변수를 저렇게 string에 바로 넣는 건 python, ruby 둘 다 좋은 것 같습니다.

 

2. 반복문 (for loop)

- Ruby♦️

# range를 줘서 for loop를 실행하는 경우
for i in 0..5
    puts "#{i}"
end
 
 
# list를 for loop로 돌려서 실행하는 경우
user_ids = [11112222333344445555]
for user_id in user_ids
    if user_id == 2222
        next
    elsif user_id == 4444
        break
    end
    
    puts "user id : #{user_id}"
end
 
# list size로 range를 줘서 index에 맞는 값을 출력하는 경우
members = ['jay''zzeri''kanz''fernando'
for index in 0 .. members.size # ... 과 .. 차이 있는건가? 똑같이 동작하긴하는데
    puts members[index]
end
 
# list for loop
for member in members
    puts member
end
cs

- Python🐍

for i in range(05):
    print(f"{i}")
 
 
user_ids = [11112222333344445555]
for user_id in user_ids:
    if user_id == 2222:
        continue
    elif user_id == 4444:
        break
    print(f"user id : {user_id}")
 
 
members = ['jay''zzeri''kanz''fernando']
for index in range(0len(members)):
    print(members[index])
 
 
for member in members:
    print(member)
cs

일단 Ruby, Python 둘 다 매우 비슷합니다. 다만 Ruby의 경우 range라는 함수 없이 0 .. 5 이런 식으로 range를 줄 수 있고, Ruby는 : 으로 구분 짓는 게 아닌 문법들의 구분을 end 로 해줍니다. 약간 쉘 스크립트 보는 기분이네요! 

 

for loop도 그다지 큰 차이는 없는 것 같습니다.

 

3. 반복문 (while)

- Ruby♦️

num = 0
while num < 10
    puts "출력 #{num}!" 
    num += 1
end
cs

- Python🐍

num = 0
while num < 10:
    print(f"출력 {num}!")
    num += 1
 
cs

while 도 둘 다 비슷비슷합니다ㅋㅋ

 

4. null 표현

- Ruby♦️

temp_val = nil
if temp_val == nil
    puts 'this is nil(null)'
end
cs

- Python🐍

temp_val = None
if temp_val is None:
    print('this is None(null)')
cs

Ruby는 특이하게 nil이 null 이네요. 사실 nil을 swift에서 처음 봤을 때 "이게 뭐지?" 했는데 진짜 있는 단어더라고요.

 

5. 조건문 (if)

- Ruby♦️

# 일반적인(?) if문
num = 5
if 0 < num and num < 5
    puts "5보다 작아요"
elsif 5 <= num and num < 10
    puts "5이상 이에요"
else
    puts "큰 숫자네요"
end
 
# unless
has_card = false
unless has_card
    puts "카드를 가지고 있지 않아요."
else
    puts "카드를 가지고 있을걸요?"
end
 
# unless 한줄로
puts "카드를 가지고 있지 않아요." unless has_card
cs

- Python🐍

# 일반적인(?) if문
num = 5
if 0 < num < 5:
    print("5보다 작아요")
elif 5 <= num < 10:
    print("5이상 이에요")
else:
    print("큰 숫자네요")
 
# unless 이런 문법은 없음
 
cs

Python은 조건을 0 < num < 5 이렇게 사용할 수 있는 점이 Ruby보다는 쉬운 것 같습니다 (Ruby도 있는지 잘 모르겠네요.. 속성으로 지금 공부 중이라 ㅋㅋㅋ) 그리고 특이한 게 Rubyunless가 있더라고요. if의 반대 조건으로 비교하는 조건문입니다. 

 

그리고 Python, Ruby 둘  다 부정은 not으로 표시하네요.

 

6. 조건문 (삼항 연산자)

- Ruby♦️

my_score = 90
other_score = 60
puts my_score > other_score ? "Me!" : "Other!"
 
cs

- Python🐍

my_score = 90
other_score = 60
print("Me!" if my_score > other_score else "Other!")
 
cs

python은 따로 삼항 연산자라고 하는 문법이 없습니다. 다만 if문을 저렇게 한 줄로 사용 가능합니다.

 

7. Switch - Case

- Ruby♦️

num = 2
case num
when 0
    puts "0"
when 1
    puts "1"
when 2
    puts "2"
when 3
    puts "3"
when 4
    puts "4"
end
 
 
# switch - case 축약
num = 2
case num
when 0 then puts "0"
when 1 then puts "1"
when 2 then puts "2"
when 3 then puts "3"
when 4 then puts "4"
end
cs

pythonswitch-case 문법을 제공하지 않습니다. 고려는 했다고 하는데, if-elifdictionary를 대신 사용합니다. python 개발을 하면서 크게 switch-case가 없어서 불편했던 적은 없는 것 같습니다.

 

8. hash 와 dictionary

- Ruby♦️

user_score = {
    'jay' => 10,
    'zzeri' => 50,
    'kanz' => 30,
    'fernando' => 20
}
user_score['test'= 210
puts user_score['test']
cs

- Python🐍

user_score = {
    'jay'10,
    'zzeri'50,
    'kanz'30,
    'fernando'20
}
user_score['test'= 210
print(user_score['test'])
cs

Ruby에서는 hash라 하고 Python에서는 dictionary 라고 합니다. 둘 다 key-value 형식으로 사용됩니다. 다만 Ruby에서 key-value 정의할 때 Ruby 버전에 따라 =>, : 이 다르다고 합니다.

 

9. 반복자 (iterator)

- Ruby♦️

temp = [12345]
temp.each { | a | puts a } # 이름이 없는 메소드를 의미한다
 
# # hash 
user_score = {
    'jay' => 10,
    'zzeri' => 50,
    'kanz' => 30,
    'fernando' => 20
}
 
select_users = user_score.select {|k| k.size == 4}
puts select_users
cs

- Python🐍

temp = [12345]
print(n for n in temp)
 
user_score = {
    'jay'10,
    'zzeri'50,
    'kanz'30,
    'fernando'20
}
 
select_users = {key: val for key, val in user_score.items() if len(key) == 4}
print(select_users)
cs

이 부분이 Ruby와 Python의 가장 큰 차이점들이 있는 것 같습니다. 
Ruby의 경우 { |변수| }  형식의  Blocks(클로저, 익명 함수와 비슷)를 생성할 수 있습니다. 이게 가장  크게 문법적 차이에서 느낄 수 있는 게 두 번째 select_users를 추출하는 로직입니다.

# Blocks : 클로저, 익명함수와 비슷, 이름업슨ㄴ 메서드를 생성하는 방법
# 두가지 방법으로 정의 가능 do ... end, {} - |변수|
temp_list = [1234]
temp_list.each do |n| puts n end 
temp_list.each {|n| puts n}
cs

Ruby의 경우 이 클로저와 select라는 메서드를 이용해 원하는 조건의 값들을 뽑아낼 수 있습니다. 하지만 python의 경우 list comprehension을 사용하더라도 Ruby에 비하면 상당히 길어지는 걸 볼 수 있습니다.

 

이런 점에서는 Ruby가 좀 더 쉽고 간결하게 로직을 짤 수 있는 것 같습니다.

 

👋 마치며 


1부를 마치며, RubyPython의 비슷하지만 다른 문법적 차이에 대해서 알아보았습니다. 둘 다 다른 언어들에 비해 간결하게 작성할 수 있지만 특히 Ruby의 경우 더 그런 것 같습니다.

 

Pythonlist comprehention 보다 Ruby 더 간결하고 쉽게 blocksselect, each 등의 함수 등을 이용해서 값을 추출할 수 있는 부분들이 개인적으로 인상 깊었던 것 같습니다.

 

2부에서는 class, method 구현에 대해서 비교해보도록 하겠습니다. 

그럼 좋은 하루 보내세요!