Class
Class
정의
클래스 명은 영문 대문자로 시작해야한다.
인스턴스
(인스턴스) 메소드 = 클래스 정의 내에 정의한 메소드는 해당 클래스의 인스턴스로 호출될 수 있다.
인스턴스 생성 / 호출
class는 상속하거나 상속 될 수 있다. 루비는 기본형이 존재하지 않고 모든 것이 객체이다.
1과 같은 숫자나 true/false와 같은 진릿 값도 객체이다. 객체이기 때문에 메소드도 호출 할 수 있다.
문자열, 수치 뿐만 아니라 true/false, nil과 같은 객체에도 클래스가 존재한다. Object의 클래스의 자식 관계로 구성된다.
BasicObject가 최상위 클래스이다.
변수와 상수
지역변수
스코프(참조 가능 범위)가 가장 좁은 종류의 변수다. 지역 변수명은 ruby
나 _ruby
처럼 첫글자는 소문자 영어 또는 언더바여야한다.
블록
메소드 정의
클래스/모듈 정의
톱 레벨
스코프 밖에 있는 지역변수를 참조하면 에러가 발생한다. 블록 안이면 블록 밖에서 정의된 지역 변수를 참조할 수 있지만, 반대로 블록안에서 정의된 지역 변수는 블록 밖에서 참여할 수 없다.
전역변수($)
어디에서든 참조 및 변경이 가능한 변수이다. 프로그램 규모가 커지면 커질수록 전역 변수가 존재하는 코드는 해석이 어려워진다.
정말로 필요한 경우가 아니라면 사용을 자제하는 것이 좋다.
$undefined
와 같이 존재하지 않는 전역변수를 참조하면 nil
이 반환된다.
인스턴스 변수(@)
인스턴스 내에서만 참조할 수 있는 변수이다. 이것을 사용해서 객체의 상태를 저장할 수 있다. 외부에서 인스턴스 변수에 접근하려면 별도의 메소드를 정의해야한다.
설명을 위해서 메소드를 정의했으나 실제로는 attr_accessor
를 이용한다.
를 하면 Ruler#length=라는 인스턴스 변수가 정의된다.
클래스 변수(@@)
클래스와 해당 인스턴스를 범위로 하는 변수이다.
클래스 변수는 클래스 정의 안이나 클래스 메소드에서 참조할 수 있다.
self
self는 인스턴스를 참조한다. 메소드 내부에서 receiver를 생략하면 default로 self가 리시버가 된다.
초기화(생성자)
인스턴스를 생성할 때 인스턴스 초기화가 필요한 경우가 있다. 이때 initialize
메소드를 정의하면 된다.
Create an instance of class .new
클래스 메소드
클래스 메소드는 메소드명 앞에 self
를 붙여서 정의한다.
클래스 메소드 안에 있는 self는 해당 메소드가 속해 있는 클래스를 가리킨다. 클래스 메소드는 클래스 명으로 접근 할 수 있다.
Inheritance (상속) <
<
<
말고도 Class.new
에서는 인수에 상속하고 싶은 부모 클래스를 지정하면 된다.
상속된 함수나 변수를 override할 수 있다.
오버라이드
super 클래스에서 이미 정의된 메소드를 sub 클래스에서 다시 정의하는 것을 메소드 오버라이드라고한다.
super
super는 부모클래스(super class)에 정의되어있는 initialize, 메소드를 호출할 수 있다.
Public and Private
public
: allow for an interface with the rest of the program( This method can be called from outside the class )private
: for your classes to do their own work undisturbed( This method can't!)
attr_reader
/ attr_writer
/attr_accessor
attr_reader
/ attr_writer
/attr_accessor
attr_reader
: to access a variableattr_writer
: to change itattr_accessor
: to make a variable readable and writeable in one fell swoop
That name=
allowed to put an = sign in a method name.
module
인스턴스화 할 수 없는 클래스와 같은 것이다.
ModuleName규칙
-모듈은 시작할때 대문자! ex)Math -모듈의 constant는 모든 문자를 대문자로 ex)PI
내포한 클래스나 모듈은
::
를 통해서 접근할 수 있다.
모듈 내에서도 메소드를 정의할 수 있다. 그러나 클래스에 정의한 메소드랑은 다른 용도로 사용된다.
특정 메소드를 인스턴스 메소드로 포함
특정 객체의 메소드로 포함
모듈 함수 사용
--require
: already present in the interperter
Mixin
: when module is used to mix additional behavior and information into a class
include
: mixes a module’s methods( any class that includes a certain module can use those module's methods!)
extend
: mixes a module’s methods at the class
Last updated