ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Ruby VS Python 뭐가 다를까? [1부]
    💻 프로그래밍/Ruby On Rails 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 구현에 대해서 비교해보도록 하겠습니다. 

    그럼 좋은 하루 보내세요!

    댓글

운동하는 개발자 JAY-JI