본문 바로가기
[Python & Ruby]

[Python & Ruby] 객체와 변수

by Hevton 2020. 12. 27.
반응형

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