๋ฐ˜์‘ํ˜•

 

์ด ๊ธ€์€ ๊ตญ๋ฏผ๋Œ€ํ•™๊ต ๊ฐ•์Šน์‹ ๊ต์ˆ˜๋‹˜์˜ 'ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด๋ก ' ์ˆ˜์—…์„ ํ† ๋Œ€๋กœ
๊ฐœ์ธ์ ์œผ๋กœ ํ•™์Šตํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

 

 

1.1 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

 

์ธ๊ฐ„์ด ์ปดํ“จํ„ฐ๋กœ ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ”๋ฅผ ์ปดํ“จํ„ฐ์—๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ํ‘œํ˜„๋ฒ•์˜ ๋ฐœ์ „ ๊ณผ์ •

 

1940๋…„ ์ด์ „

 

Hard-wired ๋ฐฉ๋ฒ•์œผ๋กœ ์ปดํ“จํ„ฐ ๋‚ด๋ถ€ ์Šค์œ„์น˜ ์„ธํŒ…

 

-> ์ปดํ“จํ„ฐ์˜ ๋‚ด๋ถ€ ํšŒ๋กœ๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋งค์šฐ ์ œํ•œ์ ์ž„

1940๋…„๋Œ€

 

ํฐ๋…ธ์ด๋งŒ ์ปดํ“จํ„ฐ (stored programming)

 

-> ์ผ๋ จ์˜ ๋ช…๋ น์ฝ”๋“œ๋กœ ์ž‘์„ฑ, main memory์— ์ €์žฅ

 

์–ด์…ˆ๋ธ”๋ฆฌ์–ด ํƒ„์ƒ

 

-> ๊ธฐ๊ณ„ ์ข…์†์„ฑ(ํŠน์ • ์ปดํ“จํ„ฐ ์•„ํ‚คํ…์ฒ˜์— ๋งž๊ฒŒ ์ž‘์„ฑ), ์ €๊ธ‰์ˆ˜์ค€์˜ ์ถ”์ƒํ™”, ์ฝ๊ณ  ์“ฐ๊ธฐ ์–ด๋ ค์›€(๊ธฐ๊ณ„์–ด์— ๋น„ํ•ด์„œ๋Š” ํ›จ์”ฌ ๋” ์ฝ๊ณ  ์“ฐ๊ธฐ ์‰ฌ์›€)

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์ •์˜

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ๊ธฐ๊ณ„๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ , ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ๊ณ„์‚ฐ์„ ์„œ์ˆ ํ•˜๊ธฐ ์œ„ํ•œ ํ‘œ๊ธฐ ์ฒด๊ณ„์ž„

 

ํŠน์„ฑ์„ ์‚ดํŽด๋ณด๋ฉด

 

  • ๊ณ„์‚ฐ (computation)
    • Turing machine : ์ˆ˜ํ•™์  ๊ฐœ๋…์œผ๋กœ ํ˜•์‹์ ์ธ ์ •์˜
    • ์ปดํ“จํ„ฐ๊ฐ€ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ž‘์—…

  • Machine-readable
    • Machine independent (์–ธ์–ด ์ž์ฒด๋Š” ํŠน์ • ์ปดํ“จํ„ฐ ์•„ํ‚คํ…์ฒ˜์— ๋งž์ถฐ์„œ ์ž‘์„ฑ๋˜์ง€ ์•Š์•„์•ผํ•จ)
    • ๋ชจํ˜ธํ•˜์ง€ ์•Š๊ณ , ์œ ํ•œํ•œ ๋‹จ๊ณ„์  ์ฒ˜๋ฆฌ๋กœ ๋ฒˆ์—ญ ๊ฐ€๋Šฅํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์กด์žฌํ•ด์•ผํ•จ
  • Human-readable
    • ์ปดํ“จํ„ฐ ํ–‰์œ„๋ฅผ ์ฝ๊ธฐ ์‰ฝ๋„๋ก ์ถ”์ƒํ™”์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์˜์—ญ๊ณผ ๊ณ ๊ธ‰ ์–ธ์–ด

 

๊ณผํ•™ ๊ณ„์‚ฐ : Fortran

 

์‚ฌ๋ฌด ์‘์šฉ : Cobol

 

์ธ๊ณต ์ง€๋Šฅ : Lisp, Prolog

 

์‹œ์Šคํ…œ SW : C

 

์›น SW : JavaScript, PHP, ASP

 

์•ฑ SW : Objective-C, Java

 

๊ต์œก์šฉ : Basic, Pascal, ML, Haskell

 

Script languages : Perl, Python, Ruby

Shell programming : AWK, Tcl/Tk

GUI : MFC, C#, Visual Basic

 

 

1.2 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ๋Š” ์ด์œ 

 

1. ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๊ฒŒ ๋จ

 

2. ์œ ์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌ์‚ฌํ•˜๋Š” ๋Šฅ๋ ฅ์„ ์ฆ๋Œ€์‹œํ‚ด

 

3. ์ ํ•ฉํ•œ ์–ธ์–ด๋ฅผ ์„ ํƒํ•˜๋Š” ๋Šฅ๋ ฅ์„ ์ฆ๋Œ€์‹œํ‚ด

 

4. ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์คŒ

 

5. ์ƒˆ๋กœ์šด ์–ธ์–ด๋ฅผ ์„ค๊ณ„ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•ด์คŒ

 

6. ๊ตฌํ˜„์˜ ์ค‘์š”์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” ์–ธ์–ด๋ฅผ ๋” ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

7. ์ƒ๊ฐ์„ ํ‘œํ˜„ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ด

 

8. ์ „๋ฐ˜์ ์œผ๋กœ computing์— ๋Œ€ํ•œ ์ดํ•ด๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ด

 

 

1.3 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ์˜ ์ถ”์ƒํ™”

 

์ผ๋ฐ˜์ ์œผ๋กœ ์ถ”์ƒํ™”(abstraction)๋ž€ ์†์„ฑ๋“ค์˜ ์ผ๋ถ€๋ถ„๋งŒ์„ ๊ฐ€์ง€๊ณ  ์ฃผ์–ด์ง„ ์ž‘์—…์ด๋‚˜ ๊ฐ์ฒด๋“ค์„ ํ•„์š”ํ•œ ์ •๋„๋กœ ๋ฌ˜์‚ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ž„

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์ถ”์ƒํ™”๋Š” ๋ฐ์ดํ„ฐ ์ถ”์ƒํ™”(= ์ž๋ฃŒ ์ถ”์ƒํ™”)์™€ ์ œ์–ด ์ถ”์ƒํ™”(= ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ถ”์ƒํ™”)์˜ ๋‘ ๊ฐ€์ง€ ๋ฒ”์ฃผ๋กœ ๋‚˜๋‰จ

 

 

์ถ”์ƒํ™”๋Š” ์ถ”์ƒํ™”์— ํฌํ•จ๋œ ์ •๋ณด์˜ ์–‘์œผ๋กœ ์ˆ˜์ค€์„ ๋‚˜๋ˆŒ ์ˆ˜๊ฐ€ ์žˆ์Œ

 

  • ๊ธฐ๋ณธ์  ์ถ”์ƒํ™”(basic abstraction) : ๊ฐ€์žฅ ๊ตญ์ง€์ ์ธ ๊ธฐ๊ณ„ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•œ ์ถ”์ƒํ™”

  • ๊ตฌ์กฐ์  ์ถ”์ƒํ™”(structured abstraction) : ํ”„๋กœ๊ทธ๋žจ์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋ณด๋‹ค ์ „์—ญ์ ์ธ ์ •๋ณด์— ๊ด€ํ•œ ์ถ”์ƒํ™”

  • ๋‹จ์œ„ ์ถ”์ƒํ™”(unit abstraction) : ๋‹จ์œ„ ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด ์ •๋ณด์— ๊ด€ํ•œ ์ถ”์ƒํ™”

 

๋‹จ๊ณ„๊ฐ€ ๋‚˜์•„๊ฐˆ์ˆ˜๋ก ๋” ํฐ ๋‹จ์œ„๋กœ์˜ ์ถ”์ƒํ™”๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด๋จ

 

Data abstraction

 

์ž๋ฃŒ ์ถ”์ƒํ™”(๋ฐ์ดํ„ฐ ์ถ”์ƒํ™”)๋Š” ๋ฌธ์ž์—ด, ์ˆ˜, ํƒ์ƒ‰ ํŠธ๋ฆฌ์™€ ๊ฐ™์€ ๊ณ„์‚ฐ์˜ ์ฃผ์ฒด๊ฐ€ ๋˜๋Š” ์ž๋ฃŒ์˜ ํŠน์„ฑ์„ ์ถ”์ƒํ™”ํ•จ

 

basic abstraction (๊ธฐ๋ณธ์  ์ถ”์ƒํ™”)

 

 

์ปดํ“จํ„ฐ ๋‚ด๋ถ€์˜ ์ž๋ฃŒ ํ‘œํ˜„์„ ์ถ”์ƒํ™”ํ•จ

 

ex.

1. ๊ธฐ์–ต ์žฅ์น˜์˜ ์œ„์น˜ -> ๋ณ€์ˆ˜
2. ์ž๋ฃŒ์˜ ๊ฐ’ -> 2์ง„๋ฒ• ํ‘œ๊ธฐ๊ฐ€ ์•„๋‹Œ ์ •์ˆ˜, ์‹ค์ˆ˜์™€ ๊ฐ™์€ ์ž๋ฃŒํ˜•

 

๋“ฑ ์œผ๋กœ ์ถ”์ƒํ™” ๋จ

 

๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ œ์•ฝ 
char, int, float, double, Boolean, string, pointer

 

 

structured abstraction (๊ตฌ์กฐ์  ์ถ”์ƒํ™”)

 

 

๊ด€๋ จ๋œ ์ž๋ฃŒ๊ฐ’์˜ ์ง‘ํ•ฉ์„ ์ถ”์ƒํ™”ํ•จ

 

ex. ๋ฐฐ์—ด, ๋ ˆ์ฝ”๋“œ

 

 

๊ตฌ์กฐ์  ์ถ”์ƒํ™”๋œ ์ž๋ฃŒํ˜•๋“ค์„ ๊ตฌ์กฐ ์ž๋ฃŒํ˜•(structured type) ๋˜๋Š” ๋‹จ์ˆœํžˆ ๊ตฌ์กฐํ˜•์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ

 

-> ๊ตฌ์กฐํ˜•์€ ๊ธฐ๊ณ„ ๋‚ด๋ถ€ ํ‘œํ˜„์ด ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ•„์š”์— ๋”ฐ๋ผ ์ƒ์„ฑํ•œ ์ƒˆ๋กœ์šด ์ž๋ฃŒํ˜•์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Œ

 

๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์— ๋ช…์นญ ๋ถ€์—ฌ (๋ณ€์ˆ˜, ๋ฐฐ์—ด, ๊ตฌ์กฐ์ฒด)
type arr = array[1..10] of real;

 

unit abstraction (๋‹จ์œ„ ์ถ”์ƒํ™”)

 

 

ํฐ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ํ•œ ์ž๋ฃŒํ˜•์˜ ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ•œ ์žฅ์†Œ์— ๋ชจ์•„๋‘๊ณ , ์ž๋ฃŒ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œํ•œํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ

 

(์ž๋ฃŒํ˜•์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์ด ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ•ญ์ƒ ์ž๋ฃŒ ๊ตฌ์กฐ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์—ผ๋‘์— ๋‘์ง€ ์•Š์•„๋„๋จ)

 

-> ์ด๋Ÿฌํ•œ ์ฒด๊ณ„๋ฅผ ์ž๋ฃŒ ์บก์Šํ™” ํ˜น์€ ์ถ”์ƒ ์ž๋ฃŒํ˜•์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด๋Š” unit abstraction์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ž„

 

ex. Modula-2์˜ module, Ada์˜ package, Java์˜ class

 

public class BankAccount {
    private double balance;

    public void deposit(double amount) {
        balance += amount;
    }

    public void withdraw(double amount) {
        if (balance >= amount) {
            balance -= amount;
        }
    }

    public double getBalance() {
        balance += 0.01; // ๋‚ด๋ถ€ ๊ตฌํ˜„ ๋ณ€๊ฒฝ: ์ž”๊ณ ์— 0.01 ์ถ”๊ฐ€
        return balance;
    }
}

 

์œ„ ์˜ˆ์‹œ Java ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด BankAccount ํด๋ž˜์Šค๋Š” ๊ณ„์ขŒ ์ž”๊ณ ์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•œ ๊ณณ์— ๋ชจ์•„๋‘๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ

 

Process abstraction

 

์ œ์–ด ์ถ”์ƒํ™”(์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ถ”์ƒํ™”)๋Š” ํ˜„ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์‹คํ–‰ ์ˆœ์„œ์˜ ์ˆ˜์ •์„ ์œ„ํ•œ ์ œ์–ด์˜ ํŠน์„ฑ์„ ์ถ”์ƒํ™”ํ•จ

(ex. ๋ฐ˜๋ชฉ๋ถ„, ์กฐ๊ฑด๋ฌธ, ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์ด ์—ฌ๊ธฐ์— ํ•ด๋‹น๋จ)

 

=> ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฌธ์žฅ์„ ๋” ํฐ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ์ถ”์ƒํ™”

 

basic abstraction (๊ธฐ๋ณธ์  ์ถ”์ƒํ™”)

 

 

๊ณ„์‚ฐ๊ณผ ๊ฐ’์˜ ์ €์žฅ์„ ์ถ”์ƒํ™”ํ•จ

 

 

-> ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ธฐ๊ณ„ ๋ช…๋ น์–ด๋ฅผ ๋ชจ์•„ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ถ”์ƒ ๊ตฌ๋ฌธ์œผ๋กœ ๋งŒ๋“  ๊ฒƒ

 

ex.  x := x + y (๋ฐฐ์ •๋ฌธ)

 

-> ์œ„์˜ ๋ฐฐ์ •๋ฌธ์€ ๋ณ€์ˆ˜ x์˜ ๊ฐ’์„ ๊ธฐ์–ต์žฅ์†Œ์—์„œ ๊ฐ€์ ธ์™€ ๋ณ€์ˆ˜ y ๊ฐ’์„ ๋”ํ•œ ํ›„์— ๊ธฐ์–ต ์žฅ์†Œ x์— ๋‹ค์‹œ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ

 

structured abstraction (๊ตฌ์กฐ์  ์ถ”์ƒํ™”)

 

 

ํ”„๋กœ๊ทธ๋žจ์—์„œ ์–ด๋–ค ๊ฒ€์‚ฌ๋œ ๊ฐ’์— ๋”ฐ๋ผ ๋ถ„ํ• ๋œ ๋ช…๋ น์–ด์˜ ํ•œ ๊ทธ๋ฃน์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž„

 

ex. if๋ฌธ, case๋ฌธ, switch๋ฌธ ๋“ฑ์˜ ํƒ์ผ๋ฌธ๊ณผ ๊ฐ์ข… ๋ฐ˜๋ณต๋ฌธ๋“ค๊ณผ ๋ถ€ํ”„๋กœ๊ทธ๋žจ ํ˜ธ์ถœ

 

-> ๊ตฌ์กฐํ™”๋œ ์ œ์–ด ๊ตฌ์กฐ์˜ ํ•œ ๊ฐ€์ง€ ์žฅ์ ์€ ์ด ์ œ์–ด ๊ตฌ์กฐ๋“ค์ด ๋‹ค๋ฅธ ์ œ์–ด ๊ตฌ์กฐ ์•ˆ์— ๋‚ดํฌ๋  ์ˆ˜ ์žˆ์Œ

 

 

ํ‚ค์›Œ๋“œ๋Š” ๋‹ค๋ฅด์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ์‚ฌํ•จ

 

Java์™€ Ada์—์„œ์˜ structured abstraction ์˜ˆ์‹œ์ธ๋ฐ

Ada์—์„œ endif์˜ ์‚ฌ์šฉ์€ Java์—์„œ ์ค‘๊ด„ํ˜ธ( {..} ) ์‚ฌ์šฉ์„ ์—†์• ๋ฉฐ ๋งค์šฐ ์ค‘์š”ํ•จ

 

 

๋”์šฑ ๋ง‰๊ฐ•ํ•œ ๊ตฌ์กฐ์  ์ œ์–ด์ถ”์ƒํ™”๋Š” ํ”„๋กœ์‹œ์ € ํ˜น์€ ์„œ๋ธŒ๋ฃจํ‹ด์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๋ถ€ํ”„๋กœ๊ทธ๋žจ์˜ ์‚ฌ์šฉ์ž„

 

ํ”„๋กœ์‹œ์ € ์ถ”์ƒํ™”๋Š” ๋ฐ‘์˜ ๋‘ ๊ฐ€์ง€๋ฅผ ํฌํ•จํ•ด์•ผํ•จ

 

  • ํ”„๋กœ์‹œ์ €๋Š” ์ด๋ฆ„๊ณผ ์‹คํ–‰ํ•ด์•ผ ํ•  ๋™์ž‘์ด ๊ฒฐํ•ฉ๋˜์–ด์•ผํ•จ

    -> ์ด๋ฅผ ํ”„๋กœ์‹œ์ € ์„ ์–ธ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ๋ณ€์ˆ˜์˜ ํ˜• ์„ ์–ธ๊ณผ ์œ ์‚ฌํ•จ

  • ํ”„๋กœ์‹œ์ €๋Š” ์‹ค์ œ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•  ๊ณณ์—์„œ ํ˜ธ์ถœ๋˜์–ด์•ผํ•จ

    -> ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ(invocation) ํ˜น์€ ํ”„๋กœ์‹œ์ € ์•กํ‹ฐ๋ฒ ์ด์…˜(activation)์ด๋ผ๊ณ ํ•จ

u, v, x๋Š” ํ”„๋กœ์‹œ์ €์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ์„œ ํ”„๋กœ์‹œ์ €์˜ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ๊ฐ’์ด ๋ณ€ํ•จ

 

 

์œ„ ์˜ˆ์‹œ ์ฝ”๋“œ๋Š” Modula-2 ํ”„๋กœ๊ทธ๋žจ์ธ๋ฐ

 

SUBROUTINE gcd(u, v, x)

...

END

 

Fortran์—์„œ์˜ ํ”„๋กœ์‹œ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ์„ ์–ธ๋จ

 

ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ์€ ์„ ํƒ๋ฌธ์ด๋‚˜ ๋ฐ˜๋ณต๋ฌธ๋ณด๋‹ค ํ›จ์”ฌ ๋ณต์žกํ•œ ๊ตฌ์กฐ์ž„

ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ํ˜ธ์ถœ ๋‹น์‹œ์˜ ํ”„๋กœ๊ทธ๋žจ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์—ฌ์•ผ ๋˜๋Š”๋ฐ,
์ด๋Ÿฌํ•œ ์ •๋ณด๋Š” ์‹คํ–‰ ํ™˜๊ฒฝ (runtime environment)์— ์ €์žฅ๋จ

 

unit abstraction (๋‹จ์œ„ ์ถ”์ƒํ™”)

 

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ํ”„๋กœ์‹œ์ €์˜ ์ง‘ํ•ฉ์„ ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ์Œ

 

ex. ์ž๋ฃŒ ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ‰๊ท , ํ‘œ์ฅฐ ํŽธ์ฐจ ๋“ฑ ํ†ต๊ณ„์— ๊ด€๋ จ๋œ ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ๋ชจ์•„์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ ๋‹จ์œ„๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๋”ฐ๋กœ ์ปดํŒŒ์ผ ํ•˜์—ฌ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

 

์ตœ๊ทผ ์–ธ์–ด์—์„œ ์ œ๊ณตํ•˜๋Š” ์ถ”์ƒ ์ž๋ฃŒํ˜•์€ ์ž๋ฃŒ ์ถ”์ƒํ™”์™€ ์ œ์–ด ์ถ”์ƒํ™”๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ๋‹จ์œ„ ์ถ”์ƒํ™”์ด๋ฉฐ

 

  • Modula-2์˜ module

  • Ada์˜ package

  • C++์™€ Java์˜ class

 

๋“ฑ์ด ์ด์— ์†ํ•จ

 

์œ„์˜ ์–ด๋–ค ๋ฒ”์ฃผ์—๋„ ๋“ค์ง€ ์•Š๋Š” ์ œ์–ด ์ถ”์ƒํ™”๋กœ์„œ ๋ณ‘ํ–‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์žˆ์Œ
์ฆ‰, ํ˜„๋Œ€์˜ ๋งŽ์€ ์ปดํ“จํ„ฐ๋Š” ๋‹ค์ˆ˜์˜ ํ”„๋กœ์„ธ์„œ๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฌ๋Ÿฌ ์ž๋ฃŒ๋ฅผ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

-> ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ๋“ค๊ฐ„์— ๋™๊ธฐํ™”์™€ ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•จ

ex. Moudla-2์˜ ์ฝ”๋ฃจํ‹ด, Ada์˜ task, Java์˜ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ(multithread) ๋“ฑ์ด ๋ณ‘ํ–‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•จ

 

 

๋ชจ๋“  ์ถ”์ƒํ™”๋Š” ๊ฒฐ๊ตญ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ๋žŒ์ด ์ฝ๊ณ  ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ๋„๋ก ํ•œ ๊ฒƒ์ž„

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ๊ณ„์‚ฐ๋งŒ์„ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๋ฉด ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๊ณ„์‚ฐ์„ ๊ธฐ์ˆ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์กฑํ•จ

-> ์ด๋Ÿฌํ•œ ์–ธ์–ด๋ฅผ ํŠœ๋ง ์ปดํ”Œ๋ฆฟ(turing complete)ํ•˜๋‹ค๊ณ  ํ•จ

 

(ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๊ฐ€ ์ด๋ก ์ ์œผ๋กœ ๋ชจ๋“  ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ํŠœ๋ง ๋จธ์‹ ๊ณผ ๋™์ผํ•œ ๊ณ„์‚ฐ ๋Šฅ๋ ฅ์„ ๊ฐ€์กŒ์Œ์„ ์˜๋ฏธํ•จ)

 

๋ณดํ†ต ๋ช…๋ น๋ฌธ 5๊ฐœ ์ •๋„๋ฉด turing complete๋ฅผ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ ํ•จ

 

1.4 ๊ณ„์‚ฐ ์ „ํ˜• (computing paradigm)

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ์ปดํ“จํ„ฐ์˜ ์—ฐ์‚ฐ์„ ๋ชจ๋ฐฉํ•˜๊ณ  ์ถ”์ƒํ™”ํ•˜๋Š” ๋ฐ์„œ ์‹œ์ž‘๋จ

 

-> ์ปดํ“จํ„ฐ์˜ ๊ตฌ์กฐ๊ฐ€ ์–ธ์–ด์„ค๊ณ„์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ์Œ

 

์ฆ‰, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” 

 

  • ๋ช…๋ น์˜ ์ˆœ์ฐจ์  ์‹คํ–‰

  • ๊ธฐ์–ต์žฅ์†Œ ์œ„์น˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ

  • ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ์ •๋ฌธ์˜ ์‚ฌ์šฉ

 

์œผ๋กœ ํŠน์ •์ง€์„ ์ˆ˜ ์žˆ์Œ

 

=> ์ด๋Ÿฌํ•œ ์–ธ์–ด๋ฅผ ๋ช…๋ นํ˜• ์–ธ์–ด(imperative language) ๋˜๋Š” ์ ˆ์ฐจ ์–ธ์–ด (procedural language) ๋ผ๊ณ  ํ•จ


์˜ค๋Š˜๋‚ ์˜ ๋Œ€๋ถ€๋ถ„ ์–ธ์–ด๋Š” ๋ช…๋ นํ˜• ์–ธ์–ด์ด์ง€๋งŒ, ๋งŽ์€ ์ž๋ฃŒ์— ๋™์‹œ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ณ„์‚ฐ, ๋น„๊ฒฐ์ •์ ์ธ ๊ณ„์‚ฐ, ์ˆœ์„œ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ณ„์‚ฐ์„ ๊ธฐ์ˆ ํ•˜๋Š”๋ฐ ๋งค์šฐ ๋น„ํšจ์œจ์ ์ž„

 

=> ๊ณ„์‚ฐ์ด ์ˆœ์ฐจ์  ๋ช…๋ น์— ์˜ํ•˜์—ฌ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ํฐ๋…ธ์ด๋งŒ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ด

(๋ช…๋ นํ˜• ์–ธ์–ด๋กœ๋Š” ์ธ๊ณต์ง€๋Šฅ์„ ๋‹ค๋ฃจ๊ธฐ ํž˜๋“ฌ)

์ด๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜ ๊ฐœ๋…์— ๊ธฐ๋ฐ˜์„ ๋‘” ํ•จ์ˆ˜ํ˜• ์–ธ์–ด, ๊ธฐํ˜ธ ๋…ผ๋ฆฌํ•™์— ๊ธฐ๋ฐ˜ํ•œ ๋…ผ๋ฆฌํ˜• ์–ธ์–ด๊ฐ€ ํƒ„์ƒํ•จ

 

  • ๋ช…๋ นํ˜• ์–ธ์–ด (๋˜๋Š” ์ ˆ์ฐจ์  ์–ธ์–ด)

    => ๋ณ€์ˆ˜์™€ ๋ฐฐ์ •๋ฌธ ์‚ฌ์šฉ, ํฐ๋…ธ์ด๋งŒ ๋ณ‘๋ชฉ ํ˜„์ƒ(์ˆœ์ฐจ์  ์‹คํ–‰์œผ๋กœ ์ธํ•ด)

  • ํ•จ์ˆ˜ํ˜• ์–ธ์–ด : Lisp

    => ํ•จ์ˆ˜์˜ ํ‰๊ฐ€ ๋ฐ ํ˜ธ์ถœ ๋ฐฉ๋ฒ• ์ œ๊ณต, ๋ณ€์ˆ˜์™€ ๋ฐฐ์ •๋ฌธ์ด ์—†์Œ, ๋ฐ˜๋ณต๋ฌธ์ด ์—†์–ด์„œ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•จ

  • ๋…ผ๋ฆฌํ˜• ์–ธ์–ด : Prolog

    => ์„ ์–ธ์  ์–ธ์–ด, ๊ธฐํ˜ธ ๋…ผ๋ฆฌํ•™์— ๊ทผ๊ฑฐ

์ด ๋•Œ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๊ฑฐ๋Œ€ํ•ด์ง€๋ฉฐ ์ฝ”๋“œ์˜ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด์กŒ๊ณ  ์ด์— ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€์„ ๋Š๊ปด ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด๊ฐ€ ํƒ„์ƒํ•จ

 

  • ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด

    => ๊ธฐ์–ต์žฅ์†Œ์™€ ์ด ๊ธฐ์–ต์žฅ์†Œ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์‚ฐ์˜ ์ง‘ํ•ฉ์ธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•จ

 

์ ˆ์ฐจํ˜•  vs ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Modula-2)

 

PROCEDURE gcd (u,v : INTERGER; VAR x : INTERGER);
VAR y, t : INTERGER
BEGIN
	x := u ; y := v ;
	LOOP
		IF y <= 0 THEN
	          EXIT
		END ;
		t := y;
		y := x MOD y;
		x := t;
	END;
END gcd;

 

PROCEDURE gcd (u,v : INTERGER) : INTEGER ;
BEGIN
	IF v = 0 THEN
		RETURN u ;
	ELSE
		RETURN gcd (v, u MOD v) ;
	END;
END gcd;

 

Modula2์˜ 2๊ฐ€์ง€ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด

 

1. recursive๋กœ ์ธํ•ด ๊ธธ์ด ์ฐจ์ด๊ฐ€ ์žˆ์Œ

 

2. ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‚˜์—ดํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜ ์‹œํ€€์Šค(ํ•จ์ˆ˜์˜ ํ๋ฆ„)๋ฅผ ์‚ฌ์šฉ 

 

๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Œ

 

๋…ผ๋ฆฌํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ (Prolog)

 

ํŠน์ง• : ๊ณ„์‚ฐ์˜ ์‹คํ–‰ ์ˆœ์„œ(how) ๋Œ€์‹  ๋ฌด์—‡์„ ํ•˜๋ ค๊ณ  ํ•˜๋Š”๊ฐ€(what)์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ๋ฐ˜๋ณต์ด๋‚˜ ์„ ํƒ ๊ฐœ๋…์ด ๋ถˆํ•„์š”ํ•จ

 

์ตœ๋Œ€๊ณต์•ฝ์ˆ˜(gcd)์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ์  ๊ธฐ์ˆ ์„ ๋ณด๋ฉด

  • v = 0 ์ด๋ฉด u ์™€ v ์˜ gcd ๋Š” u ์ด๋‹ค.
  • v > 0 ์ด๋ฉด u ์™€ v ์˜ gcd ๋Š” v ์™€ u mod v ์˜ gcd  ์™€ ๊ฐ™๋‹ค.

 

์ด๋ฏ€๋กœ

 

 

 

์œ„ ์‚ฌ์ง„์€ ๋…ผ๋ฆฌ์  ๊ธฐ์ˆ ์— ๋Œ€ํ•œ Prolog ํ”„๋กœ๊ทธ๋žจ์ž„

 

๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด ์˜ˆ์‹œ

 

 

 

Programming Language Paradigm

 

 

  • ์ปดํ“จํ„ฐ H/W ๊ตฌ์กฐ์™€์˜ ์—ฐ๊ด€์„ฑ

    • Von Neumann ์•„ํ‚คํ…์ฒ˜

  • S/W ์„ค๊ณ„ ๋ฐฉ๋ฒ•๋ก ๊ณผ์˜ ์—ฐ๊ด€์„ฑ

    • ๊ตฌ์กฐ์  ์„ค๊ณ„ vs ๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„

  • ์ธ๊ฐ„์˜ ์‚ฌ๊ณ  ๋ฐฉ์‹๊ณผ์˜ ์—ฐ๊ด€์„ฑ

 

๊ณ ๊ธ‰์–ธ์–ด์˜ 4๊ฐ€์ง€ ํŒจ๋Ÿฌ๋‹ค์ž„

 

๋ช…๋ นํ˜•, ํ•จ์ˆ˜ํ˜•, ๋…ผ๋ฆฌํ˜•, ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด

 

  • Imperative(procedural) languages

    • Algol, Cobol, PL/1, C, Modula

  • Functional languages

    • Lisp, Haskel, ML, APL

  • Logic languages

    • Prolog

  • Object-oriented languages

    • Smalltalk, Simula, C++, Java, Ruby

      (Ruby์™€ Python์€ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์ธ๋ฐ Python์€ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์–ธ์–ด๋ผ์„œ ์ œ์™ธ) 
๋ฐ˜์‘ํ˜•