자본 엄.슴.
Ruby 접근 제어자, 상속 본문
접근 제어자
객체 지향 언어에서 접근 제어자는 매우 중요한 역할을 맡고 있다. 객체 외부에서 객체 내부의 요소에 접근을 허락할 것인지 제어해야 캡슐화와 은닉화가 잘 이루어진다. 루비의 접근 제어자는 3가지가 있다. public, protected, private이다.
먼저 public은 어디에서든지 호출할 수 있다. 그리고 protected는 해당 객체와 그 클래스를 상속 받은 자식 클래스에서만 사용 가능하다. 상속은 조금 뒤에 다룰 예정이다. 마지막으로 private는 오직 해당 객체 내부에서만 사용이 가능하다. 루비의 메서드는 기본적으로 public이기 때문에 어떤 제어자도 쓰지 않으면 어디에서든지 접근할 수 있다.
class Human
def initialize(name, age)
@name = name
@age = age
end
public
def eat
puts "맛있게 먹음!"
digest
end
private
def digest
puts "소화 시킴!"
end
end
noye = Human.new "NoYE", 18
noye.eat
결과
맛있게 먹음! 소화 시킴!
간단하게 전에 사용했던 Human 클래스를 변형해 보았다. 객체를 생성하고 eat 메서드를 호출한다. 이것은 eat 메서드가 public 접근 제어자를 쓰고 있기 때문에 가능하다. 그러나 private인 digest 메서드는 객체 외부에서 호출이 불가능하므로 eat 메서드에서 호출을 시켜준다.
상속
상속은 어떤 클래스가 다른 클래스의 멤버를 가져온 후 그 뒤에 변수나 메서드를 덧붙이는 것이라고 생각하면 된다. 이 상속이 왜 필요하느냐! 다음 코드를 보자.
class Dog
def initialize(sound)
@sound = sound
end
def scream
puts @sound
end
def walk
puts "걷는 중..."
end
end
class Tiger
def initialize(sound)
@sound = sound
end
def scream
puts @sound
end
def run
puts "달리는 중..."
end
end
class Bird
def initialize(sound)
@sound = sound
end
def scream
puts @sound
end
def fly
puts "나는 중..."
end
end
Dog, Tiger, Bird 클래스를 만들었다. 그런데 똑같은 코드가 너무 많이 보인다. initialize와 scream은 똑같이 생겼는데 굳이 이렇게 여러 번 번거롭게 작성해야 할까? 이럴 때를 위해 나온 것이 바로 상속이다. 상속을 할 때는 < 키워드를 사용한다. 상속을 하는 클래스를 부모 클래스 또는 슈퍼 클래스라고 부르고 상속을 받는 클래스를 자식 클래스 또는 서브 클래스라고 부른다. 자식 클래스는 부모 클래스의 멤버와 메서드를 그대로 사용할 수 있다는 장점이 있다. 위의 코드를 상속을 이용해서 고쳐보자.
class Animal
def initialize(sound)
@sound = sound
end
def scream
puts @sound
end
end
class Dog < Animal
def initialize(sound)
super(sound)
end
def walk
puts "걷는 중..."
end
end
class Tiger < Animal
def initialize(sound)
super(sound)
end
def run
puts "달리는 중..."
end
end
class Bird < Animal
def initialize(sound)
super(sound)
end
def fly
puts "나는 중..."
end
end
Animal 클래스를 새로 만들고 Dog, Tiger, Bird 클래스가 이것을 상속 받았다. 이제 이 클래스들은 scream 메서드를 선언하지 않았지만 Animal 클래스에 scream 메서드가 있기 때문에 그대로 사용할 수 있다. 그런데 initialize 안에 있는 super는 대체 뭐란 말인가? super는 슈퍼 클래스의 메서드를 똑같이 사용하고 싶을 때 쓴다. 나중에 오버라이딩을 할 때 유용할 때 이용할 것 같다.
객체를 생성해서 실행을 시켜보자
dog = Dog.new "멍멍"
dog.scream
dog.walk
결과
멍멍 걷는 중...
아주 잘 된다.
'Ruby' 카테고리의 다른 글
Ruby 모듈 (0) | 2019.01.31 |
---|---|
Ruby 싱글톤 메서드 (0) | 2019.01.30 |
Ruby 클래스, 객체 (0) | 2018.12.10 |
Ruby 함수 (0) | 2018.12.10 |
Ruby 입력, 출력 (0) | 2018.12.09 |