2016년 1월 15일 금요일

루비 - 2 : Class의 이해


루비 클래스 샘플 코드

<Tutorial-01-Class.rb>

# 1. class 정의하기
class Song  #class 이름은 대문자로 시작하도록.

 def initialize(name, artist, duration)
  @name = name  # class의 멤버변수는 @xxx 형태
  @artist = artist
  @duration = duration
  @plays = 0
 end

 def getSong
  "my name is #@name and my nick name is #@artist, i love number #@duration"
 end

 def getSing
  'my name is #@name and my nick name is #@artist, i love number #@duration'
 end

end

song = Song.new('beatles', 'john lenon', 300);

puts song.getSong # 출력: my name is beatles and my nick name is john lenon, i love number 300
puts song.getSing # 출력: my name is #@name and my nick name is #@artist, i love number #@duration

# song.play 함수는 지금 이 시점에서는 정의되어있지 않기 때문에 compile error

# 2. 클래스변수의 이해 @@XXX
class Song   # Song 클래스 정의 추가
 @@plays = 0  # class 변수 <- Song 클래스의 모든 객체가 동일하게 사용
     # class 변수는 사용하기 전 반드시 초기화되야 함
 def play
  @plays += 1
  @@plays += 1
  "This song: #@plays plays. Total #{@@plays} plays."
 end
end

puts song.play   # @@plays 는 1

song2 = Song.new("meatalica", "daumdaum", 200)

puts song2.play  # @@plays 는 2

# 3. 클래스 메소드의 이해 
class Song
 # 클래스 메소드 정의방법 1
 def Song.classMethod1
  puts "This is class method 1 for Song class"
  
 end

 # 클래스 메소드 정의방법 2
 def self.classMethod2
  puts "This is class method 2 for Song class"
  
 end

 # 클래스 메소드 정의방법 3
 class <<self
  def classMethod3
   puts "This is class method 3 for Song class"
  end
 end

end

songClassMethodTest = Song.new("hello", "world", 100)

Song.classMethod3
Song.classMethod2
Song.classMethod1

# songClassMethodTest.Song.classMethod2  compile Error
# songClassMethodTest.classMethod2   compile Error

# 4. 클래스 접근제어
class Song
 public :getSong   # 기존 public, 변동 없음
 private :getSing, :play # 기존 public 을 private 으로
end

puts song.getSong # public 접근제어라서 함수 호출 가능
# puts song.getSing  클래스 접근제어를 변경해서 이제는 함수호출 불가

puts "////////////////////////////////////////////////////////
"

# 5. getter setter 
class Human
 attr_reader :name, :age, :gender # 멤버변수 getter

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

human = Human.new("이승철", 50, "male")
puts "제 이름은 #{human.name} 이고 나이는 #{human.age}세 입니다."

class Human2
 attr_writer :name, :age, :gender # 멤버변수 setter
          # xxx= 이라는 함수를 내부적으로 생성
          # 객체.xxx = yyy 로 함수 호출 가능
 def name
  @name
 end

 def age
  @age
 end

 def gender
  @gender
 end
end

human2 = Human2.new
human2.name = "이승환"
human2.age = 60
human2.gender = "남"
puts "제 이름은 #{human2.name} 이고 나이는 #{human2.age}세 입니다."

class Human3
 attr_accessor :name, :age, :gender # 멤버변수 getter, setter
end

human3 = Human3.new
human3.name = "김완선"
human3.age = 80
human3.gender = "여"
puts "제 이름은 #{human3.name} 이고 나이는 #{human3.age}세 입니다."


댓글 없음:

댓글 쓰기