1. 루비의 객체 지향 특성
-
배경: C나 Perl 같은 이전 언어들은 데이터와 함수가 분리되어 순수 객체 지향이 아니었습니다.
-
루비의 해결: 1990년대 중반 루비는 숫자, 문자열,
nil까지 모든 것을 객체로 취급하는 순수 객체 지향 패러다임을 도입하여 일관된 상호작용을 가능하게 했습니다. -
작동 방식: 모든 값은 클래스를 가지며, 모든 연산은 객체에 대한 메서드 호출로 이루어집니다.
-
Rails 예시:
User모델 클래스와 그 인스턴스인@user는 모두 객체이며,@user.save,@user.full_name과 같은 메서드 호출을 통해 동작합니다.
2. 지역 변수와 인스턴스 변수
-
배경: 이전 언어에서는 변수 스코프 제어가 제한적이었고 객체 내 메서드 간 데이터 공유가 어려웠습니다.
-
루비의 해결: 인스턴스 변수(
@var)를 도입하여 데이터를 특정 객체 인스턴스에 묶고 상태 캡슐화를 가능하게 했습니다. - 정의:
- 지역 변수: 메서드나 블록 내에서만 접근 가능하며 소문자로 시작합니다.
- 인스턴스 변수: 특정 객체 인스턴스에 속하며
@로 시작합니다.
-
작동 방식: 각 객체 인스턴스는 자신만의 인스턴스 변수 복사본을 가지며, 지역 변수는 메서드 실행 후 소멸됩니다.
- Rails 예시: 컨트롤러에서
local_count는 뷰에서 접근할 수 없지만,@products와 같은 인스턴스 변수는 뷰(index.html.erb)에서 공유되어 사용됩니다.
3. 루비에서 메서드 정의
-
배경: C와 같은 절차 지향 언어에서 함수는 데이터와 분리되어 코드 중복과 조직화 문제를 야기했습니다.
-
루비의 해결: 메서드를 객체에 연결하여 동작을 캡슐화하고 재사용성을 높였습니다.
-
정의: 특정 작업을 수행하고 값을 반환할 수 있는, 객체(또는 클래스)와 관련된 이름 있는 코드 블록입니다.
-
작동 방식:
def ... end키워드를 사용하여 정의하며, 매개변수는 선택 사항이고 마지막으로 평가된 표현식이 반환됩니다.self.method_name을 통해 클래스 메서드도 정의할 수 있습니다. -
Rails 예시:
User모델의formatted_email메서드는 사용자 이메일 포맷팅 로직을 캡슐화하여 깔끔하고 재사용 가능하며 테스트 용이한 코드를 만듭니다.
4. 루비의 심볼 개념
-
배경: 이전에는 해시 키, 메서드 이름 등에 문자열을 사용했으나, 메모리 중복, 성능 오버헤드, 불변성 문제가 있었습니다.
-
루비의 해결: 심볼을 도입하여 이러한 단점을 해결했습니다.
-
정의: 콜론(
:)으로 시작하며, 이름이나 레이블을 나타내는 불변하고 고유한(interned) 식별자입니다. -
작동 방식: 심볼은 메모리에 한 번만 저장되므로
object_id가 항상 같아 비교가 빠르고 메모리 효율적입니다. 루비는 내부적으로 메서드 이름 등에 심볼을 사용합니다. -
Rails 예시:
User.where(role: :admin)과 같이 해시 키나 옵션 인수로 사용되며,resources :users,before_action :authenticate_user!,enum role: { admin: 0 }등 Rails 전반에서 성능과 일관성을 위해 활용됩니다.
5. 루비의 유연성
-
배경: C, Java, C++ 같은 엄격한 언어는 런타임 시 클래스나 메서드 변경이 어려웠습니다.
-
루비의 해결: 메타프로그래밍과 오픈 클래스를 통해 런타임에 클래스, 메서드, 객체를 수정할 수 있는 능력을 제공하여 “프로그램이 프로그램을 작성하는” 유연성을 부여했습니다.
-
정의: 기존 클래스(String, Array 등)를 열어 수정하고, 메서드를 동적으로 정의하며, 런타임에 동작을 변경하는 메타프로그래밍을 사용하는 능력입니다.
- 작동 방식:
- 오픈 클래스:
class String; def shout; ... end; end와 같이 핵심 클래스에 새로운 메서드를 추가할 수 있습니다. - 동적 메서드 정의:
define_method를 사용하여 런타임에 메서드를 생성할 수 있습니다.
- 오픈 클래스:
- Rails 예시: ActiveRecord는 데이터베이스 컬럼을 기반으로
user.name과 같은 모델 메서드를 동적으로 정의하며,resources :users와 같은 Rails DSL은 런타임에 RESTful 라우트를 동적으로 생성하는 루비의 유연성을 활용합니다.