U E D R , A S I H C RSS

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

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)의 페챠쿠챠는 불완전하다함ㅋ 주제 벗어남ㅠ 탈락
권순의 탈락
송지원
임상현
황현
정의정

추후수정합니다. 다른 보시는 분들도 기억나시는대로 수정 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 에드온을 어찌해봐야겠습니다. - 임상현

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