Whiteship's Note


[ASM] 클래스 - 인터페이스와 구성요소

Good Tools : 2010.04.01 10:23


참조: http://download.fr.forge.objectweb.org/asm/asm-guide.pdf

컴파일된 클래스 생성 또는 변경할 때 사용하는 핵심 API는 ClassVisitor 인터페이스.


이 API는 다음 순서대로 사용해야 함.

1. visit 호출.
2. visitSource 최대 한번 호출 가능.
3. visitOuterClass 최대 한번 호출 가능.
4. visitAnnotation과 visitAttribute 원하는 만큼 호출 가능.
5. visitInnerClass, visitField, visitMethod 원하는 만큼 호출 가능.
6. visitEnd 호출.

주요 구성요소
- ClassReader: 바이트 배열로 받은 컴파일된 클래스를 파싱하고 accept 메서드의 인자로 전달된 ClassVisitor 객체에 있는 visitXxx 메서드를 호출한다. 이벤트 공급자.
- CLassWriter: ClassVisitor 인터페이스 구현체로, 직접 바이트 형식으로 컴파일된 클래스를 만든다. toyteArray 메서드로 컴파일된 클래스를 담고 있는 바이트 배열을 가져올 수 있다. 이벤트 소비자.
- ClassAdapter: ClassVisitor 인터페이스 구현체로, 이 객체에 대한 모든 메서드 호출을 다른 ClassVisitor 인스턴스에 위임한다. 이벤트 필터.


top

TAG ASM, class

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 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