Notice
Recent Posts
Recent Comments
Link
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

자본 엄.슴.

Ruby 접근 제어자, 상속 본문

Ruby

Ruby 접근 제어자, 상속

자본없음 2018. 12. 11. 22:38

접근 제어자

객체 지향 언어에서 접근 제어자는 매우 중요한 역할을 맡고 있다. 객체 외부에서 객체 내부의 요소에 접근을 허락할 것인지 제어해야 캡슐화와 은닉화가 잘 이루어진다. 루비의 접근 제어자는 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
Comments