⛏️
공부방
  • README.md
  • 프로젝트
    • ft_transcendence
      • 설계
        • 0. 프론트 디자인
        • 1. BackboneJS 뷰 객체
        • 2. API 설계
        • 3. 레일즈 라우팅 구현
        • 4. DB 설계
        • 5. 채널 설계
    • slab-saver
    • react-payment
  • 공부
    • HTML, CSS
      • GRID
      • emmet
      • position
      • CSS Unit
        • 단위 정리
        • 기준을 정해보자
        • em의 정확한 기준은 뭐야?
      • flex
      • NAVBAR 실습
      • 유튜브 화면 만들어보기
    • SQL
      • 이론
        • 1강 데이터베이스
        • 2강 다양한 데이터 베이스
        • 3강 데이터베이스 서버
      • 명령어
        • DB 관리
        • TABLE 관리
        • Constraints
        • SQL 명령어 - 1
        • SQL 명령어 - 2
        • SQL 명령어 - 3
        • SQL 명령어 - 4
        • SQL 명령어 - 5
    • Ruby
      • 루비 객체와 클래스
      • 곡괭이
        • Chapter2. Ruby.new
        • Chapter3. 클래스, 객체, 변수
        • Chapter4. 컨테이너, 블록, 반복자
        • Chapter5. 기능 공유하기
        • Chapter6. 표준 타입
        • Chapter8. 메서드 파헤치기
    • Python
      • 유용한 링크
    • RubyOnRails
      • 아직 정리하지 못한 것들
        • RSPEC 을 이용한 테스트 완전 자동화
        • 레일즈 이니셜라이징 과정
        • 액션케이블 구체적으로 정리하기
        • 웹팩으로 자바스크립트 모듈 관리하기
      • ACTIVE JOB
        • 액티브잡의 기본
        • 실전! 액티브 잡을 이용한 스케쥴링
        • 서버를 껏다 키면 스케쥴링 된 이벤트가 사라진다!
      • ACTION CABLE
        • 액션케이블 Consumer를 이용해서 문제 해결
        • 액션케이블 연결 순서
      • ACTIVE STORAGE
      • 모델
        • validation
          • seeds 데이터 validation 스킵
          • validation 검사가 save, update, create 모든 경우에 일어난다
          • validator 클래스
          • 커스텀Validation
          • validates format(정규표현식)
        • 액티브레코드 find의 다양한 활용
        • 한 레코드에 동시 접속 막자!! with_lock
        • 레일즈 where 사용법
        • 레일즈에서 모델 관련 이슈
        • 모델이름바꿀때명심할것
        • 모델의 includes 메서드
        • 연관 모델을 다른 이름으로 설정하고 가져오기
      • 기본 상식
        • form으로 전달되는 params를 분석해보자
        • StrongParameter 쿼리 배열 받기
        • view helper로 디버깅 하는 방법
        • css 파일을 수정했는데 적용이 안된다?
        • StrongParameter 일반데이터와 객체 데이터 한번에 받기
        • wrap-parameter body가 두 번씩 날라오는 이유
        • 컬렉션 map에서 요소 스킵하는법
        • CASE를 이용해서 정렬(일반적인 정렬 X)
        • 문자열(정규표현식)
        • TIME ZONE 설정하기
        • 커스텀exception
      • RSPEC으로 모델 테스트하기
      • 한 눈에 읽는 루비 온 레일즈
      • Perfect RubyOnRails
        • Chapter1. 소개
        • Chapter2. RubyOnRails 기본
        • Chapter3. 스캐폴딩
        • Chapter7. 라우팅
        • Chapter8. 테스트
    • Javascript
      • var, let, const 차이
      • 브라우저 동작 원리
      • 디바운싱과 쓰로틀링
      • Tagged Template Literal(styled-components)
      • IntersectionObserver 를 사용해서 스크롤 이벤트의 부하 줄여주기
      • EVENT LOOP
        • 자바스크립트에서 어떻게 비동기적인 실행이 가능한걸까?
        • 이벤트 루프의 동작
        • setTimeout이 실행되면 어떤 동작이 일어날까?
        • 블록은 실행이 보장된다
        • 콜스택에 있는 블록이 보장된다는 점을 이용해서 브라우저 죽이기
        • setTimeout 무한반복으로 브라우저는 죽을까?
        • Promise 무한반복으로는 브라우저를 죽일 수 있을까?
        • RAF는 그럼 뭐야?
      • forEach는 반복도중 멈출 방법이 throw 밖에 없다!
      • 임시
        • 정리할 것 목록
          • 자바스크립트 기본 문법
        • 이벤트 임시 정리
      • 유용한 링크
      • arrow function 을 이용한 bind 이슈 해결
      • preventDefault - passive
      • CRITICAL-RENDERING-PATH
      • setInterval에 클로져 개념 사용하기
      • 오디오 문제 이슈
      • 자바스크립트의 식과 문
        • 식과 문이란 무엇인가...
        • 식
          • 1. 기본값과 래퍼객체
          • 2. 참조값과 가비지컬렉팅
        • 식을 조금 더 자세히 알아보자
      • prototype, [[Prototype]] 차이
      • export, import 학습
      • ESlint
      • 아주아주기본
        • Chatper1. 기본
        • Chapter2. 타입
        • Chapter3. 연산자
        • Chapter4. 제어문
        • Chapter5. 배열
        • Chapter6. 함수
        • Chapter7-1. 객체
        • Chapter7-2. 객체
        • Chapter8. 표준객체
        • Chapter9. DOM
      • 이벤트 위임
      • 이벤트가 버블링 되서 root 까지 가다보면... 부모의 부모의 ... 모든 click 이벤트를 발동시키는거 아니야?
      • classList
    • BackboneJS
      • Backbone Model 프로토타입에 메서드 구현하기
      • BackboneJS의 각 요소의 역할과 책임을 확실히 이해하자
      • Window 이벤트를 listenTo로 감시하기
      • 뷰 자신이 자신을 지워야 할 때를 감지하려면 어떻게 해야하는가?
      • 백본 VIEW의 remove와 jquery의 remove 는 다르다!
      • 백본 컬렉션 URL에 쿼리 붙이기
      • index.html.erb와 BackboneJS의 결합
      • 백본 모델과 컬렉션에서 fetch 를 통해 JSON 가져오기!
      • 모델은 urlRoot, 컬렉션은 url
      • ISSUE
      • Absolute Beginner
        • Part1
        • Part2
        • Part3
        • Part4
    • 문제풀이
      • 01. 유효한 팰린드롬(leetcode: 125)
      • 02. 문자열 뒤집기(leetcode: 344)
      • 03. 로그파일 재정렬(leetcode 937)
      • 04. 가장 흔한 단어(leetcode: 819)
      • 05. 그룹 애너그램(leetcode: 49)
      • 06. 가장 긴 팰린드롬 문자열(leetcode: 5)
      • 07. 두 수의 합(leetcode: 1)
      • 08. 빗물 트래핑
      • 09. 세 수의 합(leetcode: 15)
    • BlackCoffeeStudy
      • level1
        • 1주차
    • express
      • Untitled
      • 구글 애널리틱스 연결하기
      • passport를 활용한 로그인
      • express-init 명령어 사용
      • ec2와 DBeaver
      • mariadb 설치
      • sequelize 설치 및 사용법
        • sequelize 설치
        • sequelize-cli 사용법
        • 모델 간 연관관계 맺기
        • Hook 사용하기
      • express-ejs-layout 활용하기
      • Bootstrap
      • npm install로 설치한 모듈 ejs에서 사용하기
      • 미들웨어
    • cypress
      • window.alert 테스트는 어떻게 하지?
      • 상수를 어디에 저장할건가?
      • before()와 beforeEach()
    • aws
      • aws로 프로젝트를 배포해보자!
      • nginx로 리버스프록시 서버를 만들자
      • github actions 로 푸쉬되면 자동으로 업데이트 하는 기능 만들어보기
    • react
      • Drag & Drop 를 이용해서 리스트 요소 순서 바꾸기
      • CRA에서 CRACO 사용하지 않고 절대경로 import(NODE_PATH)
      • useEffect내에서 state의 dependency 문제
      • IntersectionObserverAPI로 무한스크롤 구현
      • react-testing-library
        • 기본
        • react-router-dom 에서의 에러
        • event 발생시키기
        • Integration testing하기
        • async하게 렌더링 되는 요소 잡기
        • Mocking 하기
      • CRA로 만든 앱에서 절대경로로 import 해오기(alias하기)
      • 커스텀 훅 만들기
    • 타입스크립트
      • 조건부타입 (Conditional types)
      • Generics
      • Keyof 타입 오퍼레이터
      • Indexed Access Types
      • 타입 챌린지
        • easy
          • 00. Awaited
          • 01. Concat
          • 02. Exclude
          • 03. First Of Array
          • 04. If
          • 05. Includes
          • 06. Pick
          • 07. Readonly
          • 08. Length
          • 09. Tuple to Object
        • mediun
          • 01. Absolute
    • Firebase
      • 파이어스토어 규칙
    • 기타
      • 협업 프로세스
      • UUID
      • 구글애널리틱스 설치하기
      • 드림코딩 강의
        • 포트폴리오
          • CSS
            • nth-child
            • CSS 팁
          • 자바스크립트
            • 1. 스크롤에 따른 navbar 의 색 변경하기
            • 2. navbar 버튼을 누르면 해당 페이지로 스크롤링 되게 만들자
            • 3. 스크롤 다운 하면 arrow-up 버튼 나오게 하기
            • 4. project 필터링 구현
            • 5. project 필터링에 transition 효과 넣기
      • GIT
        • 기본 사용법 정리
        • git remote update - remote 브랜치 가져오기
  • 기타
    • 이것저것
      • 독서
        • 클린코드
          • Chapter0. 나는 왜 클린코드 책을 읽는가?
          • Chapter1. 클린코드
          • Chapter2. 의미있는 이름
          • Chapter3. 함수
          • Chapter4. 주석
          • Chapter5. 형식 맞추기
      • 용어
      • IDE
        • RubyMine
          • 실전이 중요!
          • 1. Editor Basic
          • 2. Navigation
          • 3. Completion
          • 4. Refactoring
          • 5. Code Assistance
      • MAC에서 살아남기
        • Alfred - Spotlight 업그레이드
        • Vimium
        • BetterTouchTool - 트랙패드
        • 구름 입력기 - ESC, `
        • Spectacle - 화면 분할
    • 원티드 프리온보딩
      • 1주차
        • 월요일
        • 목요일
      • 2주차
      • 3주차
      • 4주차
      • 5주차
      • 6주차
    • 일기장
      • 2020
        • December
          • 20201208(화)
          • 20201209(수)
          • 20201210(목)
          • 20201211(금)
          • 20201214(월)
          • 20201215(화)
          • 20201216(수)
          • 20201217(목)
          • 20201218(금)
          • 20201219(토)
          • 20201221(월)
          • 20201222(화)
          • 20201223(수)
          • 20201224(목)
          • 20201226(토)
          • 20201228(월)
          • 20201229(화)
          • 20201230(수)
          • 20201231(목)
      • 2021
        • January
          • 20210101(금)
          • 20210102(토)
          • 20210105(화)
          • 20210106(수)
          • 20210107(목)
          • 20210108(금)
          • 20210109(토)
          • 20210112(화)
          • 20210113(수)
          • 20210114(목)
          • 20210115(금)
          • 20210117(일)
          • 20210118(월)
          • 20210119(화)
          • 20210120(수)
          • 20210121(목)
          • 20210125(월)
          • 20210126(화)
          • 20210127(수)
          • 20210128(목)
          • 20210129(금)
        • February
          • 20210201(월)
          • 20210202(화)
          • 20210203(수)
          • 20210204(목)
          • 20210205(금)
          • 20210207(일)
          • 20210208(월)
          • 20210209(화)
          • 20210217(수)
          • 20210218(목)
          • 20210219(금)
          • 20210220(토)
          • 20210222(월)
          • 20210223(화)
          • 20210224(수)
          • 20210226(금)
          • 20210228(일)
        • March
          • 20210302(화)
          • 20210303(수)
          • 20210304(목)
          • 20210305(금)
          • 20210306(토)
          • 20210308(월)
          • 20210309(화)
          • 20210310(수)
          • 20210311(목)
          • 20210312(금)
          • 20210313(토)
          • 20210315(월)
          • 20210316(화)
          • 20210317(수)
          • 20210318(목)
          • 20210319(금)
          • 20210322(월)
          • 20210323(화)
          • 20210324(수)
          • 20210325(목)
          • 20210327(토)
          • 20210329(월)
          • 20210330(화)
          • 20210331(수)
        • April
          • 20210406(화)
          • 20210407(수)
          • 20210408(목)
          • 20210409(금)
          • 20210410(토)
          • 20210412(월)
          • 20210413(화)
          • 20210414(수)
          • 20210415(목)
          • 20210416(금)
          • 20210417(토)
          • 20210419(월)
          • 20210420(화)
          • 20210421(수)
          • 20210422(목)
        • July
          • 20210728(수)
Powered by GitBook
On this page
  • 객체와 클래스
  • 루비 객체의 내부 구조
  • klass와 ivptr 살펴보기
  • 한 클래스의 두 인스턴스에 대한 시각화
  • 일반객체
  • 간단한 루비 값은 구조체가 필요없다
  • 일반 객체들은 인스턴스 변수를 가지는가?
  • 일반 객체는 인스턴스 변수를 어디에 저장할까?
  • RClass 구조체의 내부에는 무엇이 존재할까?
  • 상속
  • 클래스 인스턴스 변수와 클래스 변수
  • 클래스 변수를 가져오고 설정하기
  • 상수
  • RClass 구조체의 실제
  • 정리
  • 루비 객체
  • 루비 클래스

Was this helpful?

  1. 공부
  2. Ruby

루비 객체와 클래스

'루비를 깨우치다' 책의 5장을읽고 정리했습니다.

PreviousRubyNext곡괭이

Last updated 4 years ago

Was this helpful?

객체와 클래스

모든 루비 객체는 클래스 포인터와 인스턴스 변수 배열의 조합이다.

  • 모든 루비 프로그램은 일련의 객체들과 이들 객체 간에 전달되는 메시지로 구성된다.

  • 그렇다면 루비 객체란 무엇인가? 하나의 객체는 어떤 정보를 가지는가? 현미경을 통해서 하나의 루비 객체를 들여다 본다면 무엇을 알게 될까? 루비 클래스는 또 무엇인가? 등의 물음을 여기서 해결해보자

루비 객체의 내부 구조

  • 루비는 작성한 객체를 RObject라는 C 구조체에 저장한다.

  • 그림의 상단에는 Robject 구조체에 대한 포인터가 위치한다. 내부적으로 루비는 항상 VALUE 포인터로 값을 참조한다.

  • RObject 는 RBasic 구조체 와 객체 전용 정보를 포함하고 있다.

  • RBasic은 다양한 내부 값을 저장하는 flags 라는 불리언 값들과 klass 라는 하나의 클래스 포인터를 포함한다.

    • 클래스 포인터(klass)느 객체가 어떤 클래스의 인스턴스인지 알려준다.

  • 루비는 각각의 객체가 포함하는 인스턴스 변수들의 배열을 RObject에 저장한다.

    • numiv는 객체가 포함하는 인스턴스 변수의 개수

    • ivptr을 인스턴스 배열을 가리키는 포인터다.

  • 여기서 1차적으로 루비의 객체 구조를 기술적인 용어로 정의해보자.

모든 루비 객체는 하나의 클래스 포인터와 인스턴스 변수의 배열을 조합한 것이다.

  • 하지만 ... 이런 정의는 그리 유용하지 않다. 객체 뒤에 숨어있는 의미나 목적을 이해하거나 사용하는데 도움이 되지 못하기 때문이다.

klass와 ivptr 살펴보기

  • 간단한 루비 프로그램을 만들어서 살펴보자

  • # 목록 5-1 : 간단한 루비 클래스
    class Mathematician
      attr_accessor :first_name
      attr_accessor :last_name
    end
  • 위의 클래스를 가지고 irb에서 테스트를 해보자

  • # 목록 5-2
    eular = Mathematician.new
    eular
    # 결과
    # <Mathematician:0x00007fac99a40dd8>
  • eular은 Mathematician의 객체다. 이 객체 상태를 출력한 결과 #<Mathematician:0x00007fac99a40dd8> 가 나왔다. 이 구문은 우리에게 두 가지를 알려준다.

    1. Mathematician은 클래스 포인터(klass)다

    2. 0x00007fac99a40dd8 은 해당 객체애 대한 VALUE 포인터다.

  • # 목록 5-3
    eular.first_name = 'Leonhard'
    # <Mathematician:0x00007fac99a40dd8 @first_name="Leonhard">
    eular.last_name = 'Eular'
    # <Mathematician:0x00007fac99a40dd8 @first_name="Leonhard", @last_name="Eular">
  • 루비는 목록 5-3처럼 특정 객체에 저장하는 값들을 유지하기 위해서 인스턴스 배열을 사용한다.

한 클래스의 두 인스턴스에 대한 시각화

  • 아래의 코드를 실행할 때 루비는 하나의 RClass 구체와 두 개의 RObject구조체를 만들게 된다.

  class Mathematician
    attr_accessor :first_name
    attr_accessor :second_name
  end
	# RClass: Mathematician
  
  
  eular = Mathematician.new
  eular.first_name = 'Leonhard'
  eular.last_name = 'Eular'
  # RObject: eular
  
  euclid = Mathematician.new
  euclid.first_name = 'Euclid'
  # RObject: euclid
  • 각각의 klass 값은 동일한 Mathematician RClass 구제초를 가리키게 되며 각각의 RObject 구조체는 각기 다른 인스턴스 변수의 배열을 가리킨다.

일반객체

  • 위의 Mathematician 클래스와 같이 직접 작성하는 클래스는 RObject 구조체에 저장된다.

  • 하지만 루비의 일반 데이터형은 어떻게 되는걸까? (루비의 일반 데이터형 또한 클래스의 객체다!)

  • 그렇다면 일반데이터도 RObject 에 저장 되는걸까?

    • 아니다! 루비는 일반 데이터형을 저장하기 위해 RObject 가 아닌 다른 구조체를사용한다.

    • `RObject는 개발자가 직접 작성한 클래스 인스턴스와 루비가 내부적으로 만드는 몇 가지 객체 클래스를 저장할 때에만 사용된다!!

  • 예를 들어 String의 경우는 RString, 정규표현식은 RRegexp 구조체를 사용한다.

간단한 루비 값은 구조체가 필요없다

  • 퍼포먼스를 생각하면 위와 같은 RObject 구조체를 모든 객체가 갖는다는건 말이 안된다. 예를 들어 간단한 숫자 1을 생각해보자. 1 또한 루비에서는 객체(메서드를 갖음)가 된다.

  • 당연하게도 루비에서는 최적화 방안으로 작은 정수, 심볼, 그리고 몇가지 간단한 값의 경우에는 어떠한 구조체의 도움도 받지 않는다.

일반 객체들은 인스턴스 변수를 가지는가?

  • 루비 객체의 정의를 다시 생각해보자

    모든 루비 객체는 클래스 포인터와 인스턴스 변수 배열의 조합이다.

  • 일반 객체에 대한 인스턴스 배열? 그렇다면 정수, 문자열, 그 외 일반적인 데이터 값들은 인스턴스 배열을 갖는건가?

    • 뭔가.. 상식적으로 아닐거 같다.

    • 하지만 정수와 문자열 등이 객체라면 인스턴스 변수를 가져야 한다. 하지만 우리는 이런 일반 객체들은 RObject 구조체를 갖지 않는다고 했잖아?

  • 짜잔.. instance_varialbes 와 instance_variable_set 메서드를 이용해서 인스턴스를 일반 객체에 추가할 수 있다. 즉 일반 객체도 인스턴스 배열을 갖는다.

일반 객체는 인스턴스 변수를 어디에 저장할까?

  • 내부적으로 루비는 약간의 꼼수를 이용해서 RObject를 사용하지 않는 객체들이 인스턴스 변수를 저장하게 한다.

  • 일반 객체에 인스턴스 배열을 저장할 때 루비는 generic_iv_tbl 라는 특별한 해시에 저장한다.

RClass 구조체의 내부에는 무엇이 존재할까?

  • 모든 객체는 RClass 구조체애 대한 포인터를 저장하여 자신의 클래스를 기억한다.

  • class Mathematician
      attr_accessor :first_name
      attr_accessor :last_name
    end
    • attr_accessor은 속성에 대한 get/set 메서드를 정의하는 단축형 메서드

  • 위의 클래스는 단순히 메서드만을 정의한 클래스다. 이를 토대로 클래스에 대한 첫 번째 정의를 내려보자.

루비 클래스는 메서드 정의들을 모아 놓은 것이다.

  • 여기서 속성을 추가하면

  • 이제 루비 클래스의 정의를 다시 내려보자

루비 클래스는 메서드 정의를 모아 놓은 것이며 속성명을 테이블로 작성해 놓은 것이다.

  • 루비의 모든 것은 객체다. 즉, 루비 클래스 또한 어떤 것의 객체다!!!!

    • 확인 결과 Mathematician는 Class 클래스의 인스턴스라는걸 알수있다.

  • 루비의 모든 클래스는 Class 클래스의 인스턴스다!

    • 그러므로 클래스 역시 객체다.

  • 이제 루비 클래스 정의를 다시 업데이트 하면

루비 클래스는 메서드 정의들과 속성명을 포함하는 루비 객체다.

  • 루비 클래스도 객체이기 때문에, RClass 구조체는 모든 루비 객체가 포함하는 것으로 알고 있는 값들(위에서 학습했던), 클래스 포인터와 인스턴스 변수 배열을 포함해야만 한다.

    • 이번 그림에서는 클래스 포인터와 인스턴스 변수들을 추가했다.

    • 클래스 수준의 인스턴스 변수와 객체 수준의 인스턴스 변수들에 대한 속성명 테이블과 혼돈하지 말자.

상속

  • 루비는 클래스를 생성할 때 하나의 상위 클래스를 선택적으로 지정할 수 있게 해줌으로써 단일 상속을 구현한다

  • 상위 클래스를 지정하지 않으면, 루비는 Object클래스를 상위 클래스로 자동 할당한다.

  • 만약 Mathematician 이 Person 클래스를 상속 받는다고 해보자.

    • Math~ 클래스는 자신의 상위 클래스인 Person으로의 참조를 포함하기 때문에 상위 클래스에서 정의된 모든 메서드나 속성들을 찾을 수 있게 된다. 루비가 klass 와 비슷한 또 다른 포인터를 이용해아 상위 클래스를 추적한다고 가정하고 클래스 정의를 수정해보자

루비 클래스는 메서드 정의, 속성 이름, 그리고 상위 클래스 포인터를 포함하는 루비 객체다.

클래스 인스턴스 변수와 클래스 변수

  • 클래스 인스턴스 변수를 생성하기 위해서는 @ 심볼을 이용한다. 그리고 객체가 아닌 클래스에서 정의해야한다.

  • 대조적으로 클래스 변수를 생성할 때는 @@ 심볼을 이용한다.

  • 그렇다면 이 둘 사이에는 어떠한 차이가 있는가?

    • 클래스 변수를 생성하면 루비는 해당 클래스와 그 하위클래스에서 사용할 수 있는 단 하나의 값을 생성한다.

    • 클래스 인스턴스 변수를 사용할 때는 각 클래스나 하위 클래스에 대해 별도의 값을 생성한다.

  • 내부적으로 루비는 클래스 변수와 클래스 인스턴스 변수를 RClass 구조체 내부에 있는 동일한 테이블에 저장한다.

클래스 변수를 가져오고 설정하기

  • 루비가 클래스 변수와 클래스 인스턴스 변수를 동일한 테이블에 저장한다는 것은 사실이다.

    • 그러나, 이 두가지 형태의 변수를 가져오거나 설정하는 방법은 매우 다르다.

  • 클래스 인스턴스 변수를 가져오는 방법은 너무 간단하다.

    • 클래스 인스턴스 변수를 가져오거나 설정할 때 루비는 대상 클래스에 해당하는 RClass 구조체에서 해당 변수를 조회한다.

  • 클래스 변수는 조금 복잡하다.

    • 먼저 현재 대상 클래스에서 요청한 클래스 변수를 찾는다. 만약 없으면 상위 클래스를 뒤지고.. 없으면 또 상위 클래스로 가서 더 이상 상위클래스가 없을 때 까지 찾아간다.

상수

  • 루비의 클래스에는 상수 또한 존재한다.

    • 웃긴건.. 말이 상수지 수정이 가능하다;;ㅋㅋ 다만 경고가 뜸

  • 즉 Rclass에 상수 테이블을 추가해야한다. 다시 한번 정의를 내려보자.

루비 클래스는 메서드 정의, 속성명, 상위 클래스 포인터, 그리고 상수 테이블을 포함하는 루비 객체다.

RClass 구조체의 실제

  • 지금까지 RClass에 어떤 정보들이 포함되어야 하는지를 알기 위해 개념적인 모델을 그리고, 완성했다. 이제는 루비가 클래스틑 나타내기 위해 사용하는 실제 구조체를 알아보자.

  • 루비는 RClass와 rb_classext_struct 라는 두 개의 개별 구조체를 이용해서 클래스를 표현한다.

    • 이 두 구조체는 RClass가 반드시 해당 rb_classext_struct를 가리키는 포인터를 포함해야 하기 때문에, 하나의 큰 구조체로 동작한다고 할 수 있다.

정리

루비 객체

  • 루비가 내부적으로 객체와 크래스를 어떻게 나타내는지 알게 되었다.

  • 루비는 RObject 구조체를 이용해서 직접 구현한 클래스나 루비 자체에서 미리 정의해놓은 몇 가지 클래스의 인스턴스를 나타낸다. RObject 구조체는 매우 간단하며, 클래스와 인스턴스 변수 값 테이블에 대한 포인터를 변수 개수와 함께포함한다. 이 구조체의 단순함은 루비 객체를 매우 간결하게 정의해준다.

  • 루비 객체의 정의는 아래와 같다.

모든 루비 객체는 클래스 포인터와 인스턴스 변수 배열의 조합이다.

루비 클래스

  • 루비 객체와 다르게 클래스는 단순하지 않다.

  • rb_classext_struct 구조체와 함께 동작하는 RClass 구조체는 많은 젖ㅇ보를 저장한다.

  • 루비 클래스의 정의는 아래와 같다.

루비 클래스는 메서드 정의, 속성명, 상위클래스 포인터, 상수 테이블을 포함하는 루비 객체다.

그림 5-3
그림 5-1
여기서 속성명이 빠져야한다...
메서드 테이블과 속성명
클래스 또한 Class 클래스의 객체다!!
루비의 클래스는 단일 상속을 받는다!
헷갈려~~
RClass의 개념적인 모습!
실제 RClass와 rb_classext_struct
일반 객체의 인스턴스 배열
Mathematician.class