Whiteship's Note


5분 10초 동안 춤의 역사를 보여주마





아저씨 멋져요!

'모하니? > 그냥 놀아' 카테고리의 다른 글

9만 9천원 짜리 노트북  (0) 2006.10.26
필명을 바꿨다.  (0) 2006.10.23
시험 끝~~~~~  (0) 2006.10.22
황홀한 CF  (0) 2006.10.20
공짜로 안아드립니다.  (0) 2006.10.16
소녀 복서 ㄷㄷㄷ...  (0) 2006.10.15
이상한 사람들  (0) 2006.10.15
지구에서 인간이 없어져도...  (0) 2006.10.14
감기야 일주일만 봐죠..시험기간이야 나..  (0) 2006.10.13
시험시작  (0) 2006.10.10
5분 10초 동안 춤의 역사를 보여주마  (0) 2006.10.06
top


Regular Expressions

RUBY/Manual : 2006.10.05 16:18


Regular Expressions

모든 프로그래머들은 Ruby에 이미 만들어져 있는 문자열, 정수, 실수, 배열 등과 같은 것에 익숙할 것입니다. 하지만 Ruby가 가지고 있는 regular expression은 스크립트 언어라고 불리는 것에만 있습니다. 말하기 부끄럽지만 text를 다루는데는 regular expression이 매우 유용합니다.

여기서는 그 전부에 대해 다루지는 않고 regular expression을 사용하는 몇가지 예만 살펴 보겠습니다. 56페이지 부터 시작하는 부분에서 이것에 대한 모든 것을 볼 수 있을 것입니다.

regular expression은 문자열에서 특정 패턴을 구분하는 간단한 방법입니다. Ruby에서는 / / 슬러쉬 사이에 패턴을 적어 넣음으로써 regular expression을 작성할 수 있습니다(/패턴/). 그리고 Ruby에서 이것은 당연히 객체이고 객체처럼 다뤄 집니다.

예를 들어 문자열에 Perl또는 Python을 포함하는 문자열에 매치하는 패턴을 작성하고 싶다면 다음과 같은 regular expression을 사용할 수 있습니다.

/Perl|Python/


"|" 파이프 문자를 이용하여 여러개의 문자열을 구분 할 수 있습니다. 그리고 괄호도 사용할 수 있지요. 따라서 위의 표현을 다음괕이 적을 수도 있습니다.
/P(erl|ython)/


그리고 반복되는 패턴을 기술 할 수도 있습니다. /ab+c/는 문자열이 a를 가지고 있고 a뒤에 하나 또는 그 이상의 b가 있고 그 뒤에 c가 있는 문자열에 매칭됩니다. +대신에 *를 써서 /ab+c/라고 표현하면 a뒤에 b가 없거나 하나 이상일 수 있고 그 뒤에 c가 있는 문자열에 매칭됩니다.

여러 문자 그룹중 하나를 매칭 시킬 수도 있습니다. \s 는 공백 문자(스페이스, 탭, 새줄 등등)와 매칭 됩니다. \d는 모든 정수를 매칭 됩니다. and ``\w'', which matchesany character that may appear in a typical word. The single character``.'' (a period) matches any character.

이것들을 사용하여 몇가지 유용한 regular expression을 만들 수 있습니다.

/\d\d:\d\d:\d\d/     # a time such as 12:34:56
/Perl.*Python/       # Perl, zero or more other chars, then Python
/Perl\s+Python/      # Perl, one or more spaces, then Python
/Ruby (Perl|Python)/ # Ruby, a space, and either Perl or Python

"=~" 이 오퍼레이션은 문자열에 regular expression을 매칭 하는데 사용할 수 있습니다. 만약에 문자열에서 해당하는 패턴이 발견되면 =~ 는 그 패턴이 시작하는 위치를 리턴하고 없다면 nil을 리턴합니다. 이 말은 if문이나 while문의 조건식에 사용할 수 있다는 것입니다. 다음의 예는 문자열에 'Perl' 또는 'Python'이 있는지 확인합니다.

if line =~ /Perl|Python/
 puts "Scripting language mentioned: #{line}"
end

Ruby의 메소드를 사용하여 패턴에 매칭되는 문자열을 다른 문자열로 교체 할 수 있습니다.

line.sub(/Perl/, 'Ruby')    # replace first 'Perl' with 'Ruby'
line.gsub(/Python/, 'Ruby') # replace every 'Python' with 'Ruby'

이 책 전반에 걸쳐 regular expression을 살펴 볼 것입니다.

'RUBY > Manual' 카테고리의 다른 글

Reading and 'Riting  (0) 2006.11.04
Blocks and Iterators  (0) 2006.11.03
Regular Expressions  (0) 2006.10.05
Control Structures  (0) 2006.10.04
Arrays and Hashes  (0) 2006.10.02
Some Basic Ruby  (0) 2006.09.26
Ruby Is an Object-Oriented Language  (0) 2006.09.17
Roadmap  (0) 2006.09.16
top


2장 Observer Pattern(끝)

Design Pattern : 2006.10.05 10:37


Observer pattern

From Wikipedia, the free encyclopedia

Jump to: navigation, search
It has been suggested that Event listener be merged into this article or section. (Discuss)

The observer pattern (sometimes known as publish/subscribe) is a design pattern used in computer programming to observe the state of an object in a program. It is related to the principle of Implicit invocation.

This pattern is mainly used as a poor man’s event handling system.In some programming languages, the issues addressed by this pattern arehandled in the native event handling syntax.

The essence of this pattern is that one or more objects (called observers or listeners) are registered (or register themselves) to observe an event which may be raised by the observed object (the subject). (The object which may raise an event generally maintains a collection of the observers.)

The UML diagram below illustrates this structure:



원문에 보시면 더 자세한 설명이 있습니다. 간략히 보면..

객체의 상태를 관찰하기 위한 디자인 패턴이라고 합니다.
주로 사용되는 곳은 event handling system이라고 합니다.
책이도 잠깐 나오지만 java의 수많은 이벤트 핸들링이 옵저버 패턴을 사용한 것인데 정말 놀랍지 안나요. ㅎㅎ

이 글을 보시면 옵저버 패턴을 어떻게 적용할 수 있을까요? 라는 질문에 대한 답변이 올라와 있는데요.

질문은 다음과 같습니다.
답변은 먼저 문제를 파악하고, 패턴을 이해하고, 그 다음 적용하라는 이야기를 해주고..
Java code로 예제를 제시해 줍니다.

마지막으로 observer pattern을 적용할 수 있는 경매장 예제를 보면서 마무리를 하겠습니다.

위 상황에 맞도록 다음주 월요일까지 과제를 해야 합니다. ㅠㅠ

'Design Pattern' 카테고리의 다른 글

Strategy Pattern 예제(끝)  (0) 2006.10.08
Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제  (0) 2006.10.08
Head First Degisn Patterns 소스코드 다운받기.  (0) 2006.10.08
2장 Observer Pattern(끝)  (0) 2006.10.05
2장 Observer Pattern(계속)  (2) 2006.10.05
2장 Observer Pattern(계속)  (0) 2006.10.05
2장 Observer Pattern  (0) 2006.10.05
1장 Strategy Pattern (끝)  (0) 2006.09.26
1장 Strategy Pattern(계속)  (2) 2006.09.26
top


2장 Observer Pattern(계속)

Design Pattern : 2006.10.05 10:28


기상 스테이션

복잡해 보일 수도 있지만 매우 간단한 class diageam입니다. 각각의 display들이 Display interface를 구현하도록 추가한 것만 빼면 기본적인 observer패턴의 모습과 같습니다.
WeatherData class에는 observer들을 등록, 삭제할 List를 가지고 있어야 합니다. 그래야 나중에 상태가 바뀌었을 때(measurementsChanged()가 호출됐을 때) notifyObservers() 메소드에서 자신의 정보를 원하는 옵저버들에게 정보를 줄 수 있겠죠.
정보를 전달하는 방법은 옵저버들이 가지고 있는 update 메소드를 호출하여 update 메소들의 인자로 data를 넘기는 방법을 사용합니다. 이 방법은 subject에서 정보가 바뀔때 마다 모든 옵저버들에게 정보를 넘겨주는 방식으로 push 하는 방식입니다.
이러한 방법의 단점은 옵저버가 원하든 원치 않든 등록되어 있으면 무조건 정보가 바뀔 때 마다 갱신 받는 것입니다.(물론 그러고 싶어서 등록한거겠지만 가끔가다 단체로 가족여행 갔을 때 신문이 쌓여 있으면 도둑이 들기 쉽기 때문에 잠깐만 신문배달을 중지하고 싶기도 하겠죠..)
따라서 무조건 받는 방법 말고 옵저버가 원할 때 원하는 정보만 가져 갈 수 있도록 하는 pull방식을 사용하는 것이 유용할 때도 있습니다.
그리고 자바 API에 이미 pull방식과 push방식이 모두 가능한 class들을 구현해 두었습니다.
(update의 인자로 Observale객체 자체를 넘기도록 구현해 두었습니다. 구독자 입장에서는 원하는 시점에서 원하는 정보를 getter를 사용해서 가져가면 되기 때문이지요.)
앞에서 보았던 Subject interface에 해당하는 것이 java의 Observable abstract class입니다. class이기 때문에 상속을 사용해야겠지요.

java.util
Class Observable

java.lang.Object  extended byjava.util.Observable
setChanged() 메소드는 객체의 정보가 바꼈는지 체크하는 플래그를 true로 만드는 메소드입니다. 이 메소드를 사용하면 매번 정보가 바뀔 때마다 알려주는 것이 아니라 subject에서 알려주고 싶을 때 알리도록 조절할 수 있다는 유용함이 생기겠네요.
그리고 다음은 앞에서 보았던 Observer와 거의 같은 Observer 인터페이스입니다.
notifyObservers() 메소드가 Observer 인터페이스에 있는 update() 메소드를 호출할 것입니다.


update의 인자가 우리가 사용한 것( update( teperature, humidity, pressure) )와는 약간 다르네요. 처음에 넘겨주는 것이 observeable( subject 객체 ) 그리고 정보를 객체형태로 넘겨줍니다.
이 둘을 이용해서 class diagram을 수정하면 다음과 같습니다.

자바에 내장된 옵저버 패턴을 사용하려면
먼저 옵저버가 되어야 하기 때문에 addObserver() 메소드를 호출하면 되고 탈퇴하고 싶을 때는 deleteObserver()를 호출하면 됩니다.
이 부분은 전에 사용한 방법과 같습니다 단지 메소드 이름만 바뀐거죠.
다음으로 달라진 부분인데 바로 정보를 전달하는 부분입니다.
연락을 돌리려면 먼저 setChanged()를 호출해서 바꼈다는 flag를 true로 만들어 주어야 합니다.
그리고 그 다음에 notifyObservers() 또는 notifyObservers(Object arg) 를 호출하여 그 내부에서 옵저버에 있는 update(Observable o, Object arg)를 호출하도록 합니다.
전에 사용하던 방법에 setChanged()를 호출하는 부분이 추가 된 것입니다.
이렇게 함으로써 정말 필요로도 할 때 정보를 갱신할 수 있는 유용함이 생기는 것입니다.
아! 그리고 update 메소드에 subject객체 자체를 보내기 때문에 이 객체에 있는 getter를 통해서 원하는 정보만 가져갈 수도 있게 되었군요.
풀방식을 이런식으로 사용할 수 있었네요 ㅎㅎ
p106에 제일 하단의 음영처리된 부분에 있는 gettere들을 보시면 무슨 말인지 이해하실 수 있을 것입니다.
그리고 또 차이점이 있는데
연락을 돌리는 순서가 옵저버들이 등록된 순서에 의존하지 않는 다는 것입니다.
(신문 배달이 옆집다음에 우리집에 주든 우리집에 주고 옆집을 주든 별 상관이 없죠? 신문을 받는 다는것 자체가 중요하죠.)

'Design Pattern' 카테고리의 다른 글

Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제  (0) 2006.10.08
Head First Degisn Patterns 소스코드 다운받기.  (0) 2006.10.08
2장 Observer Pattern(끝)  (0) 2006.10.05
2장 Observer Pattern(계속)  (2) 2006.10.05
2장 Observer Pattern(계속)  (0) 2006.10.05
2장 Observer Pattern  (0) 2006.10.05
1장 Strategy Pattern (끝)  (0) 2006.09.26
1장 Strategy Pattern(계속)  (2) 2006.09.26
1장 Strategy Pattern  (0) 2006.09.26
top


2장 Observer Pattern(계속)

Design Pattern : 2006.10.05 10:13


신문을 구독하는 방법과 동일 합니다.
책에는
출판사 + 구독자 = 옵저버 패턴
이라고 큼지막하게 쓰여있네요.
출판사는 주제(subject)로 부르고 구독자는 옵저버(observer)라고 부르도록 하겠습니다.
앞에서 본 예제에 적용하면 weatherData 객체가 subject 그리고 각종 display장치들이 옵져버에 해당합니다.
위 기본 설정을 중간에 잊어버리시면 앞으로 진행되는 설명을 이해하는데 막대한 지장이 있을 것입니다.
주제와 옵저버가 어떤 식으로 상호 작용하는지 살펴보겠습니다.

기본적으로 subject를 구독하기로 등록한 observer들 에게 소식을 전해줍니다.
( 나중에 가면 subject의 정보가 변할 때 마다 subject가 주는 push방법과 observer들이 원하는 정보만 가져 갈 수 있는 pull방법이 나옵니다. )
Observer가 아닌 객체는 observer가 되려면 다음과 같이 subject에 자기도 등록 해달라고 요청하면 됩니다.

그럼 이제 요청한 객체 역시 다른 observer들과 마찬가지로 subject의 정보가 바뀔 때 마다 새로운 정보를 받을 수 있게 됩니다.
그러다 더이상 subejct의 정보를 구독하길 원치 않는다면 즉 탈퇴하고 싶다면 아래와 같이 탈퇴하고 싶다고 subject에 요청하면 됩니다.

이러면 이제 subject에서는 더이상 그 객체에게 자신의 정보를 보내지 않습니다.
옵저버 패턴의 정의는 다음과 같습니다.
옵저버 패턴에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(ont-to-many)의존성을 정의합니다.
subject가 일 옵저버들이 다 그리고 당연히 옵져버들이 subject에 의존하고 있는 위의 그림들을 보면 쉽게 이해할 수 있습니다.

subject에 있는 세개의 메소드 중에서 첫 번째 보이는 notifyObserves 메소드에서는 자신의 정보를 모든 옵저버들에게 알려주기 위해서 옵저버들이 가지고 있는 update 메소드를 호출하여 알려 줄 것입니다.
subject와 옵저버는 서로 결합된 관계지만 subject는 사실 누가(어떤 옵져버)가 자신의 정보를 원하는지 확실히 모르고 있습니다. 누군가 갑자기 등록하기도 하고 더 이상 관심없다며 탈퇴하기 때문이지요. 또한 그러한 일들로 인해서 subject에 있는 코드가 바뀔일도 없습니다. 이렇게 유연한 관계의 결함을 느슨한 결합(Loose coupling)이라고 합니다.
여기서 새로운 디자인 원칙 하나가 추가됩니다.
디자인 원칙4
서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다.
자 그럼 위에서 살펴본 observer 패턴을 다시 기상 스테이션 설계에 적용해 봅시다.

'Design Pattern' 카테고리의 다른 글

Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제  (0) 2006.10.08
Head First Degisn Patterns 소스코드 다운받기.  (0) 2006.10.08
2장 Observer Pattern(끝)  (0) 2006.10.05
2장 Observer Pattern(계속)  (2) 2006.10.05
2장 Observer Pattern(계속)  (0) 2006.10.05
2장 Observer Pattern  (0) 2006.10.05
1장 Strategy Pattern (끝)  (0) 2006.09.26
1장 Strategy Pattern(계속)  (2) 2006.09.26
1장 Strategy Pattern  (0) 2006.09.26
top


2장 Observer Pattern

Design Pattern : 2006.10.05 10:10


엠파스 블러그에서 가져옵니다.

너무도 많이 들어본 이름.. 옵져버 스타크래프트의 럴커나 다템 같은 안보이것 까지 볼 수 있는 유닛이다.
게임 중 후반에 이르러 옵져버가 있으면 상대방이 어디에 무슨 병력을 얼만큼 갖다 놨는지 무슨 건물을 짓고 있는지 훤히 알 수 있기 때문에 매우 중요한 유닛이다.
사설은 이만 하고 본론으로 들어갑니다.
책의 첫 부분에 기상 모니터링 애플리케이션 개요가 나오고 있습니다.


여기서 우리가 구현해야 할 부분은 WeatherData객체가 데이터를 취득하는 부분과 디스플레이 장비에서 기상 상태를 화면에 표시하는 부분입니다.
그렇다면 기본적으로 WeatherData class에는 기상 스테이션으로 부터 습도, 온도, 압력 data를 가져오는 메소드들을 구현해야 할 것입니다. 그리고 매번 상태가 바뀔때마다 현재 객체가 가지고 있는 습도, 온도, 압력 값을 바꿔 주어야 하며 디스플레이 장비에도 새로운 정보를 바탕으로 표시 해주어야겠지요..
따라서 다음과 같은 class diagram을 그릴 수 있습니다.

이 class의 일부를 구현하면 다음과 같이 됩니다.
public class WeatherData {
  public void measurementsChanged() {
     
       float temp = getTemperature();
       float humidity = getHumidity();
       float pressure = getPressure ();
      
       currentConditionDisplay.update( temp, humdity, pressure );
       statisticsDisplay.update( temp, humdity, pressure );
       forecastDisplay.update( temp, humdity, pressure );
  }
}
이 코드를 보면 display하는 class들과 다음과 같은 관계가 있다는 것을 알 수 있습니다.

이 때 문제는 measurementsChanged()에서 특정 구현된 class들에 의존한다는 것입니다.
1장에서 보았던 구현이 아닌 인터페이스를 사용하라던 원칙에 위배됩니다.
그나마 다행인 것은 Display interface를 사용하여 method이름은 update()라는 공통의 이름을 사용한다는 것인데.. 어차피 특정 구현에 의존한다면 별로 장점이 없다고 생각합니다.
그리고 만약에 새로운 Display형태가 추가되면 measurementsChanged의 코드 역시 바껴야 한다는 것입니다.
이러한 문제점을 보안하려면 어떻게 해야할까요 먼저 옵져버 패턴을 공부한 뒤에 해결하도록 합시다.
투비 컨티뉴드

여기서 하나 의문점...

WeatherData 객체가 있고 이를 구독하는 Display들이 있습니다. 그리고 WwatherData의 정보를 바꾸는 무언가가 있습니다. 여기서는 이 무언가가 기상스테이션이죠.
그런데 WeatherData 클래스를 보시면 getter들이 셋이 있는데 이 getter들은 자신의 정보를 다른 클래스에 넘겨주는 accessor 역할을 하는 것이 아니라 기상스테이션에서 정보를 가져오는 역할을 하고 있습니다. 이부분은 뭔가 잘못된 것이 아닌가.. 생각해봅니다.

'Design Pattern' 카테고리의 다른 글

Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제  (0) 2006.10.08
Head First Degisn Patterns 소스코드 다운받기.  (0) 2006.10.08
2장 Observer Pattern(끝)  (0) 2006.10.05
2장 Observer Pattern(계속)  (2) 2006.10.05
2장 Observer Pattern(계속)  (0) 2006.10.05
2장 Observer Pattern  (0) 2006.10.05
1장 Strategy Pattern (끝)  (0) 2006.09.26
1장 Strategy Pattern(계속)  (2) 2006.09.26
1장 Strategy Pattern  (0) 2006.09.26
top


타짜

모하니?/Watching : 2006.10.04 19:32



아니 이 포스터는 포샵을 심하게 한건지.. 어째 김혜수 얼굴이 저렇게 나왔나 모르겠넹;;
anyway.. 위 포스터에 나와있는 모두 연기를 잘했지만 이 포스터에 나오지 않은 아귀 형님으로 나오신 분..
그 분은 천하장사 마돈나에서 마돈나의 아버지로 나오신 분인데.. 아.. 연기 작살이시네요.

영화 중간에 여자 가슴이 두번인가 나오는데 그 중 한번은 김혜수씨지요.. 필요없는 노출이 아니였나 싶지만 고마울 따름이죠. 조승우씨는 비현실적으로 멋지게 나오고.. 아무래도 유해진씨이야 말로 좀 현실적인 타짜가 아니였나 싶네요. 언제나 위는 존재하는 법이니깐요... 백윤식 아저씨도 마돈나에도 나오고 여기도 나오지만 개인적으론 마돈나에서 나온 모습이 진짜 백윤식 아저씨 스턀이 아닌가 싶기도 하고... 물론 이 영화 중에도 특유의 어투가 한 재미 하고 있지요.

투가 나오려나~ 그럼 이만 스포일러에 신경을 쓰는 후기였습니다. 그러저나 이제 또 볼만한 영화가 없으니 이를 어찌하오리까...ㅠㅠ

'모하니? > Watching' 카테고리의 다른 글

올드 미스 다이어리  (0) 2006.12.23
러브 오브 시베리아 : 진짜 재밌는 Love Strory  (0) 2006.12.08
해바라기  (0) 2006.11.25
Love Affair  (0) 2006.11.19
스파이더맨3 예고편  (4) 2006.11.13
봄날은 간다.  (0) 2006.11.09
연애  (0) 2006.11.05
SAW3  (2) 2006.11.03
호로비츠를 위하여  (0) 2006.10.08
타짜  (0) 2006.10.04
라디오스타  (0) 2006.10.04
top

TAG 영화, 타짜

Control Structures

RUBY/Manual : 2006.10.04 18:47


Control Structures

Ruby는 if나 while 같은 유용한 제어문을 가지고 있습니다. Java, c, Perl 프로그래머들은 이 제어문 바디에 괄호를 뺸 것을 눈치 챗을 것입니다. 대신에 자바는 end라는 키워드로 바디를 구분합니다.
if count > 10
 puts "Try again"
elsif tries == 3
 puts "You lose"
else
 puts "Enter a number"
end
while문도 비슷하게 end를 사용합니다.
while weight < 100 and numPallets <= 30
 pallet = nextPallet()
 weight += pallet.weight
 numPallets += 1
end
Ruby의  statement modifier라는 것을 사용하여 while이나 if문을 줄여 쓸 수가 있습니다. 사용 법은 먼저 딱 한 문장 만 기술을 하고 그 뒤 if나 while 키워드를 사용하고 조건을 명시하면 됩니다.

예를 들어 아래에 한 문장의 간단한 if문이 있습니다.
if radiation > 3000
 puts "Danger, Will Robinson"
end
이것을 아래와 같이 간단히 줄일 수 있습니다.
puts "Danger, Will Robinson" if radiation > 3000
한 문장의 while문이 아래에 있습니다.
while square < 1000
  square = square*square
end
이것도 아래 처럼 줄일 수 있습니다.
square = square*square  while square < 1000

'RUBY > Manual' 카테고리의 다른 글

Reading and 'Riting  (0) 2006.11.04
Blocks and Iterators  (0) 2006.11.03
Regular Expressions  (0) 2006.10.05
Control Structures  (0) 2006.10.04
Arrays and Hashes  (0) 2006.10.02
Some Basic Ruby  (0) 2006.09.26
Ruby Is an Object-Oriented Language  (0) 2006.09.17
Roadmap  (0) 2006.09.16
top


2장 리팩토링의 원리

Refactoring/1~4장 : 2006.10.04 17:23


리팩토링의 정의는 명사형과 동사형으로 나뉘어 있다.

리팩토링(명사형)-소프트웨어를 보다 쉽게 이해할 수 있고, 적은 비용으로 수정할 수 있도록 겉으로 보이는 동작의 변화 없이 내부 구조를 변경하는 것.

리팩토링 하다(동사형)-일련의 리팩토링을 적용하여 겉으로 보이는 동작의 변화 없이 소프트웨어의 구조를 바꾸다.

이 부분에서 주목할 것은...
첫 째 리팩토링의 목적은 소프트웨어를 보다 이해하기 쉽고, 수정하기 쉽도록 만드는 것이다.
두 번째로 강조하고 싶은 것은, 팩토링은 겉으로 보이는 소프트웨어의 기능을 변경하지 않는 다는 것이다.

왜 리팩토링을 해야 하는가?

  • 리팩토링은 소프트웨어의 디자인을 개선시킨다.
  • 리팩토링은 소프트웨어를 더 이해하기 쉽게 만든다.
  • 리팩토링은 버그를 찾도록 도와준다.
  • 리팩토링은 프로그램을 빨리 작성하도록 도와준다.
여기서 Kent Beck이 자신에 대해 했던 멋있는 말이 하나 나온다. "나는 훌륭한 프로그래머는 아니다. 그냥 훌륭한 습관을 가지고 있는 좋은 프로그래머이다."

다른 건 그렇다 치고.. 네 번째 프로그램이 빨리 작성하도록 도와 준다는데.. 어떻게 코딩->리팩토링->코딩->리팩토링을 하는데 코딩 쭉~~~~ 보다 빠를 수 있을까 잠시 의아했었지만.. 유지보수 하는데 엄청난 비용이 들어간다는 점을 고려했을 때 소 잃고 외양간 고치는 폭포수 개발 절차에 비해 외양간에 못을 틈틈히 박아줌으로 써 외양간을 새로 짓는 일이 안생기도록 한다는 측면에서 빠르다고 생각한다.(물론 비유는 별로 적절치 않은 듯하다.)

언제 리팩토링을 해야 하는가?
  • 삼진 규칙(세 번째로 비슷한 것을 하게 되면 리팩토링 한다.).
  • 기능을 추가할 때 리팩토링을 하라.
  • 버그를 수정해야 할 때 리팩토링을 하라.
  • 코드 검토(code review)를 할 때 리팩토링을 하라.
여기서 또 Kent Beck의 '리팩토링이 작동하는 이유'라는 글이 나온다. 프로그램은 두 종류의 가치를 가지고 있는데 하나는 오늘 당장을 위한 것, 하나는 내일을 위한 것이라고 한다. 오늘 할일은 확실하지만 내일 할일은 알 수 없다. 하지만 오늘만을 위해서 일한다면 내일은 전혀 일을 할 수 없을 지도 모른다. 리팩토링은 이런 상황에서 빠져 나오는 방법이다.

관리자에게는 뭐라 말해야 하나?

관리자에 따라 다르다. 만약 관리자가 기술적인 지식이 있는 사람이라면 어렵지 않다. 품질을 고려하는 사람이라면 리팩토링이 버그를 줄이고 따라서 개발 속도를 빠르게 한다고 설득하면 된다. 하지만 보통은 시간을 중요시 하는데 이때는 리팩토링에 대해 말하지 말라.

자.. 여기서 또다시 Kent Beck의 '인디렉션과 리팩토링'이라는 글이 나온다. 인디렉션은 양날의 칼과 같다. 하나를 둘로 나누면 그만큼 관리해야 하는 것도 많아지게 된다. 하지만 그만큼 충분한 가치가 있다. 그 예로는 로직의 공유(서브 메소드), 의도와 구현을 분리하여 설명(클래스의 이름과 메소드의 작명은 의도를 설명할 기회 클래스와 메소드의 내부는 구현), 변경의 격리(하나의 객체가 두 곳에서 사용될 때 나는 그것의 서브클래스를 만들고 바꾸려는 것에서 이 객체를 참고하게 한다.), 조건 로직의 부호화(조건문 말고 다형성을 이용)다.

리팩토링을 할 때의 문제
  • 데이터베이스
  • 인터페이스 변경
  • 리팩토링이 어려운 디자인 변경
  • 언제 리팩토링을 하지 말아야 하는가?
데이터베이스에서 리팩토링이 어려운 이유는 대부분의 비즈니스 애플리케이션이 DB 스키마와 밀접하게 결합되어 있기 때문이고 또하나 데이터 마이그레이션의 어려움이다.

완전하지 않은 인터페이스를 공표하지 마라. 매끄러운 리팩토링을 위해 코드 소유권 정책을 수정하라.

다른 사람이 코드를 바꿀 수 있도록 코드 소유권 정책을 수정하라는 것이며 페어 프로그래밍에서 이와 같이 하는 것이 좋다.

코드를 처음부터 다시 작성해야 할 떄는 하지 않는 것이 좋으며 또한 마감일이 얼마 남지 않은 시점에서는 리팩토링을 부채의 개념으로 생각해야 한다.

리팩토링과 디자인

리팩토링은 디자인을 보완한다. 리택토링이 없다면 초기 디자인을 할 때 완벽하게 하려고 많은 시간과 노력을 들이게 된다. 그렇게 디자인을 하고 개발을 해도 어차피 처음에 디자인한 것이 변경되는 경우가 자주 생기는데 그 때 디자인을 변경하는 것은 비용이 너무 크다. 하지만 리팩토링을 하게되면 초기 디자인을 할 때 그러한 부담이 없으며 따라서 단순한 디자인을 가지고 시작하게 된다. 리팩토링은 변경의 위험에 대한 접근을 다르게 한다. 또 리팩토링은 융통성의 희생 없이 단순한 디자인을 유도한다.

이번에는 Ron Jeffries의 '아무것도 한 것 없이 시간만 보냄'이라는 글이 나온다. 이 글에서는 Date에 대한 5분여 간의 리팩토링을 통해 시스템의 속도가 2배나 빨라 졌다고 한다. 팀원이 Kent랑 Martin이였다는데 이 둘은 여기 참여 한적이 없다고 부인하고 있다고 한다.ㅋ;;
이 글의 교훈 : 시스템이 어떻게 돌아가는지 정확하게 알고 있다 하더라도, 추측만 하지 말고 실제로 퍼포먼스를 측정해보라. 무엇인가 배울 것이고, 십중팔구는 추측이 틀렸을 것이다.

리팩토링과 퍼포먼스

퍼포먼스 향상을 위해 가장 효율적으로 보이는 접근 방법은 일단 개발을 하고 그 뒤 최적화 단계에서 프로그램을 모니터 하여 특별하게 시간을 지체하거나 공간을 많이 차지 하는 부분을 발견하여 집중적으로 튜닝하는 것이다.

프로그램을 잘 분해하는 것은 이런 최적화를 수행할 때 두 가지 측면에서 도움이 된다. 첫째, 코드가 잘 분해되어 있으면 퍼포먼스에 집중할 수 있는 시간이 늘어난다. 둘째, 퍼포먼스를 분석할 때 좀 더 세밀한 분석이 가능하다.

리팩토링 기원

1980년대 초 smalltalk 사용자인 Ward Cunningham과 Kent Beck으로 부터 시작하여 Ralph Johnson도 스몰토크 계를 선도 했고.. 이 분의 제자인 Bill Opdyke의 박사학위 논문이 지금까지도 리팩토링 분야의 가장 중요한 연구 결과라고 한다.

2장은.. 코드가 없네... 그래도 재밌게 읽었습니다.


top


라디오스타

모하니?/Watching : 2006.10.04 09:30



재밌는 영화였다. 88년도 가수왕이 2006년에 겪는 우여곡절(?)이랄까..

안성기가 박중훈의 매니저로 나옵니다. 아.. 지금 보니 왕의 남자를 만들었던 감독님이 만드셨구나...

스포일러가 될까봐 뭐라고 말은 못하겠고.. 잔잔하고 재밌습니다. 그저 그런 액션..반전.. 이런 류의 재미에 지친 분들에게 강추할 만한 영화입니다.

비와 당신... 이라는 노래 영화를 보는 내내 빠져들 수 밖에 없습니다. ㅋ


작곡은 음악을 담당하는 방준석 감독
작사는 시나리오를 쓰신 최석환 작가와 제작사인 영화사 아침의 정승혜 대표가 맡았다고 합니다.


'모하니? > Watching' 카테고리의 다른 글

올드 미스 다이어리  (0) 2006.12.23
러브 오브 시베리아 : 진짜 재밌는 Love Strory  (0) 2006.12.08
해바라기  (0) 2006.11.25
Love Affair  (0) 2006.11.19
스파이더맨3 예고편  (4) 2006.11.13
봄날은 간다.  (0) 2006.11.09
연애  (0) 2006.11.05
SAW3  (2) 2006.11.03
호로비츠를 위하여  (0) 2006.10.08
타짜  (0) 2006.10.04
라디오스타  (0) 2006.10.04
top


Lesson 2. Java Basics

Java : 2006.10.03 07:55


Lesson 2. Java Basics

이번장에서 배우게 될 내용은:
  • 학생수를 세기 위한 int 형 변수 사용하기
  • 여러 학생을 저장하기 위한 ArrayList 사용하기
  • 기본 생성자 이해하기
  • ArrayList를 어떻게 사용하는지 이해하기 위해 J2SE API를 어떻게 사용하는지 배우기
  • Student 객체만을 담기 위해 ArrayList를 제약하기
  • 여러 class를 test하기 위한 TestSuite 만들기
  • 패키지를 이해하고 import문을 배우기
  • 상수를 정의하는 방법과 사용
  • 시스템 라이브러리의 date와 calandar 클래스 사용하기
  • Java가 허용하는 다양한 주석문 배우기
  • javadoc을 사용하여 API 문서 생성하기

int

The int type allows variables to be created that store integer values from -2,147,483,648 to 2,147,483,647.

Numbers in Java are not objects like String literals are. You cannot send messages to numbers, although numbers can be passed as parameters along with messages just like Strings can. Basic arithmetic support in Java is provided syntactically; for many other operations, support is provided by system libraries. You will learn about similar non-object types later in Agile Java. As a whole, these non-object types are known as primitive types.

Initialization

you have two ways to initialize fields: You can initialize at the field level or you can initialize in a constructor.

There is no hard-and-fast rule about where to initialize. I prefer initializing at the field level when possiblehaving the initialization and declaration in one place makes it easier to follow the code. Also, as you will learn later in this lesson, you can have more than one constructor; initializing at the field level saves you from duplicate initialization code in each constructor.

Default Constructor

If you do not define any constructors in a class, Java provides a default, no-argument constructor.

The use of default constructors also implies that Java views constructors as essential elements to a class. A constructor is required in order for Java to initialize a class, even if the constructor contains no additional initialization code. If you don't supply a constructor, the Java compiler puts it there for you.

Suites

여러 클래스들을 한꺼번에 테스트하고 싶을 때 다음과 같이 suite을 생성하여 추가합니다.


위 그림은 JUnit 3.8 대의 사용 법.
아래 그림은 JUnit 4.1에서 annotation을 사용 하는 방법.

The SDK and java.util.ArrayList

java.util.ArrayList<Student> allStudents = session.getAllStudents();
A type appearing in this forma class name followed by a parameter type within angle brackets (< and >) is known as a parameterized type. In the example, the parameter Student of java.util.ArrayList indicates that the java.util.ArrayList is bound such that it can only contain Student objects.

The class java.util.ArrayList is one of thousands available as part of the Java SDK class library.

왼쪽 상당은 패키지, 왼쪽 하단은 해당 패키지에 속한 클래스들 오른쪽은 하나의 클래스에 대한 설명을 보여주는 3단 구조로 되어있다.

Objects In Memory


사실 "Cain DiVoe" 같은 문자열도 메모리 어딘가를 참조하는 변수 일 텐데 그것은 그림에 빠져있다.

Packages and the import Statement

Packages provide a way for developers to group related classes. They can serve several needs: First, grouping classes into packages can make it considerably easier on developers, saving them from having to navigate dozens, hundreds, or even thousands of classes at a time. Second, classes can be grouped into packages for distribution purposes, perhaps to allow easier reuse of modules or subsystems of code.

Third, packagesprovide namespaces in Java. 서로 다른 패키지 안에 있다면 클래스의 이름이 같아도 상관없다.

Typing java.util.ArrayList throughout code can begin to get tedious, and it clutters the code as well. Java provides a keyword import that allows identification of fully qualified class names and/or packages at the source file level. Use of import statements allows you to specify simple class names throughout the remainder of the source file.

The java.lang Package

The Java library contains classes so fundamental to Java programming that they are needed in many, if not all, classes. The classes String and Object are two such classes. The ubiquitous nature of these classes is such that the designers of Java wanted to save you from the nuisance of having to specify an import statement for them everywhere.


'Java' 카테고리의 다른 글

What is Object?  (12) 2006.11.01
Agile Java 2장 연습문제 풀기  (2) 2006.10.29
Lazy Initialization 언제 사용 해야 될까요?  (9) 2006.10.28
Agile Java 1장 연습문제 풀기  (2) 2006.10.27
JUnit 3.8 과 JUnit 4의 차이  (0) 2006.10.27
Reference의 위험성  (10) 2006.10.27
다중 구현(?)  (2) 2006.10.23
Interface  (2) 2006.10.16
Lesson 3. Strings and Packages  (0) 2006.10.06
Lesson 2. Java Basics  (0) 2006.10.03
Lesson 1. Getting Started  (0) 2006.09.25
top


1장 리팩토링, 첫 번째 예제

Refactoring/1~4장 : 2006.10.03 01:01


먼저 리팩토링이란? 외부 동작을 바꾸지 않으면서 내부 구조를 개선하는 방법으로, 소프트웨어 시스템을 변경하는 프로세스이다. 이것은 버그가 끼어 들 가능성을 최소화하면서 코드를 정리하는 정형화된 방법이다.

"코드가 작성된 후에 디자인을 개선한다."

물론 그 코드는 디자인을 거쳐 작성이 되었겠지만 코드가 디자인을 잘 따르지 않았거나 디자인이 잘 못 됐을 수도 있기 때문에 어감이 반대로 된 듯해도 맞는 말이다.
새로운 기능을 추가해야 하는데 프로그램의 코드가 새로운 기능을 추가하기 쉽도록 구조화되어 있지 않은 경우에는 먼저 리팩토링을 해서 프로그램에 기능을 추가하기 쉽게 하고, 그 다음에 기능을 추가한다.

유지보수에는 네 종류의 유지보수가 있는데 기억이 가물가물 하지만 억지로라도 떠올려 보면
에러가 발생하여 수정하는 유지보수(corrective maintanance)
환경의 변화에 따라 적응시키는 유지보수(adaptive maintanance)
미래에 발생할 문제를 미리 예방하는 유지보수
완벽을 기하기 위한 기능을 추가하는 유지보수 가 있다고 배웠다.(시스템 분석 및 설계 시간에...)
여기서는 네번째 유지보수 측면을 고려한 듯하다. 하긴 리팩토링 자체를 유지보수로 본다면 위 네가지 모두 고려대상인 듯하다.

리팩토링을 시작하기 전에 견고한 테스트 세트를 가지고 있는지 확인하라. 이 테스트는 자체 검사여야 한다.

테스트의 중요함을 할 수 있다. 요새 Agile Java 책을 스터디 하면서 TDD(Test Driven Development)를 공부하고 있는데 하나의 습관인지라 역시 쉽지 않다. 습관을 바꾸는게 가장 힘든일인듯 하다.(내 글씨는 악필인데 초등학교 때 서예학원도 다녀보고 맞기도 엄청 맞았지만 아직도 악필이다 --)

리팩토링은 작은 단계로 나누어 프로그램을 변경한다. 실수를 하게 되더라도 쉽게 버그를 찾을 수 있다.

조금씩 고쳐 나갈 때마다 계속해서 test를 해줘야 한다. 그래야 쉽게 버그도 찾을 수 있고 오히려 한번에 왕창 해두고 버그가 발생해서 어디가 문제인지 찾는데 시간이 더 오래 걸린다.

컴퓨터가 이해할 수 있는 코드는 어느 바보나 다 짤 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다.

아~ 감명깊은 말이다. 주석의 중요함에 대해 써있는 책을 몇 번 봤었다. 그러나 주석이 잘 달린 프로그램 보다는 주석이 없어도 이해가 되는 프로그램인 듯하다. 물론 주석도 없고 이해도 안되는 코드는...최악이겠지만 말이다. 그러려면 역시 작명에도 신경을 잘 써야 하지만 대부분의 프로그램 언어가 영어인 관계로 작명+작문 이 합쳐지게 된다는 태생적인 문제가 있다.(영어 공부도 열심히?ㅋ)

오늘은 여기까지 보고 자야겠다. 내일 데이트를 해야한다.

Good Night!

1장을 다 보았다.(자랑인가? ㅋ) 보기만 했고 손으로 안따라 해봤기 때문에 아직 제대로 본건 아니다.

추가할 요약사항이 있어서 수정한다.

리팩토링의 리듬!

테스트 -> 조금 수정 -> 테스트 -> 조금 수정

top


Arrays and Hashes

RUBY/Manual : 2006.10.02 18:13


Arrays and Hashes


Ruby의 array와 hash는 인덱스가 있는 collection입니다. 둘 다 객체를 담아 두고 key를 사용하여 접근하는 콜렉션입니다. array에서 key는 정수이지만 hash는 어떤 객체도 key가 될 수 있습니다. 둘 모두 새로운 요소를 추가할 때 커기제 됩니다. array에 접근을 하는게 보다 효율 적이지만 hash는 보다 유연함을 제공합니다. 어떤 array이나 hash들도 여러 타입의 객체를 담아 둘 수 있습니다. 이 말은 하나의 array에 정수, 문자열, 실수를 담을 수 있다는 것입니다.


[ ] 이 괄호 사이에 요소들을 나열 하는 array literal을 사용하여 새로운 배열을 생성하고 초기화 할 수 있습니다. array 객체를 가지고 객체에 있는 각각의 요소들에 [] 안에 index를 사용하여 접근할 수 있습니다. 다음의 예에서 봅시다.

a = [ 1, 'cat', 3.14 ]   # array with three elements
# access the first element
a[0] »1
# set the third element
a[2] = nil
# dump out the array
a »[1, "cat", nil]


array 객체의 생성자를 사용하여 생성하거나 요소들이 없는 비어있는 괄호 [] 를 사용하여 배열을 생성할 수도 있습니다. Array.new .
empty1 = []
empty2 = Array.new


단어들의 배열을 생성할 때 "" 와 , 를 사용하기가 매우 번거로울 수 있는데 이 때 사용하기 편한 것이 있습니다. 바로 %w 입니다. 다음과 같이 사용할 수 있습니다.

a = %w{ ant bee cat dog elk }
a[0] »"ant"
a[3] »"dog"


Ruby의 hash는 배열과 비슷합니다. hash는 [] 말고 {} 이 괄호를 사용합니다. 반드시 하나의 요소에는 두 개의 객체가 제공되어야 합니다. 하나는 key 하나는 value입니다.


예를들어, 악기들을 오케스크라 위치에 따라 매핑하고 싶다면 다음과 같이 할 수 있습니다.

instSection = {  'cello'     => 'string',  
'clarinet'  => 'woodwind',  
'drum'      => 'percussion',  
'oboe'      => 'woodwind',  
'trumpet'   => 'brass',  
'violin'    => 'string'}


Hash는 array와 같이 [] 괄호를 사용하여 index화 됩니다.

instSection['oboe'] »"woodwind"
instSection['cello'] »"string"
instSection['bassoon'] »nil


마지막 예가 보여주듯이 hash에 해당하는 key가 없는 경우에 기본적으로 nil을 반환합니다. 하지만 가끔은 여러분이 원하는 기본값을 반환하도록 하고 싶을 것입니다. 예를 들어 해당하는 key가 몇 번 출현하는지 카운팅하는 hash의 경우 기본값을 0으로 하고 싶을 것입니다. 이것은 hash를 생성할 때 생성자에 기본값을 인자로 넘겨 주는 방식으로 할 수 있습니다.

histogram = Hash.new(0)
histogram['key1'] »0
histogram['key1'] = histogram['key1'] + 1
histogram['key1'] »1


배열과 해쉬 객체는 매우 유용한 메소드들을 많이 가지고 있습니다. 33page와 278page~317page에 걸쳐 이 메소드들에 대해 자세하게 나와있습니다.

'RUBY > Manual' 카테고리의 다른 글

Reading and 'Riting  (0) 2006.11.04
Blocks and Iterators  (0) 2006.11.03
Regular Expressions  (0) 2006.10.05
Control Structures  (0) 2006.10.04
Arrays and Hashes  (0) 2006.10.02
Some Basic Ruby  (0) 2006.09.26
Ruby Is an Object-Oriented Language  (0) 2006.09.17
Roadmap  (0) 2006.09.16
top


Agile Java 발표 후기



초반에 상당히 긴장을 했다.

갑자기 반장님께서 무서운 포쓰를 발산하시는 바람에 덜덜덜 떨수밖에 없었다.

자칫 내가 잘못된 정보를 전달하면 어떻게 될까..

말을 얼버무리면 안되는데 내가 1장을 정말 다 아는 걸까..

물론 영회형이 같은 발표 팀이라 한편으론 든든 했지만 한편으론 내 자신이 너무 작아보여 떨리고 무서웠다.

회사원들..그리고 아버지 나잇대의 어른.. 난 정말 긴장해 있었다.

그리고 ppt...만드는데 30분정도 걸렸다. 어떠한 내용을 넣어야 할지 감이 잡히질 않았다.

이미 실무에서 개발자로 일하고 계신 분들에게 자바의 매우 기초적인 지식들에 대해 발표하는 건 어색하다고 생각했다.

뭐 앞에서 주름잡기라고 하지 않았던가... 막막했다..

다행히 영회형이 정리 해 둔 내용을 중심으로 요약을 하고 내가 요약한 부분 중에 추가할 것을 붙였다.

영회형은 기본을 넘어 좀더 실용적인 지식들을 전달해줄 준비를 마치고 있었다.

반면에 난 매우 기본 적인 지식에도 긴장한 탓인지 내 기본 지식의 두께인지.. 자신감을 잃고 말았다.



영회형이 주신 조언에 따라 다음 부턴 똑바로하자 기선아...

청중에 초점을 맞추기.

스크린샷/사진/데모가 좋다.

텍스트는 간결하게.

목차를 읽어주기 보단 눈으로 읽을 시간을 주며 골자가 무엇인지를 이야기 함.

'똑바로하자! > 발표하자' 카테고리의 다른 글

발표 피드백  (0) 2007.10.02
Agile Java 발표 후기  (2) 2006.10.02
top


Some Basic Ruby

RUBY/Manual : 2006.09.26 07:23


Some Basic Ruby

많은 사람들이 새로운 언어를 배울 때 지겨운 문법을 읽는 것을 좋아하지 않습니다. 그래서 방법을 생각해냈습니다. Ruby 프로그램을 작성할 때 꼭 알아야 하는 것들만 적어 놨습니다. 199페이지 부터 시작하는 18챕터에서 더 자세히 살펴보겠습니다.

간단한 Ruby 프로그램을 보며 시작합시다. 문자열을 반환하는 메소드를 작성했습니다. 이름을 문자열에 추가하여 반환하는 군요. 이 메소드를 몇번 호출해 봤습니다.

def sayGoodnight(name)  
result = "Goodnight, " + name  
return result
end
# Time for bed...
puts sayGoodnight("John-Boy")
puts sayGoodnight("Mary-Ellen")

Ruby는 statement마다 세미콜론(;)을 필요로 하지 않습니다. 그리고 주석은  # 문자로 시작합니다.

메소드는 def 키워드를 사용하여 정의하며 def뒤에 메소드의 이름을 적어주고 메소드의 파라미터들을 괄호() 안에 적어줍니다. 또 루비는 여러 문장을 묶거나 메소드의 정의를 구분하기 위해 중괄호를 사용하지 않습니다. 대신 end로 끝남을 알려줍니다. 메소드의 첫줄은 "Goodnight, "에 파라미터 name을 붙이고 그 다음 줄에서 result를 반환하고 있습니다. result 변수를 선언할 필요가 없습니다. 그냥 대입 할 때 생기게 됩니다.

메소드를 정의한 뒤 우번 호출을 했습니다. 그리고 두 경우다 결과를 puts 메소드에 넘겨줍니다. puts는 아규먼트로 넘어온 값을 단순히 newline과 함께 출력합니다.

Goodnight, John-BoyGoodnight, Mary-Ellen
``puts sayGoodnight("John-Boy")'' 이 문장은 두개의 메소드 호출을 하고 있습니다. 하나는 sayGoodnight이고 다은으로 puts입니다. 왜 sayGoodnight는 괄호를 사용해서 인자를 넘겨주는데 puts는 안그러냐구요? 그냥 취향입니다. 사실 아래 있는 것들 모두 같은 뜻입니다.

puts sayGoodnight "John-Boy"
puts sayGoodnight("John-Boy")
puts(sayGoodnight "John-Boy")
puts(sayGoodnight("John-Boy"))
하지만 삶은 그렇게 간단하지 않습니다. 괄호를 사용하면 어떤 인자가 어떤 메소드에 사용되는 것인지 헷갈리게 됩니다. 따라서 괄호는 단순한 경우에는 사용하지 않는것을 추천합니다.

이 예제는 Ruby의 문자열(string) 객체도 보여주고 있습니다. string 객체를 생성하는 방법은 다양하지만 가장 흔한 방법으로는 문자열 상수를 사용하는 방법입니다. 문자열 상수는 " " 나 ' ' 로 둘러쌓인 문자열을 말합니다. 이 두 형태의 차이점은 상수를 생성할 때 Ruby가 문자열에 처리를 하는 양이 다르다는 것입니다. ' ' 로 둘러쌓인 경우에 Ruby는 몇몇 예외처리 들과 매우 소수의 작업을 하며 ' ' 안에 있는 문자열 상수들이 문자열 값이 됩니다.

" "로 둘러쌓인 경우에 Ruby는 좀더 많은 일을 하는데, 우선. / 로 시작하는 문자를 binary 값을 바꿔줍니다. "\n"과 같은 경우 이 문자열을 newline 문자로 바꿔줍니다.

puts "And Goodnight,\nGrandma"

이 문장의 결과는 아래와 같습니다.

And Goodnight,Grandma

" "를 사용한 문자열은 #{ expression } 을 expression의 값으로 대체 할 수 있습니다. 이것을 사용하여 메소드를
재정의 할 수 있습니다.

def sayGoodnight(name)  result = "Goodnight, #{name}"  return resultend

#{...} 안에 있는 expression이 단순히 global, instance 또는 class 변수 일 경우에는 괄호를 사용하지 않아도 됩니다. string이나 Ruby의 기본 타입들은 47쪽부터 시작하는 챕터5를 보면 됩니다.

마지막으로 이 메소드를 좀더 단순하게 고칠수가 있는데 Ruby의 메소드는 맨 마지막 문장의 값을 return합니다. 따라서 return result문장을 지워도 됩니다.

def sayGoodnight(name)  "Goodnight, #{name}"end

하나만 더 알고 지나갑시다. Ruby의 naming 규칙입니다. 여기서 아직 배우지 않은 class 변수와 같은 말이 나오겠지만 그냥 들어두기 바랍니다.

Ruby는 여러가지 이름을 정할 때 약속이 있습니다. 지역 변수, 메소드 이름, 메소드의 파라미터들은 이름의 첫글자가 소문자로 시작합니다. 전역 변수는 $로 시작하고 인스턴스 변수는 @로 시작합니다. 클래스 변수는 @@이걸로 시작을 합니다. 마지막으로 클래스 이름, 모듈 이름, 상수는 대문자로 시작합니다.

'RUBY > Manual' 카테고리의 다른 글

Reading and 'Riting  (0) 2006.11.04
Blocks and Iterators  (0) 2006.11.03
Regular Expressions  (0) 2006.10.05
Control Structures  (0) 2006.10.04
Arrays and Hashes  (0) 2006.10.02
Some Basic Ruby  (0) 2006.09.26
Ruby Is an Object-Oriented Language  (0) 2006.09.17
Roadmap  (0) 2006.09.16
top

TAG ruby, string

1장 Strategy Pattern (끝)

Design Pattern : 2006.09.26 00:23


최종적으로 위와 같은 다이어그램이 완성됩니다.
상속으로 시작했던 디자인이 composition(구성)을 사용함으로써 결말이 났군요.
이로써 다음과 같은 디자인 원칙을 배울 수 있습니다.
디자인 원칙3
상속보다는 구성을 활용한다.
위에서 했던 행동들이 하나의 디자인 패턴으로 정립되어 있었습니다.
바로 Strategy pattern 이라는 것으로 써 정의는 다음과 같습니다.
Strategy Pattern에서는 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있돌고 만든다. 이것을 사용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.
위키피디아 에서 정의한 내용은 다음과 같습니다.

Strategy pattern

From Wikipedia, the free encyclopedia

Jump to: navigation, search
In computer programming, the strategy pattern is a particular software design pattern, whereby algorithms can be selected on-the-fly at runtime.
In some programming languages, such as those without polymorphism, the issues addressed by this pattern are handled through forms of reflection, such as the native function pointer or function delegate syntax.
The strategy pattern is useful for situations where it is necessary to dynamically swap the algorithms used in an application. The strategy pattern is intended to provide a means to define a family of algorithms, encapsulate each one as an object, and make them interchangeable. The strategy pattern lets the algorithms vary independently from clients that use them.
runtime시에 알고리즘을 선택할 수 있는 특징이 있고 다형성이 지원되지 않는 언어의 경우 포인터와 delegate syntax와 같은 reflection의 형태로 다뤄집며 유용한 상황으로는 동적으로 알고리즘을 바꾸고 싶을 경우라고 간략히 요약할 수 있습니다.
원문은 위의 링크와 같으며 예제로 여러가지 sorting 알고리즘을 동적으로 바꿔가며 사용해보는 예제가 C++언어로 나와있습니다.
더 구체적인 내용은 이곳에서 볼 수 있습니다.
decoupling에 관한 내용과 여러 장점에 대해 설명이 되어 있습니다.
다음은 기본 Strategy Pattern의 기본 UML입니다.
마지막으로 실생활에 Strategy Pattren을 적용한 예를 살펴보겠습니다.

'Design Pattern' 카테고리의 다른 글

Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제  (0) 2006.10.08
Head First Degisn Patterns 소스코드 다운받기.  (0) 2006.10.08
2장 Observer Pattern(끝)  (0) 2006.10.05
2장 Observer Pattern(계속)  (2) 2006.10.05
2장 Observer Pattern(계속)  (0) 2006.10.05
2장 Observer Pattern  (0) 2006.10.05
1장 Strategy Pattern (끝)  (0) 2006.09.26
1장 Strategy Pattern(계속)  (2) 2006.09.26
1장 Strategy Pattern  (0) 2006.09.26
top


1장 Strategy Pattern(계속)

Design Pattern : 2006.09.26 00:20


이전 글에서 발생했던 문제를 해결하기 위해서 interface를 사용하여 날아다닐 수 있는 오리와 소리낼 수 있는 오리로 구분하였습니다.
날아 다니거나 소리 낼 수 있는 오리들은 해당 interface를 구현해야 하며 따라서 fly나 quack과 같은 method들을 구현해 주어야 합니다.
만약에 이런 상황에서 오리의 소리가 공통적으로 바뀐다면 어떻게 해야할까요? 아마 Quackable을 구현한 모든 class들을 수정해야 할 것입니다.
(현재는 class들의 수가 몇개 안되지만 50개 라고 하면 50번을 수정해야 합니다.)
좀더 좋은 방법이 필요할 듯합니다.
지금까지 계속 변화를 가정하여 class들이 보다 유연하게 구성되도록 진행되가고 있습니다.(그만큼 변화가 빈번히 일어난다는 것이겠죠.)
이러한 변화 속에서 살아남으려면 다음과 같은 디자인 원칙에 유의해야합니다.
디자인원칙1
애플리케이션에서 달라지는 부분을 찾아 내고, 달라지지 않는 부분으로부터 분리시킨다.
즉 fly()와 quack()은 Duck class에서 오리마다 달라지는 부분입니다.
이 두 메소드를 Duck에서 뽑아 내어 새로운 class집합으로 만들 것입니다.
이 class집합들은 다음의 디자인 원칙에 따라 구현합니다.
디자인원칙2
구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
이 말은 선뜻 이해가 되지 않습니다.
여기서 구현이라고 하는 것은 특정 class에 있는 method를 말하는 것이고 인터페이스는 상위 classl에 있는 method들을 말한다고 생각합니다.
즉.. Animal a = new Dog(); or new Cat();
a.eat();
을 실행했을 때 개도 먹일 수 있고 고양이도 먹일 수 있도록 프로그래밍 하라는 뜻으로 이해가 됩니다.
(저 방법 보다 Animal a = getAnimal(); 이런 방법으로 new 키워드를 없애는 것이 보다 더 디자인원칙2를 잘 지키는 것이라고 나와있습니다.)
따라서 다음과 같은 다이어 그램으로 class집합을 구현할 수 있습니다.

이제 Duck class에서는 위 두 집합의 상위Type의 변수를 가진다면 a.eat()과 같은 장점(다형성)을 누릴 수 있습니다.
위와 같이 FlyBehavior와 QuackBehavior type의 변수를 가지고 있고
performFly()와 performQuack()에서는
flyBehavior.fly()와 quackBehavior.quack()를 실행하기만 하면 됩니다.
이렇게 해두면 각각의 오리( sub class )들은 dispaly()만 구현하면 되고 자기 자신의 quack이나 fly의 Behavior가 어떤 것인지 설정해 줌에 따라 결과가 달라지게 됩니다.
자신의 Behavior를 설정하는 방법은 객체 생성시에 생성자에서 하는 방법과
나중에 setter메소드를 사용하는 방법이 있습니다.
setter메소드를 이용하여 Behavior를 지정해 줄 경우 날수 없던 오리(FlyNoWay Behavior로 setting했던 오리)가 갑자기 날개를 가지고 날아갈 수있게(FlyWithWings Behavior로 오리의 Behavior를 프로그램 실행도중 setter method를 사용하여 setting하면 됩니다.) 마술을 부릴 수도 있습니다.

'Design Pattern' 카테고리의 다른 글

Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제  (0) 2006.10.08
Head First Degisn Patterns 소스코드 다운받기.  (0) 2006.10.08
2장 Observer Pattern(끝)  (0) 2006.10.05
2장 Observer Pattern(계속)  (2) 2006.10.05
2장 Observer Pattern(계속)  (0) 2006.10.05
2장 Observer Pattern  (0) 2006.10.05
1장 Strategy Pattern (끝)  (0) 2006.09.26
1장 Strategy Pattern(계속)  (2) 2006.09.26
1장 Strategy Pattern  (0) 2006.09.26
top


1장 Strategy Pattern

Design Pattern : 2006.09.26 00:17




위 다이어그램을 보면 Duck class를 상속을 이용하여 재사용 하고 있습니다.
필요한 부분( 여기서는 display() )만 overriding 해주면 되기 때문에 상당히 편리해 보입니다.
기본 기능으로 오리가 날수 있도록 하고 싶을 때...



위와 같이 상위 class에 추가하기만 하면 모든 하위 class들에 일일히 추가할 필요가 없기때문에 편리해 보입니다.
하지만...
날지 못하는 오리(고무 인형 오리)의 경우라면 상속 받지 말아야 할텐데.
특정 method를 제외하고 상속하는 방법 같은 것은 배운적이 없네요 :)
상속을 못하게 하는 방법은 있지만 그렇게 하면 다른 자식 class들은 어떻게 하나요? 하핫;
method하나가지고 뭘 그러나.. 그냥 method를 overring해서 안에서 아무것도 안하면 되지 않을까...라는 생각을 처음엔 했었습니다.
그러나...
그러한 method가 무진장 많다고 했을 때를 생각해 보면 코드 낭비에 시간 낭비라는 생각이 안들 수가 없습니다. 무언가 뾰족한 수가 필요합니다.

'Design Pattern' 카테고리의 다른 글

Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제(계속)  (0) 2006.10.08
Strategy Pattern 예제  (0) 2006.10.08
Head First Degisn Patterns 소스코드 다운받기.  (0) 2006.10.08
2장 Observer Pattern(끝)  (0) 2006.10.05
2장 Observer Pattern(계속)  (2) 2006.10.05
2장 Observer Pattern(계속)  (0) 2006.10.05
2장 Observer Pattern  (0) 2006.10.05
1장 Strategy Pattern (끝)  (0) 2006.09.26
1장 Strategy Pattern(계속)  (2) 2006.09.26
1장 Strategy Pattern  (0) 2006.09.26
top


Traditions of language oriented programming



  • You, We.
굳이 당신, 여러분, 우리, 나... 이런 말을 넣지 않아도 된다. 어색하다.

  • class와 같이 다양한 의미로 사용가능한 단어.
명확한 의미로 번역하자.

  • These files are essentially DSLs.
이 파일들 역시 본질적으로 DSL이다.

  • they allow people familiar with the adaptive model to be extremely productive once the model is developed and shaken down.
이러한 모델은 한번 개발되어서 자리잡게 되면 개발자들이 모델에 익숙해져서 고도로 생산성 향상을 가져온다.



http://martinfowler.com/articles/languageWorkbench.html#AdaptiveObjectModels
위 글 번역 중 얻은 조언.

제대로된 번역은 언어지향 프로그래밍의 전통 :)
top


Lesson 1. Getting Started

Java : 2006.09.25 18:13


Lesson 1. Getting Started

1장에서 배울 것은 :
  • 간단한 Java class 만들기
  • Java class를 가지고 노는 test class 만들기
  • JUnit famework 사용하기
  • 생성자에 대해 배우기
  • 위에서 작성한 code 리팩토링하기.

Testing

Test-driven development means that you will write tests for virtually every bit of code. It also means that you will write the tests first. The tests are a means of specifying what the code needs to do. After writing the corresponding code, the tests are run to ensure that the code does what the tests specify.

The production classes you build should know nothing about the tests written for them.

Design

You start by building only high-level designs, not highly detailed specifications. You will continually refine the design as you understand more about the customer needs. You will also update the design as you discover what works well and what doesn't work well in the Java code that you build. The power of object-oriented development can allow you this flexibility, the ability to quickly adapt your design to changing conditions.

A Simple Test

You must designate the class as public in order for the testing framework JUnit to recognize it.

The classpath is a list of locations separated by semicolons under Windows or colons under Unix. You supply the classpath to both the compiler and the Java VM. A location can be either a JAR file (which contains compiled class files by definition) or a directory that contains compiled class files.

ex) javac -classpath c:\junit3.8.1\junit.jar StudentTest.java(the abbreviated keyword -cp.)

JUnit

Not only does the Java compiler need to know where the JUnit classes are, but the Java VM also needs to be able to find these classes at runtime so it can load them up as needed.
java -cp .;c:\junit3.8.1\junit.jar junit.awtui.TestRunner StudentTest

Adding a Test

public class StudentTest extends junit.framework.TestCase {
public void testCreate() {
}
}
  • the method must be declared public,

  • the method must return void (nothing),

  • the name of the method must start with the word test, in lowercase letters, and

  • the method cannot take any arguments ().


Creating a Student

new Student("Jane Doe");
You terminate each statement with a semicolon (;).

You place the new keyword before the name of the class to instantiate.

String literals represent object instances of the predefined Java class java.lang.String.

When the Java VM executes the new operator in this statement, it allocates an area in memory to store a representation of the Student object. The VM uses information in the Student class definition to determine just how much memory to allocate.


Creating the Student Class


class Student {}

Constructors

A constructor looks a lot like a method. It can contain any number of statements and can take any number of arguments like a method. However, you must always name a constructor the same as the class in which it is defined. Also, you never provide a return value for a constructor, not even void.

Local Variables

Student student = new Student("Jane Doe");

When the Java VM executes this statement, it executes the code to the right-hand side of the assignment operator (=) first, creating a Student object in memory. The VM takes note of the actual memory address where it places the new Student object. Subsequently, the VM assigns this address to a reference on the left-hand side, or first half, of the statement.



Returning a Value from a Method

String studentName = student.getName();

you are sending a message to the Student object, using the student reference assigned to in the previous statement.

String getName() { }

This getName method specifies instead a return type of String.

return "";

The return statement here returns an empty String objecta String with nothing in it.

Refactoring

The first step is to eliminate the unnecessary local variables.
The second step: It is considered poor programming practice to embed String literals throughout your code. One reason is that the code can be difficult to follow if it is not clear what each String literal represents.

this

There are two ways to ensure that the value of the formal parameter is assigned to the field:
The first approach means you must rename either the parameter or the field.
The second approach for disambiguating the two is to use the same name for both, but where necessary refer to the field by prefixing it with the Java keyword this.




'Java' 카테고리의 다른 글

What is Object?  (12) 2006.11.01
Agile Java 2장 연습문제 풀기  (2) 2006.10.29
Lazy Initialization 언제 사용 해야 될까요?  (9) 2006.10.28
Agile Java 1장 연습문제 풀기  (2) 2006.10.27
JUnit 3.8 과 JUnit 4의 차이  (0) 2006.10.27
Reference의 위험성  (10) 2006.10.27
다중 구현(?)  (2) 2006.10.23
Interface  (2) 2006.10.16
Lesson 3. Strings and Packages  (0) 2006.10.06
Lesson 2. Java Basics  (0) 2006.10.03
Lesson 1. Getting Started  (0) 2006.09.25
top


Eclipse에서 Ruby사용하기.

RUBY/Getting Started : 2006.09.22 12:12


http://www-128.ibm.com/developerworks/opensource/library/os-rubyeclipse/
Ruby프로젝트 생성, test, debug.

http://rubyeclipse.sourceforge.net/download.rdt.html
Ruby 플러그인 설치 방법.


'RUBY > Getting Started' 카테고리의 다른 글

RoR vs Java  (2) 2007.06.09
Eclipse에서 Ruby사용하기.  (0) 2006.09.22
Ruby in Twenty Minutes 4  (0) 2006.09.21
Ruby in Twenty Minutes 3  (0) 2006.09.20
Ruby in Twenty Minutes 2  (2) 2006.09.19
Ruby in Twenty Minutes 1  (0) 2006.09.18
Ruby 설치하기  (0) 2006.09.16
top


Ruby in Twenty Minutes 4

RUBY/Getting Started : 2006.09.21 11:20


이 전에 만들었던 새로운 프로그램을 좀더 자세히 살펴봅시다. # 마크로 시작하는 줄은 Ruby에서 주석을 나타낼때 사용합니다. 이 마크가 사용된 줄은 interpreter가 무시하게 됩니다. The first line of the fileis a special case, and under a Unix-like operating system tells theshell how to run the file.(이부분은 무슨 뜻인지 모르겠네요;;) 나머지 주석들은 프로그램의 명확성을 위해 사용되었습니다.

say_hi 메소드가 좀더 기술적으로 변했습니다.
# Say hi to everybody
def say_hi
if @names.nil?
puts "..."
elsif @names.respond_to?("each")
# @names is a list of some kind, iterate!
@names.each do
|name|
puts "Hello #{name}!"
end
else
puts "Hello #{@names}!"
end
end

@names를 보고 분기를 합니다. 만약에 nil이면 점 세개를 출력합니다.

Cycling and Looping—a.k.a. Iteration

만약에 @names 객체가 each에 반응을 하면 iterator를 사용할 수 있다는 것이고 그것을 사용하여 각각의 사람들에게 인사를 하면 되겠네요.

반복에 대해 좀더 자세히 살펴봅시다.

@names.each do
|name|
puts "Hello #{name}!"
end

each는 코드 블럭을 받아들이는 메소드로써 리스트에 있는 모든 원소들을 상대로 코드 블럭을 실행합니다. do와 end 사이가 블럭에 해당합니다. A block is like an anonymous functionor lambda. 블럭은 파이프들(| |) 사이에 있는 변수가 이 블럭에서 사용될 파라미터입니다.

여기서는 리스트 안에 있는 모든 요소들을 name으로 가리키고 이것을 사용하여  puts "Hello #{name}!" 를 실행했군요.
다른 프로그래밍 언어의 경우 리스트의 요소들을 반복할 때 for loop를 사용합니다.
(C언어 스타일 같은 경우 다음과 같이 표현 합니다.)

for (i=0; i<number_of_elements; i++)
{
do_something_with(element[i]);
}

이것도 작동은 하지만 우아하진 않습니다. 여기서는 i와 같은 변수를 필요로 합니다.
i는 리스트의 길이를 나타내고 리스트에서 어떤 순으로 작업을 할지 알려줍니다.
하지만 Ruby는 좀더 우아한 방법을 사용합니다.
모든 구체적인 것들은 each 메소드 안에 숨겨 놨습니다. 우리가 할일은 오직 리스트안에 있는
각각의 요소들이 each문 안에서 어떠한 작업을 할 것인지만 기술하면 됩니다.

Blocks, the Highly Sparkling Glint on the Edge of Ruby

블럭은 리스트보다 더 복잡한 것들을 다룰 때 사용합니다. 메소드를 가지고 구체적인 것들을 다룰수 있는 것을 물론이고 셋업, 분해, 에러들 또한 다룰 수 있습니다

# Say bye to everybody
def say_bye
if @names.nil?
puts "..."
elsif @names.respond_to?("join")
# Join the list elements with commas
puts "Goodbye #{@names.join(", ")}. Come back soon!"
else
puts "Goodbye #{@names}. Come back soon!"
end
end

say_bye 메소드는 each를 사용하지 않고 대신에 @names가 join 메소드에 반응 하는지를 체크 합니다. 그리고 만약에 반응한다면 join을 사용합니다. 반응하지 않으면 그냥 변수를 문자열로 출력합니다. 이 메소드는 변수의 실제 타입을 신경쓰지 않습니다. 이 메소드가 지향하는 것은 "Duck Typing"입니다. "만약에 오리같은 것이 들어오면 오리처럼 꽥꽥거려라..". 라는 것이죠. 이런것의 장점은 변수들의 불필요한 타입 제약을 가하지 않는다는 것입니다. 만약에 새로운 타입의 리스트를 가지고 온다면 (join 메소드를 구현한 것이여야 겠죠.) 모든 일들이 계획된 대로 진행될 것입니다.

Kicking Off the Script

여기까지가 MegaGreeter 클래스 였고 남은 부부는 이 클래스의 메소드를 호출하여 사용하는 부분입니다. 이게 Ruby in Twenty Minutes 여기서 배울 마지막 트릭이군요.

if
__FILE__ == $0

_FILE_ 이것은 현재 파일이름을 가지고 있는 마술 같은 변수 입니다. $0 은 프로그램을 시작하기 위해 사용되는 파일의 이름입니다. 이 문장은 "만약에 이 파일이 실행되는 파일이면..." 이라는 뜻입니다. 어떤 파일이 그냥 library 로 사용될 것이라면 저 문장에 걸렸을 때 실행되지 안을 것이고 만약에 파일이 실행될 수 있는 파일이면 다음 코드가 실행될 것입니다.

Consider Yourself Introduced

여기까지가 Ruby의 quick tour 였습니다. 하지만 아직 살펴 볼 것들이 많습니다.(제어문, 블럭, 모듈들,,)
Documentation 이곳에 가시면 여러 문서들이 무료로 제공됩니다.
만약에 책을 보고 싶으신 분들은 book list이곳을 클릭하여 살펴보시면 됩니다.



'RUBY > Getting Started' 카테고리의 다른 글

RoR vs Java  (2) 2007.06.09
Eclipse에서 Ruby사용하기.  (0) 2006.09.22
Ruby in Twenty Minutes 4  (0) 2006.09.21
Ruby in Twenty Minutes 3  (0) 2006.09.20
Ruby in Twenty Minutes 2  (2) 2006.09.19
Ruby in Twenty Minutes 1  (0) 2006.09.18
Ruby 설치하기  (0) 2006.09.16
top


Ruby in Twenty Minutes 3

RUBY/Getting Started : 2006.09.20 22:40


저번 글에서 만들어 두었던 class의 객체를 생성합시다.


g 객체를 한번 생성하면 그 이름이 Pat이라는 것을 기억하는군요. 흠.. 만약에 name 변수에 직접 접근하면 어떻게 될까요?


오호.. 안되는 군요..

Under the Object’s Skin

인스턴스 변수들은 항상 객체 속안에 숨겨져 있습니다. (인스턴스 변수는 @name 과 같이 @를 붙여서 만드나 봅니다.) 심하게 감춰져 있지는 않고 객체를 조사해보면 그들에게 접근 할 수 있는 다른 방법들이 존재합니다만...Ruby는 data를 숨기기 좋은 객체 지향 접근법을 사용합니다.

그럼 Greeter 객체 안에는 어떤 메소드들이 있을까요?


와오.. 엄청나게 많네요. 여기 보이는 메소드들은 Greeter 객체가 가지고 있는 모든 메소드입니다. 조상(부모도 포함됐겠죠? :)으로 부터 받은 많은 메소드들도 포함되어 있습니다. 만약에 우리가 만든 method들만 보고 싶다면 조상들에게 정의되어 있는 메소드를 보길 원치 않는 다는 의미로 false를 파라미터로 넘겨주면 됩니다.


자 그럼 이제 어떤 method들이 우리가 가진 객체가 반응을 하는지 봅시다:


say_hi와 to_s(어떤 것을 string으로 바꿔주는 method군요. 기본적으로 모든 객체들이 가지고 있습니다.) 그러나 name이란 메소드는 모르네요.

Altering Classes—It’s Never Too Late

만약에 name을 바꾸거나 보고 싶다면 어떻게 해야할까요? Ruby는 객체의 변수에 접근할 수 있는 쉬운 방법을 제공합니다.


Ruby에서는 class를 다시 열어서 수정을 할 수 있습니다. 기존에 이미 만들어져 있는 객체들은 바뀌지 않지만 이 후에 새로 만들어지는 객체들은 영향을 받습니다. 그래서 이제 새로운 객체를 만들고 @name 속성을 가지고 놀아봅시다.


attr_accessor 을 사용해서 getter에 해당하는 name과 setter에 해당하는 name= 두개의 메소드를 정의했습니다.

Greeting Anything and Everything, MegaGreeter Neglects None!

이 greeter 는 그다지 흥미롭지 않군요. 이 class는 오직 한번에 한사람만 다루는데요 여러 사람들에게 인사를 하는 class를 만들 순 없을까요?

그렇게 할 수 것을 Ruby interpreter인 IRB에 직접 쓰는 대신에 파일로 만들어 봅시다.

IRB를 끝내기 위해서 "quir"이나 "exit" 또는 그냥 컨트롤+D 를 입력합니다.

C:\Documents and Settings\keesun>ruby
class MegaGreeter
attr_accessor :names

#Create the object
def initialize(names = "world")
@names = names
end

#Say hi to everybody
def say_hi
if @names.nil?
puts "..."
elsif @name.respond_to?("each")

@name.each do
|name|
       puts "Hello #{name}!"
     end
   else
   puts "Hello #{@names}!"
   end
  end

  # Say bye to everybody
  def say_bye
   if @names.nil?
     puts "..."
   elsif @names.respond_to?("join")
     # Join the list elements with commas
     puts "Goodbye #{@names.join(", ")}.  Come back soon
   else
     puts "Goodbye #{@names}.  Come back soon!"
   end
  end

end

if __FILE__ == $0
  mg = MegaGreeter.new
  mg.say_hi
  mg.say_bye

  # Change name to be "Zeke"
  mg.names = "Zeke"
  mg.say_hi
  mg.say_bye

  # Change the name to an array of names
  mg.names = ["Albert", "Brenda", "Charles",
   "Dave", "Englebert"]
  mg.say_hi
  mg.say_bye

  # Change to nil
  mg.names = nil
  mg.say_hi
  mg.say_bye
end


cmd창을 열고 위처럼 입력한 뒤

컨트롤 + c를 입력하면 위에 입력한 것을 바로 처리합니다.

Hello world!
Goodbye world.  Come back soon!
Hello Zeke!
Goodbye Zeke.  Come back soon!
Hello AlbertBrendaCharlesDaveEnglebert!
Goodbye Albert, Brenda, Charles, Dave, Englebert.  Come back soon!
...
...

위와 같은 결과를 보셨다면 제대로 된 것입니다.

윈도우의 도스창에서 바로 실행시키지 않고.

위의 코드를 ri20min.rb 라고 저장한 뒤 ruby ri20min.rb 를 이용하여 실행하여도 같은 결과를 볼 수 있습니다.

'RUBY > Getting Started' 카테고리의 다른 글

RoR vs Java  (2) 2007.06.09
Eclipse에서 Ruby사용하기.  (0) 2006.09.22
Ruby in Twenty Minutes 4  (0) 2006.09.21
Ruby in Twenty Minutes 3  (0) 2006.09.20
Ruby in Twenty Minutes 2  (2) 2006.09.19
Ruby in Twenty Minutes 1  (0) 2006.09.18
Ruby 설치하기  (0) 2006.09.16
top

TAG ruby

Ruby in Twenty Minutes 2

RUBY/Getting Started : 2006.09.19 21:59


저번에 이어 이번에는 "Hello World!"를 매번 전부 타자를 치지 않고 출력하는 방법은 없을 까요?

메소드를 만들어 봅시다.


위와 같이 코딩을 합니다.

def h 는 method 정의 부분을 시작하는 코드입니다. 이것은 Ruby에게 우리가 h라는 이름의 method를 정의하고 있다는 것을 알려줍니다.
다음 줄은 method의 body에 해당합니다. 우리가 전에 봤던 명령줄이랑 같습니다.
마지막으로 end는 Ruby에게 method 정의가 끝났다는 것을 알려줍니다.
Ruby의 nil 응답은 우리에게 method가 정의 됐다는 것을 알려줍니다.

The Brief, Repetitive Lives of a Method

이제는 위에서 만든 method를 몇번 호출해 봅시다.

매우 쉽네요. Ruby에서 method를 호출하는 방법은 method 이름을 부르면 되네요. 만약에 parameter들을 필요로 하지 않는 method라면 이렇게 해도 되는게 맞습니다. 비어있는 괄호를 추가시켜서 부를 수도 있지만 꼭 그럴 필요는 없지요.

만약에 kee sun이 아닌 특정 사람에게 인사를 전하고 싶다면 어떻게 해야할까요? h method가 이름을 parameter로 가지도록 재정의 하면 되겠네요.


몇가지 트릭이 사용되었는데요. 먼저 parameter로 이름을 주면서 method를 호출 해보고 다음에는 paramter가 없는 method를 다시 호출해 보았습니다. default parameter로 kee sun을 주었습니다. 이것은 name으로 오는 parameter가 없으면 "kee sun"을 출력하라는 것이네요.
그리고 원문에는 설명이 나와있지 않지만 아무래도 문자열.capitalize 메소드를 호출하면 문자열의 첫 문자를 대문자로 바꿔주는 듯 하네요.

Evolving Into a Greeter

만약에 진짜 greeter를 원한다면 어떨까요. 당신의 이름을 기억해두었다가 항상 당신에게 존경을 표하는 그런 것 말입니다. 당신은 아마도 그것을 위해 객체를 사용하길 원할 것입니다. "Greeter" class를 만들어 봅시다.


여기 새로 추가된 keyword는 class입니다. 이것은 Greeter라고 이름으로 새로운 class 정의 하고 class안에 method들을 정의합니다. @name 은 class내의 다른 method들에서 접근이 가능한 instance 변수 입니다. say_hi 와 say_bye 에서 사용한 것을 확인할 수 있습니다.



오늘은 여기까지 입니다. 다음 번에는 객체를 생성하여 사용하는 것을 살펴보겠습니다.


원문 : http://www.ruby-lang.org/en/documentation/quickstart/2/

번역 + 편역 : 기선

'RUBY > Getting Started' 카테고리의 다른 글

RoR vs Java  (2) 2007.06.09
Eclipse에서 Ruby사용하기.  (0) 2006.09.22
Ruby in Twenty Minutes 4  (0) 2006.09.21
Ruby in Twenty Minutes 3  (0) 2006.09.20
Ruby in Twenty Minutes 2  (2) 2006.09.19
Ruby in Twenty Minutes 1  (0) 2006.09.18
Ruby 설치하기  (0) 2006.09.16
top

TAG class, method, ruby

Ruby in Twenty Minutes 1

RUBY/Getting Started : 2006.09.18 12:01


http://www.ruby-lang.org/en/documentation/quickstart/
위 링크를 따라하며 글을 씁니다.

Introduction

이것은 20분정도 걸리는 짧은 tutorial입니다. 이미 Ruby를 설치했다는 가정하에 시작하겠습니다.

Interactive Ruby

IRB를 실행합니다.
  • Mac OS X 사용자는 터미널을 열고 irb를 type한뒤 enter를 칩니다.
  • Linux 사용자는 쉘을 열고 ibr를 type하고 enter칩니다.
  • Windows 사용자는 Start menu의 Ruby section에서 fxri를 엽니다.


위와 같은 화면이 뜹니다.

콘솔에서 "Hello World"를 입력합니다.


위와 같이 출력됩니다.

Ruby Obeyed You!

두번째 줄에 나타난 것은 IRB가 마지막 expression이 수행되었다는 것을 우리에게 알려주는 방법입니다. 만약에 "Hello Wrold!"를 출력하기 원한다면 조금만 더 추가하면 됩니다.

puts는 Ruby에서 뭔가를 출력하는 기본 명령어 입니다. 그럼 => nil은 무엇일까요?
expression의 결과 입니다. puts는 항상 nil을 return합니다. nil은 Ruby의 absolutely-positively-nothing value입니다.

Your Free Calculator is Here

IRB는 또한 기본 계산기로도 충분히 사용할 수 있습니다.

위의 연산 결과를 보시면 직관적으로 알 수 있습니다. ** 는 제곱 연산을 할 때 사용하네요.
Math.sqrt(9)는 Java에서 사용하던 Math class와 같은 방법으로 사용하는 것을 볼 수 있습니다.

Modules, Group Code by Topic

Math는 수학을 위해 만들어져 있는 모듈(built-in module)입니다. 모듈들은 Ruby에서 두가지 역할을 합니다. 여기서는 한가지 역할을 보여 줍니다: 비슷한 method들을 비슷한 이름으로 모아 두는 것입니다. Math는 sin()이나 tan()과 같은 method들 역시 포함하고 있습니다.

다음은 dot(쩜)입니다. dot이 한일이 무엇인가요? dot은 message의 수신자를 어떻게 식별하는지를 나타냅니다. message가 무엇이냐구요? 이번 경우에는 parameter인 9를 가지고 square root를 구하라는 method를 호출한다는 의미의 sqrt(9)가 message입니다.

method 호출의 결과값은 3.0입니다. 여기서 여러분은 아마 3이 아니라는 것을 알아차렸을 것입니다. 이것은 보통 square root가 정수가 아니기 때문입니다. 그래서 이 method는 항상 소수점을 가진 수를 return합니다.

만약에 우리가 이 연산의 결과를 기억하고 싶다면 어떻게 해야할까요? 변수에 결과를 대입하세요.


총 4 단계로 이루어진 글인데요. 일단 여기서 1 단계를 마칩니다.

'RUBY > Getting Started' 카테고리의 다른 글

RoR vs Java  (2) 2007.06.09
Eclipse에서 Ruby사용하기.  (0) 2006.09.22
Ruby in Twenty Minutes 4  (0) 2006.09.21
Ruby in Twenty Minutes 3  (0) 2006.09.20
Ruby in Twenty Minutes 2  (2) 2006.09.19
Ruby in Twenty Minutes 1  (0) 2006.09.18
Ruby 설치하기  (0) 2006.09.16
top


Ruby Is an Object-Oriented Language

RUBY/Manual : 2006.09.17 12:13


Ruby.new


이 책을 Top-down방식으로 구성하기 위해서 class와 object가 먼저 나오고 그 다음에 세부적인 문법들을 다루려고했지만 string이나 if문 연산자와 같이 기본적인 것을 모르면 class의 예를 들기가 어렵기 때문에 전체적으로는Top-down 방식으로 기술하지만 거기에 사용된 예를 이해하기 위한 세부적인 것 까지 추가하여 다르게 됩니다.

그럼 이제 부터 Ruby를 시작하기에 앞서 Ruby의 중요한 특징과 Ruby에서 사용되는 특별한 단어들에 대한 짧은 tutorial을 보겠습니다.

Ruby Is an Object-Oriented Language

Ruby는 진짜 객체지향 언어 입니다. 당신이 만들어 내는 모든 것이 객체 이고 그것들의 연산의 결과 역시 객체입니다. 하지만, 많은다른 언어들도 똑같이 객체 지향이라고 주장하며, 종종 객체 지향에 대한 다른 해석과 그들만이 사용하는 개념에 대한 다른 용어들을가지고 말을 합니다.

따라서 보다 세부적인 내용을 살표보기 전에, 먼저 우리가 사용할 용어들을 간략히 살펴봅시다.

Class는 state와 state를 사용하는 method들의 combination입니다.
(아래는 원문입니다.)
A class is a combination of state (forexample, the name of the song)and methods that use that state (perhapsa method to play the song).
Object는 class instance와 같은 말입니다.
(아래는 원문입니다.)
The word objectis usedinterchangeably with class instance (and being lazy typists,we'llprobably be using the word ``object'' more frequently).
Ruby는 이런 객체들은 생성자를 호출해서 만들 수 있습니다. 생성자는 class와 관련된 특별한 메소드 입니다. 기본 생성자는 new 를 통해서 불려집니다.

[CODE]song1 = Song.new("Ruby Tuesday")
song2 = Song.new("Enveloped in Python")
# and so on[/CODE]

이런 객체들은 같은 class로 부터 생성되었지만 그들은 각각 유일한 특성들을 가지고 있습니다.
먼저, 모든 객체들은 유일(무이)한 object identifier(짧게 object id라고도 합니다)를 가지고 있습니다.둘째,  당신은 instance variables을 정의할 수 있습니다. instance variable이란 각각의 객체에유일한 값을 가지고 있는 변수들을 말합니다. 이러한 변수들은 객체의 상태를 나타냅니다.

각각의 class들은 또한instance method들을 정의할 수 있습니다. 각각의 method는 자기 자신에 의해 호출되거나 class 밖에서호출되는 기능의 덩어리 입니다. 이러한 instance method들은 객체의 instance 변수와 객체의 상태에 접근할 수있고 습니다.

Method들은 객체에 메시지를 보내어 호출 됩니다(are invoked). message는method의 이름과 method가 필요로 하는 parameter들이 딸려 있습니다. 객체가 message를 받으면 해당하는method를 자신의 class에서 찾습니다. 만약에 발견하면 그 method는 수행되며 만약에 찾지 못하면...이 부분은나중에 다루겠습니다.

복잡하게 들릴지 모르겠지만 실제로는 매우 자연스럽습니다. 몇몇 method 호출을 살펴보겠습니다.(기억하세요 code 예제에 있는 화살표는 리턴되는 값을 보여줍니다.)

"gin joint".length » 9
"Rick".index("c") » 2
-1942.abs » 1942
sam.play(aSong) » "duh dum, da dum de dum ..."

Here, the thing before the period is called the receiver, andthe name after the period is the method to be invoked.  <- 무슨말인지 모르겠네요;
첫번째 것은 string의 길이를 요청했고, 두번쨰는 c가 몇번째에 있는지 알려달라고 했습니다. 세번째는 절대값을 마지막은 sam에게 노래를 불러 달라고 요청했습니다.

이쯤에서 다른 언어들과 Ruby의 차이를 말해야겠네요. Java에서는 어느 수의 절대값을 알고싶을 때 그 수를 따로 분리 되어 있는 함수를 호출하면서 인자로 넘깁니다. 아마도 다음과 같이 사용할 것입니다.
[CODE]number = Math.abs(number)     // Java code[/CODE]
Ruby에서는 절대값을 구하는 기능은 숫자들에 내장되어 있습니다. 세부사항은 숫자들이 내부적으로 알아서 관리합니다. 당신은 간단하게 abs message를 보내면 되는 것입니다.
[CODE]number = number.abs[/CODE]
이러한 것은 모든 Ruby객체에 적용됩니다: 이밖에도 C언어 에서는 strlen(name)이런 방법을 사용할 것을 Ruby에서는name.length를 사용합니다. 바로 이 부분이 우리가 Ruby가 진짜 객체 지향이라고 말하는 이유입니다.

'RUBY > Manual' 카테고리의 다른 글

Reading and 'Riting  (0) 2006.11.04
Blocks and Iterators  (0) 2006.11.03
Regular Expressions  (0) 2006.10.05
Control Structures  (0) 2006.10.04
Arrays and Hashes  (0) 2006.10.02
Some Basic Ruby  (0) 2006.09.26
Ruby Is an Object-Oriented Language  (0) 2006.09.17
Roadmap  (0) 2006.09.16
top


Ruby 설치하기

RUBY/Getting Started : 2006.09.16 11:24


http://www.ruby-lang.org/en/downloads/
위 링크에서 글을 보고 있습니다.

저는 windows에서 해볼 것이기 때문에 아랫 부분만을 봤습니다.

Ruby on Windows

TheWindows platform has several options for installing Ruby. The firstoption is simply installing the compiled binaries. The second option isto use the one-click installer. If you’re unsure about how to installRuby, the one-click installer may be the best option for you. (Inaddition to Ruby, the one-click installer also comes with a bunch ofadditional libraries built in.)


두 가지 방법이 있는 하나는 컴파일 된 바이너리 파일들을 설치하는 것이고 다른 방법은 훨씬 간펴한 원클릭 인스톨러로 설치하는 것이군요.

당연히;; 간편하게 원클릭 인스톨러를 다운 받습니다.

윽.. 인터넷이 느린건지 시간이 좀 걸리네요..

다운받는 동안
http://tryruby.hobix.com/
이 곳에서 Ruby를 체험해 볼 수 있습니다.

와.. 엄청나네요.. 이걸 어떻게 만들었을지.. 정말 아이디어 부터 디자인, 개발 한 것 까지 정말 대단하네요.. 시간가는 줄 모르고 빠져들었습니다. ㅋ 다운로드가 다 됐슴에도 불구하고 끝까지 따라 해보고 있습니다.

역시 설치는 클릭 몇번이면 끝나는 군요.

freeRIDE라는 IDE를 실행하고 다운받는 동안 놀아봤던 간단한 문장 몇개를 적은 뒤 run을 실행해 봤습니다.
그러나.. window에서 사용할 때는 debug 옵션에서 무언가 체크해줘야 한다는 에러메시지가 출력되더군요.
그래서 옵션이 어디있는가 찾아 보다가.. debug를 클릭했더니 ㅜㅜ 얼었네요.. 아 갈길이 머네요. 오늘은 한탬포 쉬겠습니다.




'RUBY > Getting Started' 카테고리의 다른 글

RoR vs Java  (2) 2007.06.09
Eclipse에서 Ruby사용하기.  (0) 2006.09.22
Ruby in Twenty Minutes 4  (0) 2006.09.21
Ruby in Twenty Minutes 3  (0) 2006.09.20
Ruby in Twenty Minutes 2  (2) 2006.09.19
Ruby in Twenty Minutes 1  (0) 2006.09.18
Ruby 설치하기  (0) 2006.09.16
top

TAG install, ruby

Roadmap

RUBY/Manual : 2006.09.16 10:13


http://www.rubycentral.com/book/roadmap.html
위에 링크된 페이지를 보며 글을 작성합니다.

이 책은 총 네 파트로 나뉘어 지는데 다음과 같습니다.

In Part I, Ruby의 다양한 측면, Ruby tutorial을 보시게 됩니다. Ruby를 특별하게 하는 용어들과 개념에 대한 짧은 챕터들로 시작합니다. 물론 이 챕터들은 다른 챕터를 이해하기 위한 충분한 기본 문법도 제공합니다. tutorial은 top-down 방식으로  이 언어를 살펴볼 것입니다. 따라서 classes, objects, types , expressions 과 언어를 구성하는 모든 것을 살펴 볼 것입니다. 우리는 또한 문제가 발생했을 때 당신을 도울 수 있는 간략한 챕터로 마무리를 할 것입니다.

Ruby의 가장 멋진 점 중에 하나가 바로 주변 환경과 얼마나 잘 통합되느냐 입니다.
Part II, Ruby in Its Setting, 이부분을 공부하세요. 이 부분에서 당신은 Ruby를 실행하고, web에서 Ruby를 사용하기 위한 실용적인 정보를 찾을 수 있습니다. 당신은 Tk를 사용해서 어떻게 GUI를 생성하는지, 그리고 MS Windows 환경에서 Ruby를 어떻게 사용할지(native API calls, COM integration, Windows Automation) 배우게 될 것입니다. 결국에 Ruby를 확장하거나 당신의 code에 Ruby를 심는(embed) 것이  얼마나 쉬운지 알게 될 것입니다.

Part III, Ruby Crystallized, 이 부분은 매우 구체적인 내용을 포함하고 있습니다. 이 부분에서 당신은 언어의 매우 섬세한 모든 부분(the metaclassmodel, tainting, reflection, and marshaling)에 대해 볼 수 있습니다. You could probablyspeed-read this the first time through, but we found ourselves usingthe tables in this section even as we were writing the rest of thebook.


The Ruby Library Reference is Part IV. 매우 큽니다. 우리의 40개 이상의 기존에 만들어진 class와 mudule들에 있는 800개가 넘는 method들을 문서화 했습니다. It's big. We documentover 800 methods in more than 40 built-in classes and modules. 그중에서도, 우리는 Ruby에 있어 좀더 유용한 library module들 중 일부를 70페이지에 걸쳐 기술했습니다.


자 그럼 이책을 어떻게 읽어야 할까요?

그문제는 당신에게 달려있습니다. 당신의 일반적인 programming에 대한 level과 일부는 OO에 따라 당신은 이 책의 아주 적은 부분만을 읽기를 원할 것입니다. 그래서 우리가 다음과 같이 추천해 드립니다.

만약에 당신이 초보자라면, Part 1부터 읽기 바랍니다. 프로그램들을 작성할 때 library reference를 가까이 두기바랍니다. Array, Hash와 String같은 기본 class에 친숙해 지기 바랍니다. 환경에 점차 익숙해 짐에 따라, 당신은 Part 3에 있는 좀더 세밀한 부분을 알고 싶어질 것입니다.

만약에 자신이 Perl, Python, Java, or Smalltalk들에 익숙하다면,Chapter 2 부터 읽기를 제안합니다. 여기서 당신은 책을 따라 천천히 꾸준하게 책을 읽을 수도 있으며, 모든 부분을 skip하고 Part 3의 세밀한 부분으로 갈 수있습니다.

전문가들과 ``I-don't-need-no-stinking-tutorial'' 타입의 사람들은 199page부터 시작하는 Chapter 18에 있는 reference로 바로 뛰어 들 수 있습니다. library reference를 대강 살펴보더나 coffee coaster로 책을 사용할 수 있습니다.

물론, 책을 처음부터 읽거나 자신이 원하는 대로 읽어도 괜찮습니다.

아 그리고 잊지마세요. 만약에 자신이 알아 낼 수 없는 문제가 발생했을 때 도움을 드립니다. page 525쪽 부터 시작하는 Appendix C에 많은 정보가 있습니다.

'RUBY > Manual' 카테고리의 다른 글

Reading and 'Riting  (0) 2006.11.04
Blocks and Iterators  (0) 2006.11.03
Regular Expressions  (0) 2006.10.05
Control Structures  (0) 2006.10.04
Arrays and Hashes  (0) 2006.10.02
Some Basic Ruby  (0) 2006.09.26
Ruby Is an Object-Oriented Language  (0) 2006.09.17
Roadmap  (0) 2006.09.16
top