본문 바로가기

분류 전체보기100

메소드 탐색2 메서드 탐색 경로와 관련하여 좀 더 독특한 경우가 있는데, 그것을 살펴보기 위해서는 믹스인을 다시 들여다볼 필요가 있다. 믹스인은 다중 상속의 복잡한 문제 없이 클래스나 모듈이 다른 모듈의 메서드를 가져와 사용할 수 있도록 해주는 기능이다. Array, Hash, Range 등 여러 클래스들이 Enumerable 모듈을 인클루드함으로써 믹스인의 혜택을 누리고 있다. 모듈을 믹스인하는 방법에는 include, prepend, extend 메서드를 사용하는 방법이 있는데, 우선 include와 prepend를 비교해 보자. 아래 그림을 보면 foo 메서드 하나를 정의한 모듈 M이 있고 클래스 C1과 C2는 include를 사용하여 모듈 M을 믹스인 했고 클래스 C3는 prepend를 사용하여 모듈 M을 믹스.. 2025. 2. 25.
메소드 탐색1 이번 글에서는 어떤 객체에 대해 특정 메서드를 호출했을 때 해당 메서드를 찾는 과정 즉, 메서드 탐색(Method Lookup)에 대해 자세히 살펴보려고 한다. 객체 지향 프로그래밍 언어에서 메서드를 찾을 때는 일반적으로 해당 객체의 클래스에서 먼저 찾아보고 없으면 부모 클래스에서 찾고 그래도 없으면 그 위의 부모 클래스에서 찾는다. 이러한 과정이 메서드를 찾을 때까지 계속 이어지고 최종적으로 해당 메서드를 찾지 못하면 에러가 발생한다. 아래 Person 클래스와 Person 클래스를 상속하여 만든 Programmer 클래스의 코드가 있다. 우선 이 코드를 D:/blog/ruby/method_lookup 폴더 아래 person.rb 파일을 만들어 저장하자.class Person attr_reader :.. 2025. 2. 21.
Enumerator 파헤치기8 이번 글은 'Enumerator 파헤치기' 시리즈의 마지막 글로 Enumerator::Lazy 클래스에 대해 살펴보자. Enumerator::Lazy는 평가를 필요한 시점까지 뒤로 미루고 필요한 만큼만 평가할 수 있는 기능을 제공한다.  아래 Lazy를 사용한 간단한 예를 먼저 보자.앞의 그림의 두 코드는 모두 1부터 10까지의 정수 중 제곱한 값이 짝수인 앞의 두 숫자(제곱한 값)를 가져오는 코드이다. 그리고 아래 코드가 범위에 대해 lazy라는 메서드를 호출했다는 것만 빼고는 두 코드 자체도 동일하다. 이 코드의 결과만 봐서는 Lazy의 기능이 뭔지 잘 와닿지 않을 것이다. 그러면 아래 그림처럼 코드를 약간 수정하여 다시 실행해 보자.이전 테스트 결과와는 확연히 다른 것을 볼 수 있다. map과 se.. 2025. 2. 20.
Enumerator 파헤치기7 지난 글에서 봤던 예제의 결과를 다시 한번 살펴보자.결과를 보면 next 메서드를 호출할 때마다 블록의 내용이 실행되면서 next 메서드로 값을 전달해 주고 next 메서드는 그 값을 그대로 반환해 준다. 그런데 어떻게 값을 전달한 후 블록의 실행이 멈췄다가 다시 next 메서드를 호출하면 멈췄던 부분부터 실행을 다시 시작할 수 있는 걸까? 컴퓨터 프로그래밍에 코루틴(Coroutine)이라는 개념이 있는데 이것은 일반 함수와 달리 실행을 중단하고 중단한 지점부터 다시 실행을 재개할 수 있는 특징이 있다. 이러한 코루틴의 개념을 실제 프로그래밍에서 사용할 수 있도록 루비에서는 Fiber라는 이름으로 구현하여 제공하고 있다. 간단히 Fiber를 테스트해 보기 위해 아래 코드를 D:/blog/ruby/enum.. 2025. 2. 18.