본문 바로가기

ruby

instance variable encapsulation

루비에서 인스턴스 변수는 디폴트가 private이다. 그래서 접근하려면 attr_reader, attr_writer, attr_accessor로 변수를 지정해줘야 외부에서 접근 가능하다.

 

여기에서는 인스턴스 변수 캡슐화에 대해서 알아보자.

 

class InstanceAi
  attr_reader :data
  def initialize(data)
    @data = data
  end
  
  def plus(v)
    data + v
  end
end

ins = InstanceAi.new(1)
puts ins.data
puts ins.plus(2)

##### ===> result
1
3

 

1. attr_reader, attr_writer, attr_accessor

이 3개의 예약어는 인스턴스 변수에 wrapper method를 제공해준다.

다른 표현으로는 encapsulating method라고 함.

1) attr_reader

자바의 getter와 동일한 역할을 한다. 

2) attr_writer

자바의 setter와 동일한 역할을 한다.

3) attr_accessor

자바의 getter와 setter 역할을 동시에 하게 해 준다.

 

2. 접근

instance.instanceVariable

 

3. 내부 클래스에서 접근

내부 클래스에서도 @data로 직접 접근하는 것보다 wrapper method를 통해 접근하는 것이 더 좋다.

1) 직접 접근하면 안 좋은 이유

특정 인스턴스 변수의 내용이 항상 같은 의미로 사용되지 않는다.

그 변수에 어떠한 비즈니스 로직이 들어가는 경우가 존재한다. 그럴 때 직접 접근을 한다면, 수정을 해야 할 때 모든 부분을 수정해야 할 것이다.

그러므로 처음부터 wrapper method로 접근하는 것이 확장성에서 더 좋은 코드이다.

# 모든 @data 인스턴스 변수에 +2를 default로 추가한다고 가정

# 안 좋은 경우
def plus(v)
  @data + 2 + v
end

# 좋은 경우
def plus(v)
  data + v
end

def data
  @data + 2
end

 

4. 사용방법

개방 폐쇄 원칙에 따라 확장에는 열려 있고 수정에는 닫혀 있어야 한다. 

즉, 특별한 상황이 아니라면 attr_reader 만 사용하길 바란다.

'ruby' 카테고리의 다른 글

DI(Dependency Injection)  (0) 2021.12.30
상속 vs 믹스인(mixin)  (0) 2021.12.28
블록  (0) 2021.12.26
루비에서 람다식이란  (0) 2021.12.26
ruby 특징  (0) 2021.12.26