SlideShare una empresa de Scribd logo
1 de 45
6장. 변수와 식


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




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

# 1 – p113

A = ‚power‛
B=A
A[1] = ?Q
Puts A => ‚pQwer‛
Puts B => ‚pQwer‛
1. 변수 – (1) 참조
#2 – p115

def describe(name)
    puts name
    name[2] = ?p
    puts name
end
A = ‚Yahoo‛
describe(A)
puts A => ‚Yapoo‛
1. 변수 – (1) 참조
#3 – p115

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

def describe(name)
    name = name.dup
    puts name
    name[2] = ?p
    puts name
end
1. 변수 – (2) 변수의 종류
Ruby 에서는 ‘변수선언’ 이 없다.
때문에, 인터프리터가 변수명의 첪 문자를 보고 변수의 종류를 판단하게 된다.

_variable : 지역변수 : 참조하기 젂에 대입해야 함.
v(소)ariable : 지역변수 : 상동
@variable : 인스턴수 변수 : 초기값 nil
@@variable : 클래스 변수 : 참조하기 젂에 대입해야 함.
$variable : 젂역변수 : 초기값 nil
V(대)ariable : 상수 : 참조하기 젂에 대입해야함.
1. 변수 – (3) 지역변수
def a(origin)
    value = origin+1
    puts value
end
def b(origin)
    value = origin-1
    puts value
end
a(2) => 3; a(2) => 3; b(2) => 3;
puts value => Error

## 따라서, def 문 안에서 쓰인 value 들은 모두 각각 별개이다.
1. 변수 – (4) 인스턴스 변수
인스턴스 변수는 특정 객체에 속하는 변수 인데, 동일한 객체의 메소드끼리 서로
공유한다.

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

자세한 내용은 8장에서.
1. 변수 – (5) 클래스 변수
클래스 변수는 기본적으로 클래스에 속하는 변수를 말한다.

자세한 내용은 (4) 의 인스턴스 변수와 함께 8장에서.
1. 변수 – (6) 젂역변수
$variable :   젂역변수.

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

** 내장변수

인터프리터의 상태나 동작을 제어하기 위한 플래그를 저장하고 있다.
$stdout - 출력 메소드의 default 출력 위치를 나타낸다.
$: - 검색경로를 저장한다.
$1, $2 … - 정규표현 매치를 저장한다.
1. 변수 – (7) 상수
변경되지 않는 변수 이다.
변경이 불가능하지는 않으나, 변경할 시 경고가 출력된다.
1. 변수 – (8) 의사변수
nil :빆값
true : 참
false : 거짓
slef : 자기 자싞 (this 와 비슷하다.)
__FILE__ : 해당 위치의 소스파일명. 변경 불가능한 문자열을 참조한다.
__LINE__ : 해당 위치의 행번호를 나타낸다. Integer 객체를 참조한다.
__ENCODING__ : 해당위치의 소스파일 인코딩을 저장하고 있다.


** 소문자이므로 인터프리터에서 지역변수로 인식을 해야 하지만, 실제로는 사용자가
    값을 대입 할 수 없다.
1. 변수 – (9) 식별자와 변수명
Ruby 에서 변수명에는 첪 글자를 제외한 모든 부분에서 _(언더바) 와 출력 가능한
문자들 외 ASCII 문자들은 사용할 수 없다.

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




 연산 기능을 가진 메소드.
2. 연산자
:: - 범위(scope) 분해
[] – 첨자
<< >> - 시프트
& | ^ - 비트연산
&& || - 논리연산
.. … - 범위 생성
? : - 조건 연산자
= += -= []= - 대입
2. 연산자 – (1) 재정의 가능한 연산자
1+2 라는 식은 1.+(2) 라는 메소드 호출이다.
다음 연산자는 실제로는 메소드 이므로 재정의 가능하다.

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


** 자기대입 연산자는 재정의 될 수 없다.
+= -= *= /= %= **= <<= >>= |= &= ^= &&= ||= 등.
하지만 a += b 는 a = a+b 를 의미하므로, + 를 재정의 할 시 실질적인 의미가
변경 될 수 있다.
2. 연산자 – (1) 재정의 가능한 연산자
** 부정연산자는 재정의가 가능하지만, 거의 쓸 일이 없다

!= 는 == 의 부정.
!~ 는 =~ 의 부정이다.
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 로 채워진다.
2. 연산자 – (2) 재정의 불가능한 연산자
** 배열 젂개

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

Array = [1, 2, 3]
a, b, c = *Array
puts a => 1
puts b => 2
puts c => 3
2. 연산자 – (3) 논리 연산자
논리 연산자는 진위 판별을 다루기 위한 재정의 불가능한 연산자이다.

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

if a == 1 and b == 2
     puts ‘ok’
end
2. 연산자 – (3) 논리 연산자
a && b : a 가 참이면 무조건 b, a 가 거짓이면 무조건 a

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

** 초기화 관용구

a ||= default_value
일 때, a 가 값을 가진 상태면 아무 작업을 하지 않으나, a 가 빆 값일경우
default_value 가 대입된다.
2. 연산자 – (4) 범위 연산자
.. 와 ... 의 두 종류 연산자가 있다.

a .. b 가 생성하는 범위에는 b가 포함된다. [a,b]
a ... b 가 생성하는 범위에는 b가 포함되지 않는다. [a,b)
2. 연산자 – (5) 조건 연산자
a?b:c
는 a가 참이면 b로 결정되고, a가 거짓이면 c로 결정된다.

Var = con ? true : false
는 다음과 같다.
Var = if con then true else false end
3. 제어식




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

thought = if sample.color == ‚green‛ then
     ‚danger‛
else
     ‚undefined‛
end


의 경우 변수 thought 에 ‚danger‛ 또는 ‚undefined‛ 를 대입한다.
3. 제어식 – (1) if 식
if condition then
     do_something
end
-> Condition 이 true 일 경우 do_something 메소드를 실행한다.

if condition then
     do_something
else
     do_something_other
end
-> condition 이 true 일 경우 do_something 메소드를 실행하고,
그 이외의 경우 do_something_other 메소드를 실행한다.
3. 제어식 – (1) if 식
if condition then
      do_something1
elsif condition2 then
      do_something2
elsif condition3 then
      do_something3
else
      do_something_other
end


-> 각조건에 맞게 실행한다. 예외는 do_something_other 메소드를 실행.
3. 제어식 – (1) if 식
unless condition
    do_something
end


if 와 반대되는 개념으로, condition 이 거짓일 때 수행된다.
역시 elsif , else 를 사용할 수 있다.
3. 제어식 – (2) case 식(#1)
Array = [4, 5]
case value
when 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_other
end
3. 제어식 – (2) case 식(#1)
value = 3
case value
when 0 then ‘0’
when 1..9 then ‘1자리’
when 10..99 then ‘2자리’
end
value = ‚3‛
case value
when ‘0’ then ‘0’
when /AdZ/ then ‘1자리’
when /Ad{2}Z/ then ‘2자리’
end
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

는 아래와 같다

case
when 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
3. 제어식 – (4) while 식
while condition do # do는 생략 가능
    do_something
end


**후치 while 식
def more?
    gets.chomp != ‚ok‛
end
begin
    $stdout.print ‚만족하면 ‘ok’ 라고 입력하세요:‛
end while more?
3. 제어식 – (4) while 식
** while 수식자
do_something while condition
조건이 참인동안에만 do_something 을 반복한다.

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

until condition
     do_something
end
3. 제어식 – (5) for 식
** while 수식자
for i in [1, 2, 3] do # do 는 생략가능
      puts i
end
위 코드는 다음과 같다
[1, 2, 3].each do |i|
     puts I
end


For 식은 내부적으로 each iterator 를 호출하므로 each 만으로 충분 하다.
3. 제어식 – (6) iterator
** loop
내장 함수 loop 는 무한루프를 제공하는 iterator 이다. 탈출식이 없는 한, 계속해서
돌아가므로 골치 아플 수 있다.

loop do
    puts ‚kk‛
end
3. 제어식 – (6) iterator
** times
Integer 클래스의 times 메소드는 integer 객체가 나타내는 횟수만큼 블록을
실행 시킨다.

3.times{ puts ‚Yahoo‛ }


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

3.times{ |i| puts i }
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 출력
3. 제어식 – (7) escape (탈출)
** break
현재의 반복구조로부터 탈출한다.
여러 겹의 반복일 경우 자싞이 속한 Scope 의 반복을 빠져나갂다.

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

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




에러 발생을 통지하는 방법.
4. 예외처리 – (1) rescue 수식자
갂결한 예외처리 기법이다.

do_something rescue error_handling


좌변을 실행하는 중에 예외가 발생하면 우변을 실행한다.
예외 클래스를 지정하거나 예외 객체를 포착할 수 는 없다.
4. 예외처리 – (2) raise
사용자가 명시적으로 예외를 발생시킬때 사용한다.

raise ArgumentError, ‘message’


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

raise ArgumentError   # 에러메세지 없이 ArgumentError 발생
raise ‘message’       # message라는 메시지로 RuntimeError 발생
raise                 # 에러메세지 없이 RuntimeError 발생
5. 대역탈출




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

catch(:exit) {
    loop do # 무한루프
        loop do # 무한루프
               throw :exit # 여기서 탈출
        end
    end
}

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


   -끝-

Más contenido relacionado

La actualidad más candente

Scala nested function generic function
Scala nested function generic functionScala nested function generic function
Scala nested function generic functionYong Joon Moon
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)유익아카데미
 
Python Sympy 모듈 이해하기
Python Sympy 모듈 이해하기Python Sympy 모듈 이해하기
Python Sympy 모듈 이해하기Yong Joon Moon
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(2)
코딩인카페 C&JAVA 기초과정 C프로그래밍(2)코딩인카페 C&JAVA 기초과정 C프로그래밍(2)
코딩인카페 C&JAVA 기초과정 C프로그래밍(2)유익아카데미
 
More effective c++ Chap1~2
More effective c++ Chap1~2More effective c++ Chap1~2
More effective c++ Chap1~2Injae Lee
 
이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디quxn6
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Park Jonggun
 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15Nam Hyeonuk
 
[Swift] Operator
[Swift] Operator[Swift] Operator
[Swift] OperatorBill Kim
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부quxn6
 
Scala block expression
Scala block expressionScala block expression
Scala block expressionYong Joon Moon
 
[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1지환 김
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)코딩인카페 C&JAVA 기초과정 C프로그래밍(1)
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)유익아카데미
 
자바스크립트
자바스크립트자바스크립트
자바스크립트Hansol_
 

La actualidad más candente (20)

Scala nested function generic function
Scala nested function generic functionScala nested function generic function
Scala nested function generic function
 
Scala syntax function
Scala syntax functionScala syntax function
Scala syntax function
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
코딩인카페 C&JAVA 기초과정 C프로그래밍(3)
 
Python Sympy 모듈 이해하기
Python Sympy 모듈 이해하기Python Sympy 모듈 이해하기
Python Sympy 모듈 이해하기
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(2)
코딩인카페 C&JAVA 기초과정 C프로그래밍(2)코딩인카페 C&JAVA 기초과정 C프로그래밍(2)
코딩인카페 C&JAVA 기초과정 C프로그래밍(2)
 
Scala type args
Scala type argsScala type args
Scala type args
 
More effective c++ Chap1~2
More effective c++ Chap1~2More effective c++ Chap1~2
More effective c++ Chap1~2
 
이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디
 
Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초Start IoT with JavaScript - 1.기초
Start IoT with JavaScript - 1.기초
 
Scala match pattern
Scala match patternScala match pattern
Scala match pattern
 
Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
 
Scala variable
Scala variableScala variable
Scala variable
 
Scala implicit
Scala implicitScala implicit
Scala implicit
 
MEC++ 1, 2
MEC++ 1, 2MEC++ 1, 2
MEC++ 1, 2
 
[Swift] Operator
[Swift] Operator[Swift] Operator
[Swift] Operator
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부
 
Scala block expression
Scala block expressionScala block expression
Scala block expression
 
[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1[Effective Modern C++] Chapter1 - item1
[Effective Modern C++] Chapter1 - item1
 
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)코딩인카페 C&JAVA 기초과정 C프로그래밍(1)
코딩인카페 C&JAVA 기초과정 C프로그래밍(1)
 
자바스크립트
자바스크립트자바스크립트
자바스크립트
 

Destacado

Example Position map
Example Position mapExample Position map
Example Position map재영 이
 
Ruby - 3rd (수치의 핵심)
Ruby - 3rd (수치의 핵심)Ruby - 3rd (수치의 핵심)
Ruby - 3rd (수치의 핵심)재영 이
 
Meta Programming in Ruby - Code Camp 2010
Meta Programming in Ruby - Code Camp 2010Meta Programming in Ruby - Code Camp 2010
Meta Programming in Ruby - Code Camp 2010ssoroka
 
Ruby For Java Programmers
Ruby For Java ProgrammersRuby For Java Programmers
Ruby For Java ProgrammersMike Bowler
 
Ruby On Rails Introduction
Ruby On Rails IntroductionRuby On Rails Introduction
Ruby On Rails IntroductionThomas Fuchs
 
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory CourseRuby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Coursepeter_marklund
 

Destacado (9)

Example Position map
Example Position mapExample Position map
Example Position map
 
Ruby - 3rd (수치의 핵심)
Ruby - 3rd (수치의 핵심)Ruby - 3rd (수치의 핵심)
Ruby - 3rd (수치의 핵심)
 
Designing Ruby APIs
Designing Ruby APIsDesigning Ruby APIs
Designing Ruby APIs
 
Meta Programming in Ruby - Code Camp 2010
Meta Programming in Ruby - Code Camp 2010Meta Programming in Ruby - Code Camp 2010
Meta Programming in Ruby - Code Camp 2010
 
Ruby For Java Programmers
Ruby For Java ProgrammersRuby For Java Programmers
Ruby For Java Programmers
 
Ruby On Rails Introduction
Ruby On Rails IntroductionRuby On Rails Introduction
Ruby On Rails Introduction
 
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory CourseRuby on Rails 101 - Presentation Slides for a Five Day Introductory Course
Ruby on Rails 101 - Presentation Slides for a Five Day Introductory Course
 
Ruby on Rails for beginners
Ruby on Rails for beginnersRuby on Rails for beginners
Ruby on Rails for beginners
 
Ruby everywhere
Ruby everywhereRuby everywhere
Ruby everywhere
 

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

자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초진수 정
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오Taeoh Kim
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법SeongHyun Ahn
 
Python 이해하기 20160815
Python 이해하기 20160815Python 이해하기 20160815
Python 이해하기 20160815Yong Joon Moon
 
파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304Yong Joon Moon
 
Multithread programming 20151206_서진택
Multithread programming 20151206_서진택Multithread programming 20151206_서진택
Multithread programming 20151206_서진택JinTaek Seo
 
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩해강
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리ETRIBE_STG
 
파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차Han Sung Kim
 
Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Park Jonggun
 
자바 스터디(6기) 1
자바 스터디(6기) 1자바 스터디(6기) 1
자바 스터디(6기) 1Jina Lee
 
Python3 brief summary
Python3 brief summaryPython3 brief summary
Python3 brief summaryHoChul Shin
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가Vong Sik Kong
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자Circulus
 
Effective c++ 3
Effective c++ 3Effective c++ 3
Effective c++ 3현찬 양
 
배열과 포인터
배열과 포인터배열과 포인터
배열과 포인터영기 김
 
Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713Yong Joon Moon
 

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

자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초자바스크립트 기초문법~함수기초
자바스크립트 기초문법~함수기초
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법
 
Python 이해하기 20160815
Python 이해하기 20160815Python 이해하기 20160815
Python 이해하기 20160815
 
파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304
 
06장 함수
06장 함수06장 함수
06장 함수
 
Multithread programming 20151206_서진택
Multithread programming 20151206_서진택Multithread programming 20151206_서진택
Multithread programming 20151206_서진택
 
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
[아꿈사] The C++ Programming Language 11장 연산자 오버로딩
 
C review
C  reviewC  review
C review
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
파이썬 스터디 2주차
파이썬 스터디 2주차파이썬 스터디 2주차
파이썬 스터디 2주차
 
Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자Start IoT with JavaScript - 2.연산자
Start IoT with JavaScript - 2.연산자
 
자바 스터디(6기) 1
자바 스터디(6기) 1자바 스터디(6기) 1
자바 스터디(6기) 1
 
Python3 brief summary
Python3 brief summaryPython3 brief summary
Python3 brief summary
 
Lambda 란 무엇인가
Lambda 란 무엇인가Lambda 란 무엇인가
Lambda 란 무엇인가
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자
 
Effective c++ 3
Effective c++ 3Effective c++ 3
Effective c++ 3
 
배열과 포인터
배열과 포인터배열과 포인터
배열과 포인터
 
R 시작해보기
R 시작해보기R 시작해보기
R 시작해보기
 
Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713
 

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

  • 1. 6장. 변수와 식 이 재영
  • 2. 목차 1. 변수 2. 연산자 3. 제어식 4. 예외처리 5. 대역탈출
  • 3. 1. 변수 객체에 붙이는 이름.
  • 4. 1. 변수 – (1) 참조 변수가 저장하는 것은 객체로의 참조이다. 객체 자체나, 값 자체를 저장하는 것이 아니다. 따라서 여러 변수가 동일한 객체를 참조 할 수 있다. # 1 – p113 A = ‚power‛ B=A A[1] = ?Q Puts A => ‚pQwer‛ Puts B => ‚pQwer‛
  • 5. 1. 변수 – (1) 참조 #2 – p115 def describe(name) puts name name[2] = ?p puts name end A = ‚Yahoo‛ describe(A) puts A => ‚Yapoo‛
  • 6. 1. 변수 – (1) 참조 #3 – p115 #2 에서 변하는 것을 막기 위해서는 복사하여 사용해야 한다. def describe(name) name = name.dup puts name name[2] = ?p puts name end
  • 7. 1. 변수 – (2) 변수의 종류 Ruby 에서는 ‘변수선언’ 이 없다. 때문에, 인터프리터가 변수명의 첪 문자를 보고 변수의 종류를 판단하게 된다. _variable : 지역변수 : 참조하기 젂에 대입해야 함. v(소)ariable : 지역변수 : 상동 @variable : 인스턴수 변수 : 초기값 nil @@variable : 클래스 변수 : 참조하기 젂에 대입해야 함. $variable : 젂역변수 : 초기값 nil V(대)ariable : 상수 : 참조하기 젂에 대입해야함.
  • 8. 1. 변수 – (3) 지역변수 def a(origin) value = origin+1 puts value end def b(origin) value = origin-1 puts value end a(2) => 3; a(2) => 3; b(2) => 3; puts value => Error ## 따라서, def 문 안에서 쓰인 value 들은 모두 각각 별개이다.
  • 9. 1. 변수 – (4) 인스턴스 변수 인스턴스 변수는 특정 객체에 속하는 변수 인데, 동일한 객체의 메소드끼리 서로 공유한다. ** 지역변수의 경우는 해당 메소드 안에서만 사용이 가능하지만, 인스턴스 변수의 경우에는 메소드들 끼리 상태를 공유하므로, A 메소드에서 값을 바꾸었을때 B 메소드 에서도 바뀐 값을 사용할 수 있게 된다. 자세한 내용은 8장에서.
  • 10. 1. 변수 – (5) 클래스 변수 클래스 변수는 기본적으로 클래스에 속하는 변수를 말한다. 자세한 내용은 (4) 의 인스턴스 변수와 함께 8장에서.
  • 11. 1. 변수 – (6) 젂역변수 $variable : 젂역변수. 언제 어디서든 참조가 가능한 변수이다. 어디서든 값을 변경시킬 수 있다. 남발하게 되면 모든 모듈이 그 변수를 통해 결합하게 되므로, 유연성이 떨어진다. ** 내장변수 인터프리터의 상태나 동작을 제어하기 위한 플래그를 저장하고 있다. $stdout - 출력 메소드의 default 출력 위치를 나타낸다. $: - 검색경로를 저장한다. $1, $2 … - 정규표현 매치를 저장한다.
  • 12. 1. 변수 – (7) 상수 변경되지 않는 변수 이다. 변경이 불가능하지는 않으나, 변경할 시 경고가 출력된다.
  • 13. 1. 변수 – (8) 의사변수 nil :빆값 true : 참 false : 거짓 slef : 자기 자싞 (this 와 비슷하다.) __FILE__ : 해당 위치의 소스파일명. 변경 불가능한 문자열을 참조한다. __LINE__ : 해당 위치의 행번호를 나타낸다. Integer 객체를 참조한다. __ENCODING__ : 해당위치의 소스파일 인코딩을 저장하고 있다. ** 소문자이므로 인터프리터에서 지역변수로 인식을 해야 하지만, 실제로는 사용자가 값을 대입 할 수 없다.
  • 14. 1. 변수 – (9) 식별자와 변수명 Ruby 에서 변수명에는 첪 글자를 제외한 모든 부분에서 _(언더바) 와 출력 가능한 문자들 외 ASCII 문자들은 사용할 수 없다. Big_endian, bigEndian, 빅엔디언 : 모두 가능함. Little-power, quinbus@flestrin : ASCII 기호 -, @ 가 들어갔으므로 불가능함.
  • 15. 2. 연산자 연산 기능을 가진 메소드.
  • 16. 2. 연산자 :: - 범위(scope) 분해 [] – 첨자 << >> - 시프트 & | ^ - 비트연산 && || - 논리연산 .. … - 범위 생성 ? : - 조건 연산자 = += -= []= - 대입
  • 17. 2. 연산자 – (1) 재정의 가능한 연산자 1+2 라는 식은 1.+(2) 라는 메소드 호출이다. 다음 연산자는 실제로는 메소드 이므로 재정의 가능하다. | ^ & <=> == === =~ > >= < <= << >> + - * / % ** ~ +@ -@ [] []= ** 자기대입 연산자는 재정의 될 수 없다. += -= *= /= %= **= <<= >>= |= &= ^= &&= ||= 등. 하지만 a += b 는 a = a+b 를 의미하므로, + 를 재정의 할 시 실질적인 의미가 변경 될 수 있다.
  • 18. 2. 연산자 – (1) 재정의 가능한 연산자 ** 부정연산자는 재정의가 가능하지만, 거의 쓸 일이 없다 != 는 == 의 부정. !~ 는 =~ 의 부정이다.
  • 19. 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 로 채워진다.
  • 20. 2. 연산자 – (2) 재정의 불가능한 연산자 ** 배열 젂개 a, *b = 1, 2, 3, 4, 5 puts b => [2, 3, 4, 5] – 배열 Array = [1, 2, 3] a, b, c = *Array puts a => 1 puts b => 2 puts c => 3
  • 21. 2. 연산자 – (3) 논리 연산자 논리 연산자는 진위 판별을 다루기 위한 재정의 불가능한 연산자이다. 주로 if 식등의 조건 부분을 구성하기 위해 사용된다. if a == 1 and b == 2 puts ‘ok’ end
  • 22. 2. 연산자 – (3) 논리 연산자 a && b : a 가 참이면 무조건 b, a 가 거짓이면 무조건 a a || b : a 가 참이면 무조건 a, a 가 거짓이면 무조건 b ** 초기화 관용구 a ||= default_value 일 때, a 가 값을 가진 상태면 아무 작업을 하지 않으나, a 가 빆 값일경우 default_value 가 대입된다.
  • 23. 2. 연산자 – (4) 범위 연산자 .. 와 ... 의 두 종류 연산자가 있다. a .. b 가 생성하는 범위에는 b가 포함된다. [a,b] a ... b 가 생성하는 범위에는 b가 포함되지 않는다. [a,b)
  • 24. 2. 연산자 – (5) 조건 연산자 a?b:c 는 a가 참이면 b로 결정되고, a가 거짓이면 c로 결정된다. Var = con ? true : false 는 다음과 같다. Var = if con then true else false end
  • 25. 3. 제어식 분기, 반복을 제어하는 문장.
  • 26. 3. 제어식 일반적인 언어와 다르게, ‘제어문’ 이라고 하지 않는 이유는 제어식이 값을 반환하기 때문이다. thought = if sample.color == ‚green‛ then ‚danger‛ else ‚undefined‛ end 의 경우 변수 thought 에 ‚danger‛ 또는 ‚undefined‛ 를 대입한다.
  • 27. 3. 제어식 – (1) if 식 if condition then do_something end -> Condition 이 true 일 경우 do_something 메소드를 실행한다. if condition then do_something else do_something_other end -> condition 이 true 일 경우 do_something 메소드를 실행하고, 그 이외의 경우 do_something_other 메소드를 실행한다.
  • 28. 3. 제어식 – (1) if 식 if condition then do_something1 elsif condition2 then do_something2 elsif condition3 then do_something3 else do_something_other end -> 각조건에 맞게 실행한다. 예외는 do_something_other 메소드를 실행.
  • 29. 3. 제어식 – (1) if 식 unless condition do_something end if 와 반대되는 개념으로, condition 이 거짓일 때 수행된다. 역시 elsif , else 를 사용할 수 있다.
  • 30. 3. 제어식 – (2) case 식(#1) Array = [4, 5] case value when 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_other end
  • 31. 3. 제어식 – (2) case 식(#1) value = 3 case value when 0 then ‘0’ when 1..9 then ‘1자리’ when 10..99 then ‘2자리’ end value = ‚3‛ case value when ‘0’ then ‘0’ when /AdZ/ then ‘1자리’ when /Ad{2}Z/ then ‘2자리’ end
  • 32. 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 는 아래와 같다 case when 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
  • 33. 3. 제어식 – (4) while 식 while condition do # do는 생략 가능 do_something end **후치 while 식 def more? gets.chomp != ‚ok‛ end begin $stdout.print ‚만족하면 ‘ok’ 라고 입력하세요:‛ end while more?
  • 34. 3. 제어식 – (4) while 식 ** while 수식자 do_something while condition 조건이 참인동안에만 do_something 을 반복한다. ** until if 에 unless 가 있듯 while 에는 until 이 있는데, 조건식이 성립 안할 때 반복 하며, 성립하면 종료된다. until condition do_something end
  • 35. 3. 제어식 – (5) for 식 ** while 수식자 for i in [1, 2, 3] do # do 는 생략가능 puts i end 위 코드는 다음과 같다 [1, 2, 3].each do |i| puts I end For 식은 내부적으로 each iterator 를 호출하므로 each 만으로 충분 하다.
  • 36. 3. 제어식 – (6) iterator ** loop 내장 함수 loop 는 무한루프를 제공하는 iterator 이다. 탈출식이 없는 한, 계속해서 돌아가므로 골치 아플 수 있다. loop do puts ‚kk‛ end
  • 37. 3. 제어식 – (6) iterator ** times Integer 클래스의 times 메소드는 integer 객체가 나타내는 횟수만큼 블록을 실행 시킨다. 3.times{ puts ‚Yahoo‛ } 이 메소드는 내부 카운터를 블록에 넘겨주므로 카운터를 이용할 수 도 있다. 3.times{ |i| puts i }
  • 38. 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 출력
  • 39. 3. 제어식 – (7) escape (탈출) ** break 현재의 반복구조로부터 탈출한다. 여러 겹의 반복일 경우 자싞이 속한 Scope 의 반복을 빠져나갂다. ** next 아래의 메소드들을 실행하지 않고, 다음 반복으로 넘어갂다. ** redo 자싞이 속한 scope 의 반복을 한번 더 한다. 조건의 여부는 따지지 않는다.
  • 40. 4. 예외처리 에러 발생을 통지하는 방법.
  • 41. 4. 예외처리 – (1) rescue 수식자 갂결한 예외처리 기법이다. do_something rescue error_handling 좌변을 실행하는 중에 예외가 발생하면 우변을 실행한다. 예외 클래스를 지정하거나 예외 객체를 포착할 수 는 없다.
  • 42. 4. 예외처리 – (2) raise 사용자가 명시적으로 예외를 발생시킬때 사용한다. raise ArgumentError, ‘message’ 이 경우에 에러메세지로 ‘message’를 갖는 ArgumentError 예외를 발생시킨다. raise ArgumentError # 에러메세지 없이 ArgumentError 발생 raise ‘message’ # message라는 메시지로 RuntimeError 발생 raise # 에러메세지 없이 RuntimeError 발생
  • 43. 5. 대역탈출 Break 보다 넓은 탈출 법.
  • 44. 5. 대역탈출 break 는 해당 scope 에서 (가장 안쪽에서) 반복을 탈출한다. 중첩된 반복의 경우에는 catch 와 throw 를 사용한다. catch(:exit) { loop do # 무한루프 loop do # 무한루프 throw :exit # 여기서 탈출 end end } throw 의 파라메터로는 심볼 또는 문자열을 넘긴다. 만약 상응하는 catch를 찾지 못하게 되면 ArgumentError 가 발생한다.