PHP 프로그래밍

본문 바로가기
사이트 내 전체검색


Web Programming >> PHP Programming
[목차]
제2장 PHP의 기초 문법

    5. 제어 구조

PHP에서의 제어 구조 역시 그 문법은 C나 Perl의 문법과 비슷하다.

 

1. IF/ELSE 구문

if/else 구문은 C의 문법과 비슷하다.

 

 

 if (조건식1) {

        // 조건식1이 참일 경우 실행하는 문장들

        } else if (조건식2) {

        // 조건식2가 참일 경우 실행하는 문장들

 } else {

        // 위의 두 가지 조건식에 모두 해당되지 않을 경우에 실행되는 문장들

 }

 

위에서 조건식이 참일 경우와 거짓일 경우에 따라서 실행되는 문장이 달라짐을 알 수 있다.

 

 

 <?

   $a = 12;

   $b = 20;

   

   if($a > $b) {

      echo("변수a가 변수b보다 크네요<br>");

   } else if ($a < $b) {

      echo("변수b가 변수a보다 크네요<br>");   

   } else {

      echo("변수a와 b가 같네요.<br>");   

   }

 ?>

 

[예제1.17] if/else 구문

 

위의 코드에서는 $a가 $b보다 작으므로 7행의 조건 식을 만족시킨다. 따라서 8행이 실행되어 "변수 b가 변수 a보다 크네요"라는 문자열이 출력된다. 만일 $a와 $b가 같다면 5행과 7행의 조건식 모두가 해당되지 않으므로 9행이 실행된다.

 

2. WHILE 구문

while문 역시 그 문법은 C나 Perl과 비슷하다.

 

 while (조건식) {

        //조건 식이 참인 동안은 계속 실행되는 문장들

 }

아래의 예제를 보자.

 

 

 <?

   $i = 0;

   while($i < 10) {      

      echo("변수 \$i의 값은 현재 ${i}으로 10보다 작습니다.<br>");

      $i++;

   }

 ?>   

 

[예제1.18] while 구문

 

위 예제의 출력 결과는 다음과 같다. 변수 $i를 1씩 증가시키면서 10보다 작을 때까지 4행의 결과가 계속 출력된다.

 

 변수 $i의 값은 현재 0으로 10보다 작습니다.

 변수 $i의 값은 현재 1으로 10보다 작습니다.

 변수 $i의 값은 현재 2으로 10보다 작습니다.

 변수 $i의 값은 현재 3으로 10보다 작습니다.

 변수 $i의 값은 현재 4으로 10보다 작습니다.

 변수 $i의 값은 현재 5으로 10보다 작습니다.

 변수 $i의 값은 현재 6으로 10보다 작습니다.

 변수 $i의 값은 현재 7으로 10보다 작습니다.

 변수 $i의 값은 현재 8으로 10보다 작습니다.

 변수 $i의 값은 현재 9으로 10보다 작습니다.

 

3. DO...WHILE 구문

do...whileans 역시 그 문법은 C나 Perl과 비슷하다.

 

 do {

        // 아래의 조건 식이 참인 동안은 계속 실행되는 문장들

        // 따라서 처음 한번은 조건식의 참/거짓에 관계없이 실행된다.

 } while (조건식)

do...while 문이 while 문과 다른 것은 조건 식의 위치이다. while 문이 바로 조건식을 검사하는 반면에 do...while 문은 조건식을 먼저 검사하지 않고 우선 do 안의 코드를 한번 실행한다. 즉, 조건식이 참이든 거짓이든 상관없이 처음 한번은 무조건 실행되고 그 이후부터 조건식을 검사하여 다음 반복 실행 여부를 결정한다.

 

 

 <?

   $i = 1;

   do {

      echo("변수 \$i의 값은 현재 ${i}입니다. <br>");

      $i--;

   } while ($i > 0)

 ?>   

 

[예제1.19] do...while 구문

위의 예제 결과 변수 $i는 처음에 1의 값을 갖다가 4,5행을 실행한 후에 0이 된다. 따라서 6행의 조건식 ($i > 0)을 만족하지 못하므로 처음 한번만 실행되고 반복 실행되지 않는다.

 

4. FOR 구문

for 문의 구조는 다음과 같다.

 

 for (변수의 초기화; 조건식; 증감식) {

        // 조건식이 참일 동안 실행

 }

for 문에서는 가장 먼저 초기화 문장이 실행된다. 그리고 조건식을 검사한 후에 조건식이 참이면 블록내의 문장을 실행하고 블록이 끝난 후 증감식을 실행하게 된다. 그리고는 다시 조건식을 검사하는 일부터 반복하게 된다.

 

 

 <?

   for($i = 0; $i < 10; $i++) {

      echo("변수 \$i의 값은 현재 ${i}입니다. <br>");

   }

 ?>   

 

[예제1.20] for 구문

 

[예제1.20]의 결과는 while 문에서 보았던 [예제1.19]와 동일하다. 즉, if 문과 while 문은 표현 방식만 다를 뿐이지 실제로는 같은 기능을 수행한다고 보면 된다. C에서처럼 for 문에서 초기화 문장이나 조건식, 증감식은 모두 생략될 수 도 있다. 특히 두 번째인 조건식이 생략된 경우는 PHP에서 그 논리 연산 결과를 무조건 참으로 간주하기 때문에 for 문이 무한히 반복된다는 것을 의미한다. 어찌보면 두 번째 조건식을 생략하여 무한 루프를 돌리는 것이 위험하고 무의미하다고 생각할지 모르겠다. 하지만 그러한 경우도 분명 필요할 때가 있다.

 

아래의 예제를 보자

 

 

 <?

   for($i = 0; ; $i++) {

      if($i < 10) {

         echo("변수 \$i의 값은 현재 ${i}입니다. <br>");

      } else {

         break;

      }

   }

 ?>   

 

[예제1.21] for 문에서 조건식의 생략

 

[예제1.21]의 결과는 바로 위 for 문 예제와 같다. 2행에서 생략된 조건식은 for 문의 블록 안에서 if 문으로 대체되어 구현된 것을 볼 수 있다. 만일 3행의 조건 식을 만족하지 않을 경우에는 6행의 break 문이 실행되어 for 루프를 빠져 나오게 된다.

혹 Perl 프로그램을 해 보았다면 폼을 통해 넘어온 값을 파싱할 때 쓰이는 foreach()라는 아주 유용한 함수를 기억할 것이다. PHP에서도 each()와 list()라는 함수를 함께 쓰면 배열에 저장되어 있는 값을 하나씩 꺼내어 특정 변수에 저장할 수 있다. 이는 앞에서도 한 번 다룬 적이 있다.

 

 

 <?

 $data = array("이철완"=>"A", "김현영"=>"C", "권칠현"=>"D");

 

 while(list($name, $class) = each($data)) {

    echo("${name}학생은 ${class}반 학생입니다.<br>");

}

 ?>

 

[예제1.22] each()와 list() 함수로 배열의 값을 출력하기

 

[예제1.22]의 실행 결과는 다음과 같다.

 

 이철완학생은 A반 학생입니다.

 김현영학생은 C반 학생입니다.

 권칠현학생은 D반 학생입니다.

위 예제에서 2행은 배열을 설명할 때 얘기했던 것처럼 연관 배열 변수 $data를 정의한 것이다. 만일 while 구문을 이용하여 이 배열 안에 저장되어 있는 모든 원소를 꺼내어 출력하고자 할 경우 어떻게 할 것인가?

4행에서 each()함수는 배열을 인자로 받아서 그 배열의 참조키와 값의 쌍을 되돌려주는 변수이다. 그리고 배열의 현재의 참조 번호(인덱스)를 증가시켜 다음 인덱스로 옮긴다. 즉, 현재 참조하고 있는 배열 $data의 참조 번호가 [0]이라면 each()를 한번 실행시킨 후의 현재 참조 번호는 [1]이 되는 것이다.

list()함수는 마치 배열인 것처럼 행동하며 인자로 받은 변수에 값을 할당하고자 할 때 쓴다. 따라서 보통 each() 함수와 같이 쓰이게 되는데 결국 4행은 연관 배열 $data에 저장되어 있는 데이터를 한 원소씩 꺼내어 이름(이철완,김현영,권칠현)은 $name이라는 변수에 강의 반(A,C,D)은 $class라는 변수에 저장하게 된다.

4행에서 while 문이 쓰인 것을 주목하자. 블록 내에서는 while 문의 조건식에 변화를 줄 만한 코드가 보이지 않는데 그것은 앞에서도 얘기한 것처럼 each()함수가 한번 실행될 때마다 알아서 배열의 참조 번호를 증가시키기 때문이다.

위 예제에서 배열의 크기가 3인 배열 변수 $data에 대한 each() 함수의 네 번째 실행 결과는 배열에 더 이상의 값이 없으므로 빈 문자열이 된다. 즉 조건식으로는 False 가 되는 것이다. 결과적으로 while 문의 조건식이 거짓이 되어 5행은 배열의 개수만큼만 실행되는 것이다.

 

참고로 2행에서 배열 변수 $data를 연관 배열 대신 스칼라 배열로 정의하여 값을 할당한 후의 실행 결과도 학인 해보기 바란다.

 

 $data = array(100,200,400,3000);

실행 결과는 다음과 같이 출력될 것이다.

 

 0학생은 100반 학생입니다.

 1학생은 200반 학생입니다.

 2학생은 400반 학생입니다.

 3학생은 3000반 학생입니다.

스칼라 배열의 경우에는 참조키의 값으로서 참조키가 아닌 배열의 참조 번호가 출력되는 것을 볼 수 있다.

 

5. BREAK 구문

Break 는 앞의 for 문 예제에서 본 것처럼 현재의 반복 루프 밖으로 빠져나가는 역할을 하는 구문이다.

 

 

 <?

   $arr = array("이철완", "김영아", "권칠현");

   $i = 0;

   while($i < sizeof($arr)) {

      if($arr[$i] == "김영아") {

         $count = $i + 1;

         echo("${count}번째 배열원소에서 발견되었습니다!<br>");

         break;

      }

      $i++;

   }

   echo("발견된 배열의 참조번호는 $i 입니다.");

 ?>   

 

[예제1.23] break 구문

 

위 예제의 실행결과는 다음과 같다.

 

 2번째 배열원소에서 발견되었습니다.

 발견된 배열의 참조번호는 1입니다.

[예제1.23]은 배열에 세 명의 이름을 저장하고서 "김영아"라는 이름이 몇 번째 배열 원소에서 발견되었는지를 출력하는 간단한 프로그램이다.

 

"김영아"라는 이름을 찾기 위해 4행에서 배열의 크기만큼 반복하는데 그 과정에서 "김영아"라는 이름을 가진 원소가 발견될 경우 그 다음의 원소는 찾을 필요가 없으므로 break 문으로 바로 while 구문을 빠져 나오게 되는 구조를 보여준다.

 

6. CONTINUE 구문

continue 구문은 루프내의 제어를 다음 차례로 넘기는 역할을 한다. 다음의 예제를 참조하자.

 

 

 <?

   $arr = array("이철완", "김영아", "권칠현");

   

   while(list($key,$value) = each($arr)) {

      if($key % 2) {

         continue;

      }

      echo("인덱스 : $key<br>");

   }

 ?>   

 

[예제1.24] continue 구문

 

위 예제에서는 5행의 % 연산자를 사용하여 배열의 인덱스가 2의 배수가 아닌 경우, 즉 홀수에 대해서만 6행이 실행되어 결과적으로 인덱스가 짝수인 값만 출력이 된다.

 

 인덱스 : 0

 인덱스 : 2

 

7. SWITCH 구문

switch 문 역시 그 문법은 C와 같다.

 

 switch (표현식) {

        case (값1) :

                표현식의 결과가 위의 값1과 같을 때 실행

        break;

        case (값2) :

                표현식의 결과가 위의 값2와 같을 때 실행

        break;

        

        default :

                표현식의 결과가 위의 어느 case와 같지 않을 때 실행

 }

여기서 값1이나 값2등은 정수나 실수, 혹은 문자열이어야 한다. 아래의 예제를 보자.

 

 

 <?

   $var = 2;

   

   switch ($var) {

      case (1) :

         echo("변수의 값은 1 입니다.");

         break;

         

      case (2) :

         echo("변수의 값은 2 입니다.");

         break;

 

      case (3) :

         echo("변수의 값은 3 입니다.");

         break;

      default :

         echo("변수의 값을 알 수 없습니다.");

   }

 ?>   

 

[예제1.25] switch 구문

 

위 예제에서 변수 $var의 값은 정수 '2'이다. 따라서 7행의 case(2)와 일치하므로 8행이 실행되고 break 문을 통해서 switch 문을 빠져 나온다. 만일 변수의 값이 '5'라고 한다면 일치하는 case가 없으므로 디폴트 실행문인 16행이 실행될 것이다.

 

8. INCLUDE 구문

include 구문은 말 그대로 인자로 전해준 외부 파일을 현재의 문서에 포함시킬 때 사용한다. 예로 PHP로 게시판을 짤 때 게시판의 처음에 공통적으로 들어가는 HTML 구문이나 게시판의 환경 설정 변수와 같이 모든 게시판 관련 PHP 프로그램에서 참조해야 하는 변수가 있는 경우에는 해당 공통 부분을 따로 외부 파일로 만들어놓고 스크립트 문서에서 필요한 위치마다 include 시키면 된다.

 

 

 <?

 

 $filename = array("first.inc", "second.inc", "third.inc");

 

 for($i = 0; $i < sizeof($filename); $i++) {

    include($filename[$i]);

 }

 

 ?>

 

[예제1.26] include 구문

 

[예제1.26]의 5행에서는 모두 세 번, 즉 include(first.inc), include(second.inc), include(third.inc) 문을 차례로 실행하여 세 파일의 내용을 파싱하게 된다.

 

 

5. 함수와 클래스

함수(FUNCTION)

1.함수의 정의 및 호출

지금까지 함수에 대한 원론적인 설명 없이도 여러분은 이미 많은 함수 코드를 보아왔다. 앞서 전역 변수와 지역변수, 정적변수가 갖는 변수의 범위와 차이에 관해 설명할 때 함수에 관한 예제 코드를 보았던 것을 기억할 것이다. PHP 에서 함수의 사용은 C나 Perl에서의 문법과 다르지 않다.

 

 function 함수이름 (인자1, 인자2) {

        // 함수의 실행문

        return 리턴값;

 }

단, PHP에서 함수를 호출하기 위해서는 반드시 호출 전에 함수가 정의되어야 한다. 이점은 C와는 다른데 아래의 예제를 보자.

 

 

 <?

   printMe("함수를 호출합니다.");

   

   function printMe($str) {

      echo("$str");

   }

   

 ?>

 

[예제1.27] 함수의 호출과 정의

 

위 예제를 실행하여 보면 "Fatal error : Call to unsupported or undefined function printme()"와 같은 에러 메시지를 받게 된다. 즉, 함수 printMe()의 정의가 2행의 호출문 보다 뒤에 있기 때문에 2행에서 함수를 호출하려고 할 때 해당 함수가 정의되어 있지 않다는 메시지가 나타나게 되는 것이다. 따라서 2행이 함수 정의 부분보다 아래에 있어야 함수의 정상적인 실행 결과로서 "함수를 호출합니다"라는 문자열이 출력될 것이다.

 

2. 함수의 리턴값

아래의 예제는 C나 Perl에서처럼 함수의 단일 리턴값을 전달받아 출력한다.

 

 

 <?

   function foo($a) {

      $b = $a * 3;

      return $b;

   }

   

   $res = foo(4);

   echo("res : $res<br>");

 ?>

 

[예제1.28] 함수의 리턴값

 

기본적으로 PHP에서는 함수의 리턴 값으로 여러 개의 값을 한꺼번에 전달할 수 없다. 그러나 아래와 같이 함수의 결과로 배열을 넘기고 list() 함수로 이를 받으면 여러 값을 한꺼번에 전달하는 효과를 줄 수 있다.

 

 

 <?

   function foo() {

      return array("이완철", "김영아", "김무현");      

   }

   

   list($name1, $name2, $name3) = foo();

   echo("$name1 / $name2 / $name3");

 ?>

 

[예제1.29] 함수의 실행 결과로 여러 값을 전달받기

 

3. 함수의 인자를 전달하는 방법

함수에 인자를 전달하는 방법은 두 가지가 있다.

 

한가지는 지금까지 보아왔던 예제의 경우처럼 함수의 인자로 값(value)을 전달하여 함수를 호출하는 방법이다.

 

 foo(12,20);

 foo("hello");

또 한 가지 방법은 함수의 인자로 값이 아닌 참조(reference)에 의한 호출을 하는 방법이다. 이는 C에서 변수의 값이 아닌 그 포인터를 넘겨 함수를 호출하는 것과 같은 개념이다. 예를 들어 인자로 전달하는 두 값을 함수 호출을 거쳐 모두 변경해야 하는 경우에는 이 참조에 의한 호출 방식을 사용해야 한다.

 

 

 <?

   function foo(&$str) {

      $str .= "world...";

   }

   

   function swap(&$a, &$b) {

      $temp = $b;

      $b = $a;

      $a = $temp;

   }

   

   $a = 10;

   $b = 15;

   echo("\$a : $a - \$b : $b<br>");

   

   swap($a,$b);

   echo("\$a : $a - \$b : $b<br>");

   

   $str = "Hello! ";

   echo("$str<br>");

   foo($str);

   echo("$str<br>");   

 ?>

 

[예제1.30] 참조에 의한 호출

 

[예제1.30]에서 6행~10행의 함수는 인자로 전달받은 두 변수의 값을 서로 바꾼다. 그런데 앞서 함수 내에서 정의된 변수는 global로 선언되지 않는 한 함수의 실행이 종료되면 그 값을 잃어버린다고 하였던 것을 기억할 것이다.

만일 6행에서 인자 앞에 '&'가 없이 swap($a,$b)과 같은 방법으로 호출된다면 이 함수는 아무런 유효한 결과도 갖지 못할 것이다. 즉, swap() 함수를 실행하기 전이나 실행한 후나 변수 $a와 $b의 값에는 변함이 없을 것이다.

 

그러나 함수 호출 후에도 인자로 전달된 두 값이 서로 바뀐 값을 그대로 저장하도록 하려면 바로 여기서 말하는 참조에 의한 호출 방식을 따라 함수를 호출해야 하며 이때 참조에 의한 호출임을 알리기 위해 인자로 전달하는 변수의 앞에 앰퍼센드(&)를 붙여야 한다.

이제 14행과 17행에서 함수 호출 전의 변수 $a 와 $b가 가지고 있던 값이 함수 호출 후 서로 바뀌어 할당된 것을 볼 수 있다. 바로 참조 호출에 의해서 이와 같은 것이 가능한 것이다.

 

클래스(CLASS)

1. 클래스의 정의

클래스는 변수와 그 변수에 관계되는 함수로 이루어진 하나의 변수형으로 다음과 같은 방식으로 정의된다.

 

 

 <?

   class Account {

      var $current_money;

      

      function save($money) {

         $this->current_money += $money;

      }

     

      function withdraw($money) {

         if($this->current_money < $money) {

            echo("잔액이 부족합니다.");

            return true;

         } else {

            $this->current_money -= $money;            

            return true;

         }      

      }

      

      function getCurrent() {

         return $this->current_money;

      }

      

   }

 

 ?>   

 

[예제1.31] 클래스 Account의 정의

 

[예제1.31]은 Account 라는 이름을 갖는 클래스를 정의하고 있으며 이 클래스를 바탕으로 생성된 객체는 현재의 잔액을 나타내는 변수와 현 계좌에 입금과 출금, 잔고 확인이 가능한 함수를 사용할 수 있게 된다.

이 클래스에 대한 객체 변수를 생성하려면 다음과 같이 new 라는 연산자를 사용한다.

 

 $accnt = new Account;

 $accnt -> save(100000);

이제 $accnt 라는 변수는 Account 라는 클래스의 변수 및 함수에 접근할 수 있는 객체 변수로서 정의되며 클래스 내 함수에 접근하여 호출하려면 '->'와 같은 지시 연산자를 사용해야 한다.

 

2. 클래스 생성자(Constructor)

또한 클래스에는 생성자(constructor)라는 함수가 있어서 새로운 클래스 객체가 생성될 때마다 자동으로 호출된다. 즉, new 라는 연산자로 새로운 객체를 생성할 때마다 이 생성자가 호출이 되는데 이 생성자 함수는 생성자임을 표시하기 위해 해당 클래스 이름과 동일한 이름을 갖는다.

 

예를 들면 위 Account 예제의 생성자는 아래와 같이 정의할 수 있다.

 

 function Account($defVal = 10000) {  // 초기값은 지정해주지 않으면

         $this->current_money = $defVal;       // 100000원으로 할당

      }

[예제1.32] 클래스 Account의 생성자 정의

 

1행에서 '$defVal = 10000'은 클래스 객체를 생성할 때 아무런 값을 지정해주지 않으면 디폴트값으로 current-money 변수에 10000이 할당된다는 것을 의미한다. 여기서 this라고 하는 것이 보이는데 이는 new를 통해서 생성된 객체를 의미한다.

 

아래와 같이 Account의 객체 $accnt를 생성했다고 하자.

 

 

 <?

   class Account {

      var $current_money;

      

      function Account($defVal = 10000) {

         $this->current_money = $defVal;

      }

      

      function save($money) {

         $this->current_money += $money;

      }

     

      function withdraw($money) {

         if($this->current_money < $money) {

            echo("잔액이 부족합니다.");

            return true;

         } else {

            $this->current_money -= $money;            

            return true;

         }      

      }

      

      function getCurrent() {

         return $this->current_money;

      }

      

   }

 

   $accnt = new Account(12500);

   $current = $accnt->getCurrent();

   echo("현재 금액은 $current 원 입니다.<br>");

   $accnt->save(100000);

   $accnt->withdraw(70000);

   $current = $accnt->getCurrent();

   echo("현재 금액은 $current 원 입니다.");

   

 ?>   

   

[예제1.33] 클래스 Account 객체의 생성

 

1행에서는 new 연산자를 사용하여 $accnt 라는 하나의 새로운 계좌를 개설했다고 생각하면 된다. 계좌가 개설됨과 동시에 생성자인 Account() 함수가 호출되는데 1행에서 12,500원을 초기 값으로 지정하였으므로 초기 잔고가 12,500원이 된다. 4행에서는 현 계좌에 100,000원을 입금하였고 5행에서는 현 계좌에서 70,000원을 인출하였다. 물론 [예제1.31]에서 잔고가 인출하려는 금액보다 적으면 인출이 이루어지지 않는다. 6행에서 현 계좌의 잔고를 출력하면 물론 42,500원이 남는다. 이제 클래스를 이용한 객체의 생성과 조작에 대한 이해가 되었을 것이다.

 

3. 클래스의 계승(상속)

C++과 같은 객체지향 방식의 프로그래밍에 경험이 있다면 클래스에 계승하여 또 다른 클래스를 만들 수 있다는 것을 알 것이다. PHP에서도 물론 가능한 일이다. [예제1.34]를 보자.

 

   

   class Named_Account extends Account {

      var $owner;

      

      function Named_Account($defVal = 25000) {

         $this->current_money = $defVal;

      }      

      

      function set_owner($username) {

         $this->owner = $username;

      }

      

      function getOwner() {

         return $this->owner;

      }

   }

 

[예제1.34] 클래스의 계승

 

1행을 보면 extends 라는 단어가 보인다. 이 extends라는 키워드가 클래스의 계승을 위한 선언자라고 할 수 있다.

 

1행의 코드는 앞에서 정의한 Account 클래스를 계승하여 새로운 자식 클래스인 Named_Account 클래스를 정의한다. extends의 오른쪽에는 부모 클래스를 왼쪽에는 부모 클래스를 계승하여 정의될 자식 클래스를 적어준다. 부모 클래스로부터 계승된 자식 클래스는 부모 클래스의 모든 변수와 함수를 상속받는다.

 

위 예제에서 Named_Account 클래스는 Account 클래스를 계승하여 정의되었으므로 Account 클래스가 가지고 있는 변수($current_money)와 함수(save(), withdraw(),getCurrent())를 그대로 사용할 수 있게 되며 Named_Account 클래스에만 요구되는 변수($owner)와 함수(set_owner(), getOwner())는 추가적으로 정의해 주기만 하면 된다.

 

 1      $myaccnt = new Named_account;

 2      $myaccnt -> set_owner("이완철");

 3      $current = $myaccnt->getCurrent();

 4      $name = $myaccnt->getOwner();

 5      echo("[$name]님 계좌의 잔고는 현재 ${current}원입니다.");

위 예제의 실행 결과는 다음과 같다.

 

 [이완철]님 계좌의 잔고는 현재 25000원입니다.

이제 클래스가 얼마나 유용하게 사용될 수 있는지 알게 되었으리라 생각된다.

 

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.