Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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. 10. 15:28

클래스와 객체는 객체 지향 프로그래밍 언어에서 사용한다. 객체 지향을 한 마디로 말하자면 실제 세계를 프로그램에 대입한 것이다. 객체 지향의 특징으로는 상속, 캡슐화, 다형성, 추상화가 있는데 지금은 객체 지향 보다는 루비의 클래스에 대해 다루는 자리이므로 가볍게 패스한다.

클래스

클래스를 직접 만들 수도 있지만 기본적으로 지원하는 클래스도 있다. 문자열, 정수, 해쉬, 배열 등등... 이것들은 그냥 잘 사용하면 되고 이번에는 클래스를 한 번 만들어보도록 하자. 클래스는 간단하게 만들 수 있다. class 키워드만 사용하면 된다. 다만 클래스의 이름의 첫 번째 글자는 반드시 대문자여야 한다는 규칙이 있다.

class Human
    def initialize(name, age)
        @name = name
        @age = age
    end
end

Human 클래스를 만들었다. 그런데 initialize라는 이상한 함수가 하나 보인다. initialize는 인스턴스를 생성할 때 실행되는 생성자 같은 함수이다. 그리고 initialize 안에 있는 문장들은 인스턴스를 생성할 때 값을 받아서 인스턴스 변수에 대입한다는 뜻이다. @으로 시작하는 변수가 바로 인스턴스 변수이다. 인스턴스 변수는 인스턴스 내에 있는 변수라고 생각하면 된다.


루비에는 클래스 변수도 있는데 클래스 변수는 인스턴스 변수와 달리 해당 클래스의 모든 인스턴스가 공유한다. 타 언어의 static으로 보면 될 것 같다. 사용할 때는 변수 앞에 @@ 키워드를 붙이면 된다.

class Human
    @@num = 0

    def initialize(name, age)
        @num = @@num += 1
        @name = name
        @age = age
    end
end

이렇게 코드를 작성하면 Human 인스턴스를 생성할 때마다 num 변수가 1부터 차례대로 대입된다.

객체

클래스 코드를 작성했으니 인스턴스를 생성할 차례다.

noye = Human.new "NoYE", 18

객체를 만들었다. 이제 noye 변수는 name과 age 변수를 가진 인스턴스이다. 객체를 생성할 때는 [객체이름.new]의 형식으로 생성할 수 있다. new 뒤에는 initialize의 인자를 넣는다.


그런데 인스턴스의 변수의 값을 가져오거나 수정하고 싶으면 어떻게 해야 할까? 속성을 사용하면 가능하다. 나중에 다루겠지만(아마?) 루비 변수는 기본적으로 private 접근 제한자를 가진다. 그래서 객체 외부에서 직접 접근할 수 없다. 그래서 다음과 같이 속성을 사용해야 한다.

class Human
    attr_writer :name
    attr_reader :name
    attr_accessor :age

    def initialize(name, age)
        @name = name
        @age = age
    end

end

noye = Human.new "NoYE", 18

noye.name = "Kim"
noye.age = 20

puts "#{noye.name}: #{noye.age}"

결과

Kim: 20

처음 Human 클래스에서 attr_writer, attr_reader, attr_accessor가 추가되었다. 이것이 바로 속성이다. attr_writer는 객체 외부에서 인스턴스 변수를 수정할 수 있게 한다. attr_reader는 객체 외부에서 인스턴스 변수의 값을 받을 수 있게 한다. 그리고 마지막으로 attr_accessor는 이 두 가지를 동시에 할 수 있다. 이제 우리는 루비의 속성을 사용함으로써 객체의 인스턴스 변수에 접근할 수 있다!

'Ruby' 카테고리의 다른 글

Ruby 싱글톤 메서드  (0) 2019.01.30
Ruby 접근 제어자, 상속  (0) 2018.12.11
Ruby 함수  (0) 2018.12.10
Ruby 입력, 출력  (0) 2018.12.09
Visual Studio Code에서 Ruby 사용하기  (0) 2018.12.09
Comments