1. RubyLanguage 소개 ¶
RubyLanguage 소개와, 기초 문법을 설명하는 파트
- 루비란 무엇인가
- 루비의 개발 배경
- 루비의 특징
- 루비의 역사
- 루비의 개발 배경
- 루비와의 첫 만남
- http://www.ruby-lang.org
- 루비 설치
- irb 사용법
- http://www.ruby-lang.org
- 루비 써보기
- 계산기로서의 루비
- Hello World!
- 간단한 코드 따라하기
- 계산기로서의 루비
2. Ruby 문법 실습 ¶
- 환경세팅하기
- tryRuby
- irb
- visual studio의 ironRuby
- netbeans의 ruby플러그인
- eclipse ruby플러그인
- aptana (경량형 이클립스)
- tryRuby
- Hello Ruby!
- 화이트스페이스는 무시
- 1- 2
- 1
-2
- 1- 2
- 화이트스페이스는 무시
- 루비는 진정한 객체지향 언어다?!
- 루비의 모든것은 객체로써 존재한다
- 1.0/0.0 -> infinity
- 123.method
- "문자열".method
- 1.0/0.0 -> infinity
- 함수조차 nilClass의 멤버함수
- nilClass의 인스턴스는 nil하나, prototype은 없음. 다른 함수들은 가지고있음
- 멤버변수도 객체, 객체안의 객체!
- 내부속성 class
- nilClass의 인스턴스는 nil하나, prototype은 없음. 다른 함수들은 가지고있음
- 루비의 모든것은 객체로써 존재한다
- 루비의 신기한 배열. 음의 인덱스를 가질 수 있다
- 루비 퀵가이드
- Ruby.new
- 이제 객체를 만들어보자
- 루비에서는 클래스명이 대문자로 시작해야한다!(아니면 에러)
- 루비의 변수명 선언 규칙
- 루비의 변수명 선언 규칙
- initialize 함수로 객체 선언하기
- 루비의 생성자 initialize. ( 디폴트 생성자가 있나봄)
class Some
def initialize
# init variablesend
end
- 루비의 생성자 initialize. ( 디폴트 생성자가 있나봄)
- 멤버변수 선언하기(@)
def initialize - 루비에서는 클래스명이 대문자로 시작해야한다!(아니면 에러)
- 루비는 객체의 동적인 변경이 가능하다!
- 이미 생성된 인스턴스에 멤버함수 추가하기
class Some
def initialize
# init variablesend
end
def Some.function
# dynamic function declare
end - 이미 생성된 인스턴스에 멤버함수 추가하기
- 상속
@var # this is the way how declaring variable
enddef initialize
end# this is overriding
end- 함수의 오버라이딩
- 부모 클래스를 동적 변경하면, 자식 클래스의 인스턴스는 어떻게 될까?
Some2.function2 # undefined method - 부모 클래스를 동적 변경하면, 자식 클래스의 인스턴스는 어떻게 될까?
- 루비의 클래스/메소드 체이닝을 가르칠까요?
- superclass
- superclass
def Some.function2
# new function
endSome.function2 # works!
- attr_reader/attr_writer
- 맨 마지막 연산식의 결과가 리턴됨
- 메서드는 {} 대신 def/end로
- 루비의 함수는 () 생략가능!
- 문자열 반복출력 메소드 만들어보기
- while
- do/while
- for
- while
- 블럭을 이용한 반복자 함수
- 루비의 블럭 넘기기
{| 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::
- 자축
3. Ruby로 만들어보기 ¶
- RRobots를 이용한 RubyLanguage Robocode
- 를 하려고 했지만 tcl 문제로 CodeRace로 변경
- Pair Programming : Pair를 밸런스에 맞게 짜드림.
- Pair Programming : Pair를 밸런스에 맞게 짜드림.
- 레이튼 교수와 함께하는 CodeRace
- A마을에서 B마을로 가려면 강을 건너야한다.
- 배를 타고 두 마을 사이를 오갈 수 있다.
- Step 1
- 레이튼 교수가 배를 타고 건너 B마을로 건너가게 하자.
- 평가
- 레이튼 교수가 A마을에서 B마을로 건너갈 수 있는지 본다.
- 레이튼 교수가 A마을에서 B마을로 건너갈 수 있는지 본다.
- 예제
- 레이튼 교수가 배를 타고 건너 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이랑 비슷한 느낌이 들었다. 새로운 언어임에도 쉽게 익힐 수 있어 좋았다. 하지만, 페어로 하는 만큼 실습 시간도 반감되지 않았을까 죄송스러웠다. 세미나 공지가 뜨면 노트북을 가져가도록 해야겠다. - 강소현
- 우선 늦게가서 if-else 밖에 못 들어먹었습니다 ㅠ 상당히 아쉬웠어요. 근데 if구문을 사용해도 의도가 명확하다면 괄호가 필요없다게 참 신기하더라구요. 제가 약간이라도 다뤄본 C, C++, Java, JavaScript, Python에서는 괄호를 반드시 사용해야만 하는 걸로 알고있었는데 말이죠. 근데 여기서 "의도가 명확하다는 것"이 무슨말인지.. 솔직히 이해가 안 가요. ㅠ 저가형 두뇌... 그리고 루비 개발도구가 참 많더군요. aptana... 루비를 위해 만들어졌지만 루비를 쓰지 못한다는게 참 인상적이었습니다. 그리고 irb의 개발환경을 보니 수정을 할 수가 없어 참 불편하더군요. Python Shell의 개발환경이 보다 더 우수한 것 같습니다. 그리고 회고할 때 주워들은 "우아하며 불완전한 언어"라는 말... 왜 그런지 궁금하네요. - 윤종하
- 의도가 명확하다는 것이 무엇인지 설명하는 것보다 의도가 명확하지 않은 상황을 제시하는 게 이해하기 좋을 것 같으니 하나 예를 들어볼게. RubyLanguage에서 괄호를 쓰지 않아도 되는 것은 if 구문에 대해서만 그런 것은 아니야. 함수의 경우도 마찬가지지. 만약 내가 매개변수 a와 b를 받아 그 둘을 더해 반환해주는 함수 add(a, b)를 만들었다 치자. 이 메서드를 다음과 같이 이용할 수 있겠지.
- 의도가 명확하다는 것이 무엇인지 설명하는 것보다 의도가 명확하지 않은 상황을 제시하는 게 이해하기 좋을 것 같으니 하나 예를 들어볼게. 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 메서드에게 넘겨주는 매개변수인지 명확하지 않지? 이런 경우는 의도가 불명확한 경우라 반드시 괄호를 사용해서 코드를 작성해야해. - 김수경
- 그건 irb의 문제인거같습니다..ㅋㅋ 파일명.rb로 파일을 작성한 다음 ruby 파일명으로 컴파일/실행할 수도 있어요~ - 서지혜