레이블이 공부 - 루비인 게시물을 표시합니다. 모든 게시물 표시
레이블이 공부 - 루비인 게시물을 표시합니다. 모든 게시물 표시

2016년 1월 22일 금요일

루비 - 2.1 : Class를 이용한 간단한 싱글톤 예제


간단한 싱글톤 디자인패턴 구현

<Tutorial-01-Class-Singleton.rb>
class MySingleton
 private_class_method :new # 객체 생성을 위한 유일한 method인 new 를 private 으로 정의

 @@singleton = nil

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

 def MySingleton.create(name, age)  # 싱글톤 객체를 생성하기 위한 클래스 메서드를 정의
  @@singleton = new(name, age) unless @@singleton
  @@singleton
 end

 def getMySingleton
  puts "My name is #{@name} and I am #{@age.to_s} years old"
 end

end

singletonTest1 = MySingleton.create("John lennon", 32)
singletonTest2 = MySingleton.create("Metalica", 33)

singletonTest1.getMySingleton  # 싱글톤 객체 생성, 유일한 객체
singletonTest2.getMySingleton  # 객체 생성 시도, 이미 생성된 객체 반환



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}세 입니다."


2016년 1월 14일 목요일

루비 공부 참조 사이트

루비 - 1 : 설치 및 루비의 기본중의 기본


루비(Ruby) 설치

[일단 루비를 설치 하자]

 - 루비 설치 url : https://www.ruby-lang.org/ko/documentation/installation/#rubyinstaller
 - 설치방법 : 윈도우용 RubyInstaller 를 다운 받아서 실행
 - 텍스트 에디터로는 아직 뭐가 좋은지 잘 모르겠으니 일단 sublime을 쓰도록 하자
 - Sublime text 설치 url : http://www.sublimetext.com/2

 *설치 시 command line 명령어가 바로 먹도록 체크하는 박스를 꼭 체크하도록!


[루비 Command Line 명령어 (수시로 업데이트)]

 - ruby xxxx.rb : 작성된 루비 프로그램을 실행
 - irb : 루비 프롬프트 컴파일러


[루비 프로그램 작성]

루비 프로그램은 .rb 확장자로 된 소스파일을 가진다.
적절한 개발 Tool로 소스코드를 작성하여 command line 에서 'ruby xxx.rb'로 실행


루비 기본중의 기본

<Tutorial-00-Basic.rb>

# 루비 기본 중의 기본

# 1. 주석은 #(샾) 으로 시작

puts '이거슨 기본 출력 입니다.'
puts '한줄 입력 하는건 그냥 입력하면 되고,
개행은 그냥 엔터쳐서 입력하면 됩니다.'
puts ('함수 인자는 \'(\' 와 \')\' 안에다 써넣어야 하는데 생략도 가능합니다.')
puts '한줄에 하나의 표현식이라면 끝에 ;(세미콜론)을 생략할 수 있다.'

# 2. '작은따옴표'와 "큰따옴표" 차이점
$global = 'GLOBAL VARIABLE'
localV = 'LOCAL VARIABLE'
puts '작은 따옴표는 #$global 이거든 #{$global} 이거든 동작하지 않는다.'
puts "큰 따옴표는 #$global 이거도 #{$global} 이거도 잘 동작한다."
puts "#{$global} 은 #$global 이 가능하지만 #{localV} 는 #localV 가능하지 않다."
# $, @, @@ 등의 전역/인스턴스/클래스 변수는 중괄호 생략이 가능

# 3. 변수, 메소드 대소문자 구별 사용 원리
#def ThisIsFunc  # 함수 에러
def thisIsFunc
 thisIsLocalVariable = 0
 _thisIsLocalVariable = 0
# ThisIsLocalVariable = 0  # 지역변수 에러

 puts "이건 당연히 가능"
 puts thisIsLocalVariable
 puts _thisIsLocalVariable
 puts "지역변수, arguments, 메서드 이름은 반드시 소문자나 밑줄(_)로 시작해야 한다."
 puts "전역 변수는 $로 시작하고, 인스턴스 변수는 @로 시작하며, 클래스 변수는 @@로 시작한다."
 puts "클래스 이름, 모듈 이름, 상수는 반드시 대문자로 시작해야 한다."
end

#ThisIsFunc  # 함수호출 에러
thisIsFunc

# 4. 배열
thisArray = [0,1,2,3,4,5]
thisArray.each { |arr|
 puts "{}를 이용한 배열 값들 : #{arr}"
}
thisArray.each do |arr|
 puts "do end 를 이용한 배열 값들 : #{arr}"
end

wordArray = %w{유용한 팁 단어 배열을 쉽게 만들기}
wordArray.each do |arr|
 puts "\%w를 이용한 배열 값들 : #{arr}"
end

# 5. 분기문
if false
 puts "분기문 여긴 안들어옴"
elsif true
 puts "분기문 여긴 들어오지"
else
 puts "여긴 절대 들어올 일이 없지"
end

if true or false
 puts "true or false 니까 true"
elsif true and false
 puts "true and false 니까 false"
else
 puts "여긴 절대 안들어옴"
end

# 6. 반복문
while false
 # do nothing
end

while ((line = gets.chomp) != 'end')
 puts line.downcase 
end

# 7. 구문 변경자
valueTest1 = 3001
valueTest2 = 2999

puts "valueTest1(#{valueTest1}) : value가 3000보다 크면 출력" if valueTest1 > 3000
puts "valueTest2(#{valueTest2}) : value가 3000보다 크면 출력" if valueTest2 > 3000

# 8. 블록
#{puts "앞선 예에서와 같이 do~end 와 \{~\} 는 블록"}
#do
#    puts "이것도 코드 블록이다."
#    puts "이것도 코드 블록이다."
#end
 # 중괄호는 do/end 쌍보다 높은 우선순위를 갖는다.
# 한 줄의 블록에는 중괄호를, 여러 줄의 블록에는  do/end 쌍을 사용하는 것이 루비의 code convention 이다.

# 9. 해쉬 {'key' => 'value'}, 자바스키립트의 object 개념
map = {'첼로' => '현악기',
  '클라리넷' => '관악기',
  '드럼' => '타악기'}
puts map['첼로'].to_s + map['클라리넷'].to_s + map['드럼'].to_s + map['피아노'].to_s # map['피아노']는 nil을 반환

hashInstance = Hash.new('기본 value를 세팅')
puts hashInstance['nothing']