루비에서 인스턴스 변수는 디폴트가 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 |