본문 바로가기

Python

20210122_Python 와 Ruby 비교02 - Ruby 함수, 블럭, 모듈

생활 코딩 "Python & Ruby 강의" 수강후 정리


1. Python vs Ruby


1) 함수(Function)

  • 여러곳에서 활용가능하게 하고 코드의 중복을 낮추어 재활용성을 높이며 가독성을 높이는 중요한 기능!
  • 복잡해진 프로그램을 함수를 통해 그룹화로 정리해도 좋음

  • 함수 만들기
    • 로그인 애플리케이션 함수
    • 내가 만든 login 함수는 함수안에 넣는 것을 true, false로 반환해준다.
    • 그리고 real_login 함수는 로그인을 실행시키며 입력을 받게하여 true, false에 따라 출력문을 제시한다.
def login(id)
    members = ['tom', 'jerry', 'snoopy']
    for member in members do
        if member == id
            return true
        end
    end
    return false
end


def real_login()
    puts("Enter your id!")
    input_id = gets.chomp
    if login(input_id)
        puts("Hello!, " +input_id)
    else
        puts("Check your id!")
    end
end

puts(real_login())

  • 루비에서만 나타나는 함수 특성

  • 함수 정의시 괄호 생략 가능하고 호출시 괄호 생략도 가능

def f1
  return "f1"
end

puts(f1) # 결과 f1

  • 매개변수를 받는 경우의 괄호 생략 가능(받는 값은 한칸 띄워서)
def f2 k
    return k
end

puts(f2 "hello world!")
# 결과 hello world!
puts f2 "No parenthesis!"
# 결과 No parenthesis! 
# puts도 함수니까 괄호 생략 가능함 근데 괄호 없으면 햇갈림

  • 함수 정의시 return의 생략
def f3 k
    a = 1
    b = 1
    a + b + k
end

puts f3 2
# 1 + 1 + 2 ->  4 출력
# 함수 마지막에 return을 생략해도 return으로 간주됨

  • 주로, 쓰는게 가독성이 좋으므로 쓰고 나중에 다른 사람 코드리딩시 생략가능함을 참고하자


2) 블럭(Block)

  • times 함수
    • a.times() {|i| 코드블럭} : 코드블럭을 a 번 반복해라 i는 출력시 0 부터 시작하여 1씩 증가
    • times 함수를 통해서 반복문 보다 효율적이고 직관적임 물론, times 함수 안에 그 해당하는 반복문이 들어 있겠지만
5.times() {puts "5times"}
# 결과
# 5times
# 5times
# 5times
# 5times
# 5times
5.times() {|i| puts i}
# 0
# 1
# 2
# 3
# 4
# 아래 반복문도 같은 결과
k = 0
while k < 5 # do생략 가능함
  puts k
  k += 1
end

  • upto 함수
    • a.upto(b) {|i| 코드블럭} : 코드블럭을 a에서 1씩 증가시켜 b가 될때까지 반복해라 i는 코드블럭 안에서 a부터 1씩 증가시킴
3.upto(5) {|i| puts i}
# 3
# 4
# 5
f1 = 0
a = 3
a.upto(5) {|k| f1+=k}
puts(f1)
# 0+3 -> 3+4 -> 7+5 = 12

  • 배열에서 블록의 사용

  • each 함수

    • 배열 안에 있는 것을 하나하나 꺼내는 함수
arr1 = ['a', 'b', 'c']
arr1.each() {|i| puts i}
# a
# b
# c
# 위아래 같은 내용의 코드
for value in arr1
    puts(value)
end

  • delete_if 함수
    • 배열에서 조건을 넣어 true에 해당하는 값을 없애는 함수
arr2 = [1, 3, 55, 63, 34, 52]
arr2.delete_if() {|item|
    item > 50
}
puts arr2 # 파이썬과 다르게 그냥 개행으로 출력됨 중괄호 출력이 아니고
# 1
# 3
# 34
# 위아래 같은 내용의 코드임
arr2.delete_if() do |item|
    item > 50
end
puts arr2
# 코드가 길어지면 {} 중괄호 말고 do end 사용을 권장함


3) 모듈(Module)

  • 복잡도를 낮추고 체계를 갖추는 것인데 다른것을 인용해서 사용시 의도치 않게 같은 이름으로 정의 된것 끼리 충돌할 수 있고 또한 이름을 다르게 지정하더라도 보기 지저분해짐 그래서 모듈을 통해서 해결!
  • 함수가 많아지는 경우도 고려하여 함수를 그룹핑 하여 디렉토리화 하는 것에 모듈을 사용함
  • python의 경우에는 파일로 분리되는 특성이 있음 (improt 사용) 즉, 같은 파일내에서 모듈 설정하고 호출이 불가함
  • ruby의 경우 파일로 분리될 수 도 있고 안할 수 도 있음 (require 사용) 즉, 같은 파일내에서 모듈 설정하고 호출도 가능함

module 만들기 (Ruby)

# Module 폴더에 해당 모듈 이름으로 파일을 만든다. tom.rb , jerry.rb
# tom.rb
module Tom # 첫글자 무조건 대문자
    module_function() # 모듈이름.함수 형태로 만들어 주는 함수(루비 내장 함수)
    def a()
        return "a"
    end
end

# jerry.rb
module Jerry
    module_function()
    def a()
        return 'b'
    end
end

module 연결하기 (Ruby)

# require '모듈 이름' 근데 에디터 환경에서는 작동이 안됨 터미널에선 가능한데
# require './tom' 하면 된다.(단, 실행파일과 같은 위치일 경우)
# require_relative 'tom' (단, 실행파일과 같은 위치일 경우)
# 나는 module 이라는 새로운 폴더에 파일을 생성했기 때문에
require './module/tom'
require './module/jerry'
# 아니면
require_relative 'module/tom'
require_relative 'module/jerry'
puts(Tom.a())
puts(Jerry.a())
# 결과 a b

중복제거

  • 겹치는 함수가 있을경우 모듈로 대체하여 사용함으로써 중복제거
  • 모듈로 연결했을 때 코드에 문제가 생겨서 고치는 경우 모듈만 고쳐도 모두 반영이 되기 때문에 유지보수가 좋다.

로그인 함수 모듈화와 호출

  • 주의점은 루비이므로 모듈이름을 설정해야 하고, 함수 모듈화 함수(module_function)를 사용
  • 모듈화
# login.rb 파일을 Module 폴더에 생성-> 모듈화
module Auth
    module_function()
    def login(id)
        members = ['tom', 'jerry', 'snoopy']
        for member in members do
            if member == id
                return true
            end
        end
        return false
    end


    def real_login()
        puts("Enter your id!\n")
        input_id = gets.chomp
        if login(input_id)
            puts("Hello!, " +input_id)
        else
            puts("Check your id!")
        end
    end
end

  • 호출

  • require 는 경로를 불러오는 역할이기 때문에 경로와 파일 이름으로 불러야 하고

  • 특정하게 지정한 모듈이름은 호출시에 사용

# 로그인 모듈 연결 해보기
# 경로 주의하고, 파일 이름으로 연결해야함
require "./module/login"
# 호출시에는 지정했던 모듈 이름으로 호출
puts(Auth.real_login())



내일은 루비 객체지향 들어감, 파이썬 복습 겸