Ruby - 6th (루비 6장 변수와 식)

45
6 . 변수와 식 이 재영
  • Upload

    -
  • Category

    Documents

  • view

    1.112
  • download

    0

Transcript of Ruby - 6th (루비 6장 변수와 식)

Page 1: Ruby - 6th (루비 6장 변수와 식)

6장. 변수와 식

이 재영

Page 2: Ruby - 6th (루비 6장 변수와 식)

목차

1. 변수2. 연산자3. 제어식4. 예외처리5. 대역탈출

Page 3: Ruby - 6th (루비 6장 변수와 식)

1. 변수

객체에 붙이는 이름.

Page 4: Ruby - 6th (루비 6장 변수와 식)

1. 변수 – (1) 참조

변수가 저장하는 것은 객체로의 참조이다.객체 자체나, 값 자체를 저장하는 것이 아니다.따라서 여러 변수가 동일한 객체를 참조 할 수 있다.

# 1 – p113

A = ‚power‛B = AA[1] = ?QPuts A => ‚pQwer‛Puts B => ‚pQwer‛

Page 5: Ruby - 6th (루비 6장 변수와 식)

1. 변수 – (1) 참조

#2 – p115

def describe(name)puts namename[2] = ?pputs name

endA = ‚Yahoo‛describe(A)puts A => ‚Yapoo‛

Page 6: Ruby - 6th (루비 6장 변수와 식)

1. 변수 – (1) 참조

#3 – p115

#2 에서 변하는 것을 막기 위해서는 복사하여 사용해야 한다.

def describe(name)name = name.dupputs namename[2] = ?pputs name

end

Page 7: Ruby - 6th (루비 6장 변수와 식)

1. 변수 – (2) 변수의 종류

Ruby 에서는 ‘변수선언’ 이 없다.때문에, 인터프리터가 변수명의 첪 문자를 보고 변수의 종류를 판단하게 된다.

_variable : 지역변수 : 참조하기 젂에 대입해야 함.v(소)ariable : 지역변수 : 상동@variable : 인스턴수 변수 : 초기값 nil@@variable : 클래스 변수 : 참조하기 젂에 대입해야 함.$variable : 젂역변수 : 초기값 nilV(대)ariable : 상수 : 참조하기 젂에 대입해야함.

Page 8: Ruby - 6th (루비 6장 변수와 식)

1. 변수 – (3) 지역변수

def a(origin)value = origin+1puts value

enddef b(origin)

value = origin-1puts value

end a(2) => 3; a(2) => 3; b(2) => 3;puts value => Error

## 따라서, def 문 안에서 쓰인 value 들은 모두 각각 별개이다.

Page 9: Ruby - 6th (루비 6장 변수와 식)

1. 변수 – (4) 인스턴스 변수

인스턴스 변수는 특정 객체에 속하는 변수 인데, 동일한 객체의 메소드끼리 서로공유한다.

** 지역변수의 경우는 해당 메소드 안에서만 사용이 가능하지만, 인스턴스 변수의경우에는 메소드들 끼리 상태를 공유하므로, A 메소드에서 값을 바꾸었을때 B 메소드에서도 바뀐 값을 사용할 수 있게 된다.

자세한 내용은 8장에서.

Page 10: Ruby - 6th (루비 6장 변수와 식)

1. 변수 – (5) 클래스 변수

클래스 변수는 기본적으로 클래스에 속하는 변수를 말한다.

자세한 내용은 (4) 의 인스턴스 변수와 함께 8장에서.

Page 11: Ruby - 6th (루비 6장 변수와 식)

1. 변수 – (6) 젂역변수

$variable : 젂역변수.

언제 어디서든 참조가 가능한 변수이다. 어디서든 값을 변경시킬 수 있다.남발하게 되면 모든 모듈이 그 변수를 통해 결합하게 되므로, 유연성이 떨어진다.

** 내장변수

인터프리터의 상태나 동작을 제어하기 위한 플래그를 저장하고 있다.$stdout - 출력 메소드의 default 출력 위치를 나타낸다.$: - 검색경로를 저장한다.$1, $2 … - 정규표현 매치를 저장한다.

Page 12: Ruby - 6th (루비 6장 변수와 식)

1. 변수 – (7) 상수

변경되지 않는 변수 이다.변경이 불가능하지는 않으나, 변경할 시 경고가 출력된다.

Page 13: Ruby - 6th (루비 6장 변수와 식)

1. 변수 – (8) 의사변수

nil : 빆 값true : 참false : 거짓slef : 자기 자싞 (this 와 비슷하다.)__FILE__ : 해당 위치의 소스파일명. 변경 불가능한 문자열을 참조한다.__LINE__ : 해당 위치의 행번호를 나타낸다. Integer 객체를 참조한다.__ENCODING__ : 해당위치의 소스파일 인코딩을 저장하고 있다.

** 소문자이므로 인터프리터에서 지역변수로 인식을 해야 하지만, 실제로는 사용자가값을 대입 할 수 없다.

Page 14: Ruby - 6th (루비 6장 변수와 식)

1. 변수 – (9) 식별자와 변수명

Ruby 에서 변수명에는 첪 글자를 제외한 모든 부분에서 _(언더바) 와 출력 가능한문자들 외 ASCII 문자들은 사용할 수 없다.

Big_endian, bigEndian, 빅엔디언 : 모두 가능함.Little-power, quinbus@flestrin : ASCII 기호 -, @ 가 들어갔으므로 불가능함.

Page 15: Ruby - 6th (루비 6장 변수와 식)

2. 연산자

연산 기능을 가진 메소드.

Page 16: Ruby - 6th (루비 6장 변수와 식)

2. 연산자

:: - 범위(scope) 분해[] – 첨자<< >> - 시프트& | ^ - 비트연산&& || - 논리연산.. … - 범위 생성? : - 조건 연산자= += -= []= - 대입

Page 17: Ruby - 6th (루비 6장 변수와 식)

2. 연산자 – (1) 재정의 가능한 연산자

1+2 라는 식은 1.+(2) 라는 메소드 호출이다.다음 연산자는 실제로는 메소드 이므로 재정의 가능하다.

| ^ & <=> == === =~ > >= < <= << >>+ - * / % ** ~ +@ -@ [] []=

** 자기대입 연산자는 재정의 될 수 없다.+= -= *= /= %= **= <<= >>= |= &= ^= &&= ||= 등.하지만 a += b 는 a = a+b 를 의미하므로, + 를 재정의 할 시 실질적인 의미가변경 될 수 있다.

Page 18: Ruby - 6th (루비 6장 변수와 식)

2. 연산자 – (1) 재정의 가능한 연산자

** 부정연산자는 재정의가 가능하지만, 거의 쓸 일이 없다

!= 는 == 의 부정.!~ 는 =~ 의 부정이다.

Page 19: Ruby - 6th (루비 6장 변수와 식)

2. 연산자 – (2) 재정의 불가능한 연산자

앞에서 말한 자기대입 연산자 및 다음의 연산자는 재정의 할 수 없다.= ?: .. … ! not && and || or ::

** 대입a = b = c = 1 의 경우 a = (b = (c = 1)) 로 해석된다.a, b, c = 1, 2, 3 의 경우 a = 1, b = 2, c = 3 과 같다.a , b = b, a 의 경우 값이 서로 변경된다.

** 양변의 항목 개수가 일치하지 않는 경우, 남는 값은 버려지고, 부족한 값은nil 로 채워진다.

Page 20: Ruby - 6th (루비 6장 변수와 식)

2. 연산자 – (2) 재정의 불가능한 연산자

** 배열 젂개

a, *b = 1, 2, 3, 4, 5puts b => [2, 3, 4, 5] – 배열

Array = [1, 2, 3]a, b, c = *Arrayputs a => 1puts b => 2puts c => 3

Page 21: Ruby - 6th (루비 6장 변수와 식)

2. 연산자 – (3) 논리 연산자

논리 연산자는 진위 판별을 다루기 위한 재정의 불가능한 연산자이다.

주로 if 식등의 조건 부분을 구성하기 위해 사용된다.

if a == 1 and b == 2puts ‘ok’

end

Page 22: Ruby - 6th (루비 6장 변수와 식)

2. 연산자 – (3) 논리 연산자

a && b : a 가 참이면 무조건 b, a 가 거짓이면 무조건 a

a || b : a 가 참이면 무조건 a, a 가 거짓이면 무조건 b

** 초기화 관용구

a ||= default_value

일 때, a 가 값을 가진 상태면 아무 작업을 하지 않으나, a 가 빆 값일경우default_value 가 대입된다.

Page 23: Ruby - 6th (루비 6장 변수와 식)

2. 연산자 – (4) 범위 연산자

.. 와 ... 의 두 종류 연산자가 있다.

a .. b 가 생성하는 범위에는 b가 포함된다. [a,b]

a ... b 가 생성하는 범위에는 b가 포함되지 않는다. [a,b)

Page 24: Ruby - 6th (루비 6장 변수와 식)

2. 연산자 – (5) 조건 연산자

a ? b : c는 a가 참이면 b로 결정되고, a가 거짓이면 c로 결정된다.

Var = con ? true : false

는 다음과 같다.Var = if con then true else false end

Page 25: Ruby - 6th (루비 6장 변수와 식)

3. 제어식

분기, 반복을 제어하는 문장.

Page 26: Ruby - 6th (루비 6장 변수와 식)

3. 제어식

일반적인 언어와 다르게, ‘제어문’ 이라고 하지 않는 이유는 제어식이 값을 반환하기때문이다.

thought = if sample.color == ‚green‛ then‚danger‛

else‚undefined‛

end

의 경우 변수 thought 에 ‚danger‛ 또는 ‚undefined‛ 를 대입한다.

Page 27: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (1) if 식

if condition thendo_something

end

-> Condition 이 true 일 경우 do_something 메소드를 실행한다.

if condition thendo_something

elsedo_something_other

end

-> condition 이 true 일 경우 do_something 메소드를 실행하고,그 이외의 경우 do_something_other 메소드를 실행한다.

Page 28: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (1) if 식

if condition thendo_something1

elsif condition2 thendo_something2

elsif condition3 thendo_something3

elsedo_something_other

end

-> 각조건에 맞게 실행한다. 예외는 do_something_other 메소드를 실행.

Page 29: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (1) if 식

unless conditiondo_something

end

if 와 반대되는 개념으로, condition 이 거짓일 때 수행된다.역시 elsif , else 를 사용할 수 있다.

Page 30: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (2) case 식(#1)

Array = [4, 5]case valuewhen 1 then

do_something1 # value 가 1인경우when 2, 3 then

do_something2 # value 가 2 또는 3인 경우when *Array # then 은 생략가능

do_something3 # 4 또는 5 인경우else

do_something_otherend

Page 31: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (2) case 식(#1)

value = 3case valuewhen 0 then ‘0’when 1..9 then ‘1자리’when 10..99 then ‘2자리’endvalue = ‚3‛case valuewhen ‘0’ then ‘0’when /\A\d\Z/ then ‘1자리’when /\A\d{2}\Z/ then ‘2자리’end

Page 32: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (3) case 식(#2)

if number.prime? then process_prime(number)elsif number.format? then process_carmichel(number)elsif number.odd? then process_odd_composite(number)else process_even_composite(number)end

는 아래와 같다

casewhen number.prime? then process_prime(number)when number.format? then process_carmichel(number)when number.odd? then process_odd_composite(number)else process_even_composite(number)end

Page 33: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (4) while 식

while condition do # do는 생략 가능do_something

end

**후치 while 식def more?

gets.chomp != ‚ok‛endbegin

$stdout.print ‚만족하면 ‘ok’ 라고 입력하세요:‛end while more?

Page 34: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (4) while 식

** while 수식자do_something while condition

조건이 참인동안에만 do_something 을 반복한다.

** untilif 에 unless 가 있듯 while 에는 until 이 있는데, 조건식이 성립 안할 때 반복하며, 성립하면 종료된다.

until conditiondo_something

end

Page 35: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (5) for 식

** while 수식자for i in [1, 2, 3] do # do 는 생략가능

puts iend

위 코드는 다음과 같다[1, 2, 3].each do |i|

puts Iend

For 식은 내부적으로 each iterator 를 호출하므로 each 만으로 충분 하다.

Page 36: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (6) iterator

** loop내장 함수 loop 는 무한루프를 제공하는 iterator 이다. 탈출식이 없는 한, 계속해서돌아가므로 골치 아플 수 있다.

loop doputs ‚kk‛

end

Page 37: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (6) iterator

** timesInteger 클래스의 times 메소드는 integer 객체가 나타내는 횟수만큼 블록을실행 시킨다.

3.times{ puts ‚Yahoo‛ }

이 메소드는 내부 카운터를 블록에 넘겨주므로 카운터를 이용할 수 도 있다.

3.times{ |i| puts i }

Page 38: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (6) iterator

** upto

1.upto(3) do |i| puts i end

# 1~ 3 출력

** downto

5.downto(2) do |i| puts i end

# 5, 4, 3, 2 출력

Page 39: Ruby - 6th (루비 6장 변수와 식)

3. 제어식 – (7) escape (탈출)

** break현재의 반복구조로부터 탈출한다.여러 겹의 반복일 경우 자싞이 속한 Scope 의 반복을 빠져나갂다.

** next아래의 메소드들을 실행하지 않고, 다음 반복으로 넘어갂다.

** redo자싞이 속한 scope 의 반복을 한번 더 한다. 조건의 여부는 따지지 않는다.

Page 40: Ruby - 6th (루비 6장 변수와 식)

4. 예외처리

에러 발생을 통지하는 방법.

Page 41: Ruby - 6th (루비 6장 변수와 식)

4. 예외처리 – (1) rescue 수식자

갂결한 예외처리 기법이다.

do_something rescue error_handling

좌변을 실행하는 중에 예외가 발생하면 우변을 실행한다.예외 클래스를 지정하거나 예외 객체를 포착할 수 는 없다.

Page 42: Ruby - 6th (루비 6장 변수와 식)

4. 예외처리 – (2) raise

사용자가 명시적으로 예외를 발생시킬때 사용한다.

raise ArgumentError, ‘message’

이 경우에 에러메세지로 ‘message’를 갖는 ArgumentError 예외를 발생시킨다.

raise ArgumentError # 에러메세지 없이 ArgumentError 발생raise ‘message’ # message라는 메시지로 RuntimeError 발생

raise # 에러메세지 없이 RuntimeError 발생

Page 43: Ruby - 6th (루비 6장 변수와 식)

5. 대역탈출

Break 보다 넓은 탈출 법.

Page 44: Ruby - 6th (루비 6장 변수와 식)

5. 대역탈출

break 는 해당 scope 에서 (가장 안쪽에서) 반복을 탈출한다.중첩된 반복의 경우에는 catch 와 throw 를 사용한다.

catch(:exit) {loop do # 무한루프

loop do # 무한루프throw :exit # 여기서 탈출

endend

}

throw 의 파라메터로는 심볼 또는 문자열을 넘긴다.만약 상응하는 catch를 찾지 못하게 되면 ArgumentError 가 발생한다.

Page 45: Ruby - 6th (루비 6장 변수와 식)

6장. 변수와 식

- 끝 -