U E D R , A S I H C RSS

Ruby/2011년스터디/세미나 (rev. 1.76)

Ruby/2011년스터디/세미나


1. RubyLanguage 소개

RubyLanguage 소개와, 기초 문법을 설명하는 파트
  1. 루비란 무엇인가
    • 루비의 개발 배경
    • 루비의 특징
    • 루비의 역사
  2. 루비와의 첫 만남
  3. 루비 써보기
    • 계산기로서의 루비
    • Hello World!
    • 간단한 코드 따라하기

2. Ruby 문법 실습

  • 환경세팅하기
    • tryRuby
    • irb
    • visual studio의 ironRuby
    • netbeans의 ruby플러그인
    • eclipse ruby플러그인
    • aptana (경량형 이클립스)

  • Hello Ruby!
    • 화이트스페이스는 무시
      • 1- 2
      • 1
        -2

    • 루비는 진정한 객체지향 언어다?!
      • 루비의 모든것은 객체로써 존재한다
        • 1.0/0.0 -> infinity
        • 123.method
        • "문자열".method
      • 함수조차 nilClass의 멤버함수
        • nilClass의 인스턴스는 nil하나, prototype은 없음. 다른 함수들은 가지고있음
        • 멤버변수도 객체, 객체안의 객체!
        • 내부속성 class
    • 루비의 신기한 배열. 음의 인덱스를 가질 수 있다
    • 루비 퀵가이드


  • Ruby.new
  • 이제 객체를 만들어보자
    • 루비에서는 클래스명이 대문자로 시작해야한다!(아니면 에러)
      • 루비의 변수명 선언 규칙
    • initialize 함수로 객체 선언하기
      • 루비의 생성자 initialize. ( 디폴트 생성자가 있나봄)
        class Some
        def initialize
        # init variables
        end
      • end

      • 멤버변수 선언하기(@)
    • def initialize
      @var # this is the way how declaring variable
      end

    • 루비는 객체의 동적인 변경이 가능하다!
      • 이미 생성된 인스턴스에 멤버함수 추가하기
        class Some
        def initialize
        # init variables
        end
      • end

        def Some.function
        # dynamic function declare
        end

      • 상속
    • class Some2 < Some
      def initialize
      # this is overriding
      end
      end

      • 함수의 오버라이딩
        • 부모 클래스를 동적 변경하면, 자식 클래스의 인스턴스는 어떻게 될까?
      • Some2.function2 # undefined method
        def Some.function2
        # new function
        end
        Some.function2 # works!
        • 루비의 클래스/메소드 체이닝을 가르칠까요?
          • superclass

    • attr_reader/attr_writer

  • 메서드를 만들어보자! (루비는 return문이 없어도 돼)
    • 맨 마지막 연산식의 결과가 리턴됨
    • 메서드는 {} 대신 def/end로
    • 루비의 함수는 () 생략가능!
    • 문자열 반복출력 메소드 만들어보기
      • while
      • do/while
      • for

    • 블럭을 이용한 반복자 함수
      • 루비의 블럭 넘기기
        {| parameters| do something with parameters..}
        yield : get the block and run it

        a = 1, 2, 3, 4, 5
        a.each {|x| puts x+1} # bloack은 복사 전달인가?(maybe)

    • 기본 입출력
      • 입력받은 문자열 반복 출력해보기
      • 입력 <- gets
      • 출력 <- puts, print

  • 정규표현식(생략하는게 나을 듯)

  • 예외처리하기 (세번째 세미나에서 필요할까?)
    • if/else로 예외 처리해보자
    • rescue로 만들기

  • 유닛테스트(생략가능)
    • 상속을 통한 테스트 케이스 만들기
      UnitTest::

  • 여러분은 이제 루비 유저입니다!
    • 자축

  • DeleteMe) 여백이 이상하네요.. 세미나 끝나고 고칠게요ㅜ

3. Ruby로 만들어보기

  • RRobots를 이용한 RubyLanguage Robocode
  • 를 하려고 했지만 tcl 문제로 CodeRace로 변경
    • Pair Programming : Pair를 밸런스에 맞게 짜드림.
  • 레이튼 교수와 함께하는 CodeRace
    • A마을에서 B마을로 가려면 강을 건너야한다.
    • 배를 타고 두 마을 사이를 오갈 수 있다.
    • Step 1
      • 레이튼 교수가 배를 타고 건너 B마을로 건너가게 하자.
      • 평가
        • 레이튼 교수가 A마을에서 B마을로 건너갈 수 있는지 본다.
      • 예제

class Layton
  def initialize
    @location = 'A'
  end

  def crossRiver
    printLocation
    @location = 'B'
    print " -> "
    printLocation
    print "\n"
  end

  def printLocation
    print @location
  end
end

4. 회고

이름 Keyword 이유 비고
권순의 우아하다 성현이가 Ruby를 우아한 언어라고 소개함. 지혜가 책에서 $_가 우아하다는 표현을 봤다고 말함.
송지원 불완전하다
김준석 ? 루비는 개발자의 실수를 스스로 메워준다? 탈락
윤종하 ifelse 이거밖에 못 들어서 탈락
임상현
황현 에러 불완전하다 -> 에러가 너무 많이 났음
정의정 변수
강소현 페챠쿠챠 성현(2)의 페챠쿠챠는 불완전하다함ㅋ 주제 벗어남ㅠ 탈락
권순의 탈락
송지원 irb 불완전하다고 느껴진 이유가 irb 때문이기도 하다고 느껴짐.( NetBeans에서 코딩하면 잘되는게 irb라 안되는 것도 있어서)
임상현
황현 트위터 변수 -> 전역 변수가 앳(@)으로 시작해서 트위터 멘셔닝 같았음
정의정 자폭
추후수정합니다. 다른 보시는 분들도 기억나시는대로 수정 or 추가해주세요. - 김수경

5. 후기

  • "우아한" 언어인 루비를 다운받아 irb를 사용해 실습을 해보았다. 처음에 irb를 눌렀을 때, 무슨 dll파일이 없어서 실행이 안된다는 팝업창이 떴는데 확인 누르니까 알아서 잘 켜졌다. Ctrl+C를 눌렀더니 끌지 말지 여부가 떴는데 N을 눌러도 꺼졌다. irb보다는 넷빈즈를 이용하는게 좋다는 말이 와닿았다. 1+2를 치면 알아서 3이 나오는 것과 리턴 값이 항상 표시되는 것이 신기했다(없을 경우도 =>nil 로!). 루비의 블록 넘기기는 #define이랑 비슷한 느낌이 들었다. 새로운 언어임에도 쉽게 익힐 수 있어 좋았다. 하지만, 페어로 하는 만큼 실습 시간도 반감되지 않았을까 죄송스러웠다. 세미나 공지가 뜨면 노트북을 가져가도록 해야겠다. - 강소현
    • 아.. 세미나가 끝나니까 할말이 생각나네요..ㅠㅠ 루비의 블록 넘기기는 사실 블록이 yield구문에게 전달되는 것이 아니라 yield를 만나면 함수의 호출부로 컨트롤이 이동해 블록이 있는지 확인하고 실행합니다. 책에서는 co-routine 이라고 이해하면 된다는 설명이 있어요~ 블록이 전달되는게 아니라 컨트롤 플로우가 왔다갔다!! 스위치 태스킹처럼요. 세미나때 설명을 잘 해드렸어야 했는데 죄송천만번입니다 - 서지혜
    • 우리 이거 공부했었는데 나도 까먹었네… 역시 공부는 한번 하면 까먹나봐ㅠㅠ - 김수경
  • 우선 늦게가서 if-else 밖에 못 들어먹었습니다 ㅠ 상당히 아쉬웠어요. 근데 if구문을 사용해도 의도가 명확하다면 괄호가 필요없다게 참 신기하더라구요. 제가 약간이라도 다뤄본 C, C++, Java, JavaScript, Python에서는 괄호를 반드시 사용해야만 하는 걸로 알고있었는데 말이죠. 근데 여기서 "의도가 명확하다는 것"이 무슨말인지.. 솔직히 이해가 안 가요. ㅠ 저가형 두뇌... 그리고 루비 개발도구가 참 많더군요. aptana... 루비를 위해 만들어졌지만 루비를 쓰지 못한다는게 참 인상적이었습니다. 그리고 irb의 개발환경을 보니 수정을 할 수가 없어 참 불편하더군요. Python Shell의 개발환경이 보다 더 우수한 것 같습니다. 그리고 회고할 때 주워들은 "우아하며 불완전한 언어"라는 말... 왜 그런지 궁금하네요. - 윤종하
    • 의도가 명확하다는 것이 무엇인지 설명하는 것보다 의도가 명확하지 않은 상황을 제시하는 게 이해하기 좋을 것 같으니 하나 예를 들어볼게. RubyLanguage에서 괄호를 쓰지 않아도 되는 것은 if 구문에 대해서만 그런 것은 아니야. 함수의 경우도 마찬가지지. 만약 내가 매개변수 a와 b를 받아 그 둘을 더해 반환해주는 함수 add(a, b)를 만들었다 치자. 이 메서드를 다음과 같이 이용할 수 있겠지.

add(3,4) # => 7 반환 (#은 RubyLanguage에서 주석을 나타낼때 사용)
add 3,4  # => 7 반환
윗줄 아랫줄 모두 문제 없이 실행되지. 이 경우는 의도가 명확한 경우야. 그런데 이 add 메서드를 호출해서 3, 4, 7을 더한 값을 알고 싶다면

add(3, add(4, 7))
이렇게 메서드를 중첩해서 호출해야겠지? 이 때 괄호를 사용하지 않으면 다음과 같이 쓸 수 있어.

add 3, add 4, 7
그런데 위 코드는 대체 어떤 것이 처음 나온 add 메서드에게 넘겨주는 매개변수인지 명확하지 않지? 이런 경우는 의도가 불명확한 경우라 반드시 괄호를 사용해서 코드를 작성해야해. - 김수경

  • Ruby 라는 언어를 처음으로 접하게 되었습니다. irb를 이용하여 Ruby 코딩을 연습해 보았습니다. 코드 수정이 일단 한번 해놨으면 다시 정의를 해야되서 매우 불편하였으나 c같이 문법이 딱딱하지 않고 생략해도 구문 자체의 의미가 명확하다면 알아서 해주는 모습이 매우 신기했습니다. 나중에 lua도 공부해서 wow 에드온을 어찌해봐야겠습니다. - 임상현
    • 그건 irb의 문제인거같습니다..ㅋㅋ 파일명.rb로 파일을 작성한 다음 ruby 파일명으로 컴파일/실행할 수도 있어요~ - 서지혜
  • 진짜 한번쯤 건드려보고 싶은 언어였는데 차일피일 미루다가 드디어 해봤습니다. 루비의 문제점도 많이 보였지만 그래도 (제 입장에서는) 직관적인거 같아서 좋았습니다. 시간이 된다면 irb로가 아닌 editor를 이용해서 편집한 소스코드를 컴파일하고 돌려보는 방법도 해보면 좋겠어요. - 지원
    • 저도 아직 RubyLanguage에 익숙하지 않아서 어려운 점이 많지만 조금이나마 공부하며 써보니 직관적이라는 생각이 많이 들었어요. 오늘 정보보호 수업을 들으며 EuclideanAlgorithm을 바로 구현해보니 더더욱 그런 점이 와닿네요. 좀 더 긴 소스코드를 작성하실땐 Netbeans를 이용하시는 걸 추천해요~ 매우 간단하게 설치하고 간단하게 사용할 수 있답니다. - 김수경
  • 그간 공부하신 것으로 세미나 준비하시느라 고생하셨습니다. 하지만 전 역시 "중구난방"이라는 생각이 강하게 듭니다. 마츠모토씨가 좋아하는 부분만 섞어서 만들었다고 하니 그럴 수 밖에....... 솔직하게 말하면 좀 거부감이 있어요. - 황현
    • "중구난방"에 헉-했네요ㅋㅋ 저도 그 생각했습니다. 좋게말하면 장점들을 모아 만든것. 나쁘게 말하면 잡종... 현재 루비는 순혈주의(펄의 잔재지우기)운동중이랍니다. Martz가 필두라지요:-) 루비의 시작이 좀 근본없어뵈는(..)건 사실이지만 언어들의 장점을 모은것에는 분명 좋은점도 있어요:) - 서지혜
  • 세미나 후기
    1. 이번 RubyLanguage 세미나는 방학때 스터디를 하며 몇 주 전부터 준비해왔습니다. 그런데 한동안 루비를 소홀히 했더니 이와 지혜 프리젠테이션을 들으며 저도 새롭게 알게 된 것들이 있었습니다. 부끄럽네요. 분명 같이 공부했던 것들인데…T_T
    2. CodeRace를 준비하며 간단한 코드를 짜보았는데 생각보다 어려워서 역시 책만 읽어서는 안 되겠다는 생각이 들었습니다. 그냥 돌아가게 짜라면 짤 수 있겠는데 언어의 특성을 살려 우아하게 짜려니 어렵네요.
    3. 시간에 치여 준비했던 CodeRace를 못 한 것이 아쉽지만 시간이 좀 걸렸더라도 지혜가 RubyLanguage 문법을 설명할 때 다같이 실습하며 진행했던 것은 좋았습니다. 그냥 듣기만 했으면 지루하고 기억에 안 남았을지도 모르는데 직접 따라하며 문법을 익히는 방식이라 참여하신 다른 분들도 더 재미있고 뭔가 하나라도 기억에 확실히 남는 시간을 보내셨을거라는 생각이 드네요.
    4. 아쉽게도 못했던 CodeRace는 특별한 더 좋은 다른 일정이 없는 한 다음주나 다다음주 정모에서 진행하고자 합니다. - 김수경
  • 스노우볼이란 게임으로 회고를 하는 방법이 매우 신선했습니다. 시간배분을 못해 레이스를 못한게 마음에 걸렸는데 좋은 마무리 부탁드립니다 - 서지혜
  • 드디어 Ruby를 접해보았습니다. 여러가지 장점이 보였지만, 궁금한 것도 많이 생긴 세미나였습니다. 특히 메모리 관리 부분에서 가비지 콜렉터 존재 유무가 많이 궁금해지더군요. 그래서 검색해보니 참 재밌네요 ㅋㅋㅋ (1. 스택 개념 없음, 힙만 사용 2. 로컬변수도 힙에 올림 3. 명시적으로 메모리 해제 못함). 그리고 { |x| ~~ } 이 문법 보면서 사용하기 꺼려지는 문법이라는 생각이 든 건 저뿐만인가요? 궁금하네요. - 박성현
    • 스스로 찾아보시다니 좋은 자세이십니다. { |x| ~~ } 블록구문은 처음엔 잘 이해가 가지 않지만(지금도) 함수의 구현마저 동적인 루비의 장점이 잘 나타나 있는 부분이라 생각됩니다. - 서지혜

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:27:56
Processing time 0.0782 sec