Python :
class C(object):
def __init__(self, v):
self.value = v
c1 = C(10)
print(c1.value)
Output :
10
c1의 인스턴스 변수 value의 값을 읽어온 것.
이렇게 외부에서 인스턴스 변수에 직접 접근할 수 있음.
(파이썬에서는 인스턴스 외부나 내부나 상관없이 기본적으로 인스턴스 변수에 접근 가능)
Ruby :
동일하게 구현해보면 에러가 발생한다.
class C
def initialize(v)
@value = v
end
end
c1 = C.new(10)
p c1.value # ERROR
루비에서는, 이렇게 외부에서 인스턴스 변수에 직접 접근할 수 없다.
다시말해서, 파이썬에서 '인스턴스를 가리키는 변수에 점을 찍고 그 인스턴스 안의 인스턴스 변수에 접근하는 것'이 루비에서는 허용되지 않는다. 메소드를 통해 접근해야한다.
class C
def initialize(v)
@value = v
end
def getValue()
return @value
end
def setValue(v)
@value = v
end
end
c1 = C.new(10)
p c1.getValue()
c1.setValue(20)
p c1.getValue()
위처럼 해줘야한다.
루비에서는 꼭 이렇게 해줘야만 하지만, 이렇게 getter setter 메소드를 정의해주는 게 다른 언어들을 포함해서 전체적인 프로그래밍 습관에서도 좋다.
알게된 점:
기본적으로 파이썬에서는 인스턴스 외부에서도 인스턴스변수값에 직접 접근할 수 있는데,
루비에서는 인스턴스 외부에서 인스턴스변수값에 직접 접근할 수 없다(이 때, 메소드를 통해야 인스턴스 변수에 접근할 수 있다).
루비에서는 외부에선 메소드를 통해 간접적으로 인스턴스 변수에 접근해야한다.
참고 -> 클래스 안의 함수를 메소드라고 한다.
위에서
파이썬에서는 외부에서도 인스턴스 변수에 직접 접근할 수 있다고 했고, 루비에서는 외부에서 인스턴스 변수에 직접 접근할 수 없다고 했다.
그래서 메소드를 통해 인스턴스 변수에 접근하는 방법을 구현해봤다.
하지만 getter setter 방법 말고도, 루비에서 인스턴스 외부에서 인스턴스 변수에 직접 접근할 수 있는 방법이 있다.
그리고 파이썬에서 인스턴스 외부에서 인스턴스 변수에 직접 접근할 수 없도록 하는 방법도 있다.
그럼 이제는 반대로, 파이썬에선 외부에서 인스턴스 변수에 직접 접근하지 못하도록 막고, 루비에서는 외부에서 인스턴스 변수에 직접 접근할 수 있는 방법을 알아보자.
Python :
class C:
__va = 20
a = __va
def __init__(self, v):
self.__value = v
def printx(self):
return self.__value
c1 = C(10)
# print(c1.__value) # Error
print(c1.printx()) # Well
# print(c1.__va) # Error
print(c1.a) # Well
인스턴스 변수명 맨 앞에 언더바 두개를 넣어주면, 인스턴스 외부에서 직접 접근할 수 없는 변수가 된다.
Ruby :
class C
attr_reader :value # 읽기 가능한 '속성'으로 지정하겠다.
attr_writer :value # 쓰기 가능한 '속성'으로 지정하겠다.
# attr_accessor :value 위 두 줄과 같은 기능
def initialize(v)
@value = v
end
def print()
p @value
end
end
c1 = C.new(10)
p c1.value
c1.value = 20
p c1.value
+ 외부에서 접근 가능한 인스턴스 변수를 '속성'(attribute)이라고 한다.
출처 - opentutorials.org/
'[Python & Ruby]' 카테고리의 다른 글
[Python & Ruby] 클래스 멤버 (0) | 2020.12.31 |
---|---|
[Python & Ruby] 상속 (0) | 2020.12.28 |
[Python & Ruby] 클래스/객체 생성 (0) | 2020.12.24 |
[Python & Ruby] 객체 지향 프로그래밍 (0) | 2020.12.22 |
[Python & Ruby] Module (0) | 2020.12.20 |