C++ Programming

Similar documents
C++ Programming

C++ Programming

Microsoft PowerPoint - additional01.ppt [호환 모드]

슬라이드 1

C++ Programming

C++ Programming

C++ Programming

chap10.PDF

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

슬라이드 1

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - Chapter 1-rev

Microsoft PowerPoint - 08_(C_Programming)_(Korean)_Preprocessing

1. 표준입출력 C++ : C의모든라이브러리를포함 printf, scanf 함수사용가능예 : int, double, 문자열값을입력받고출력하기 #include <cstdio> int ivar; double dvar; char str[20]; printf("int, dou

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

Microsoft PowerPoint - C++ 5 .pptx

PowerPoint Template

금오공대 컴퓨터공학전공 강의자료

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

Microsoft PowerPoint - Chapter 6.ppt

설계란 무엇인가?

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

C프로-3장c03逞풚

Microsoft PowerPoint - 07_(C_Programming)_(Korean)_Composite_Data_Types

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - [2009] 02.pptx

PowerPoint 프레젠테이션

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - chap11-포인터의활용.pptx

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

PowerPoint Template

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - additional06.ppt [호환 모드]

11장 포인터

Microsoft PowerPoint - chap12-고급기능.pptx

Visual C++ & OOP Fundamentals ( 2005/1/31~2005/2/4)

Microsoft PowerPoint - 8ÀÏ°_Æ÷ÀÎÅÍ.ppt

PowerPoint Presentation

untitled

설계란 무엇인가?

구조체정의 자료형 (data types) 기본자료형 (primitive data types) : char, int, float 등과같이 C 언어에서제공하는자료형. 사용자정의자료형 (user-defined data types) : 다양한자료형을묶어서목적에따라새로운자료형을

설계란 무엇인가?

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

Microsoft PowerPoint - additional08.ppt [호환 모드]

Microsoft PowerPoint - Chap12-OOP.ppt

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - chap06-5 [호환 모드]

11장 포인터

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

PowerPoint 프레젠테이션

Microsoft PowerPoint - additional03.ppt [호환 모드]

K&R2 Reference Manual 번역본

BACK TO THE BASIC C++ 버그 헌팅: 버그를 예방하는 11가지 코딩 습관

02장.배열과 클래스

쉽게 풀어쓴 C 프로그래밍

프입2-강의노트-C++배경


<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

제 1 강 희망의 땅, 알고리즘

초보자를 위한 C# 21일 완성

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

1 장 C 언어복습 표준입출력배열포인터배열과포인터함수 const와포인터구조체컴파일러사용방법 C++ 프로그래밍입문

PowerPoint Presentation

BMP 파일 처리

080629_CFP °ø°³¿ë.hwp

Microsoft PowerPoint - Chapter 10.ppt

<432B2BC7C1B7CEB1D7B7A1B9D628BABBB9AE5FC3D6C1BE295B315D2E687770>

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

프입2-강의노트-C++기초

Microsoft PowerPoint - 08-C-App-19-Quick-Preprocessor

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - 05장(함수) [호환 모드]

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

4 장클래스와객체 클래스와객체 public과 private 구조체와클래스객체의생성과생성자객체의소멸과소멸자생성자와소멸자의호출순서디폴트생성자와디폴트소멸자멤버초기화멤버함수의외부정의멤버함수의인라인함수선언 C++ 프로그래밍입문

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - ch07 - 포인터 pm0415

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

Slide 1

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

Microsoft PowerPoint - chap-11.pptx

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

Slide 1

1. 인라인함수 예 : x, y 값중최소값을반환하는매크로와함수작성 // 매크로로구현한경우 #define MIN(X, Y) ((X) < (Y)? (X) : (Y)) X, Y 각각을괄호 ( ) 안에넣는이유는? // 함수로구현한경우 cout << MIN(4, 5) << en

KNK_C_05_Pointers_Arrays_structures_summary_v02

Microsoft PowerPoint - 제11장 포인터

윤성우의 열혈 TCP/IP 소켓 프로그래밍

Microsoft PowerPoint - 08_C_Language_Preprocessor

Algorithms

PowerPoint 프레젠테이션

The C++ Programming Language 4 장타입과선언 4.11 연습문제 Hello,world! 프로그램을실행시킨다. 프로그램이컴파일되지않으면 B3.1 을참고하자. #include<iostream> //#include 문, 헤더파일, 전처리지시

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

1. 클래스와배열 int 형배열선언및초기화 int ary[5] = 1, 2, 3, 4, 5 ; for (int i = 0; i < 5; i++) cout << "ary[" << i << "] = " << ary[i] << endl; 5 장클래스의활용 1

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

Transcription:

C++ Programming C 언어에서 C++ 언어로의전환 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com

목 차 C++ 언어개요 C 언어기반의 C++ 2

C++ 언어개요 C++ 언어개요 C++ 언어의역사및특징 통합개발환경 C 언어기반의 C++ 3

C++ 언어의역사 C++ 언어의역사및특징 1979 년, C with Classes AT&T 벨연구소의비야네스트롭스트룹 (Bjarne Stroustrup) 에의하여개발 객체지향성이더해진 C 언어의확장형 클래스개념과엄격한데이터확인 인라인 (inlining) 그리고디폴트인자 (default argument) Cfront : 최초의 C++ 컴파일러 1983 년, C++ 로이름을변경하여발표 가상함수 (virtual functions) 함수와연산자오버로딩 (function name and operator overloading) 단일라인주석 : // (two forward slashes) 4

C++ 언어의역사및특징 (cont d) C++ 언어의역사 (cont d) 1989 년, C++ 2.0 다중상속 (multiple inheritance) 추상클래스 (abstract classes) 동적멤버함수 (static member functions) 상수멤버함수 (const member functions) 보호된멤버 (protected members) 1990 년, The Annotated C++ Reference Manual 템플릿 (templates) 예외처리 (exception handling) 네임스페이스 (namespace) 새로운형변환 (new casts) 부울형 (Boolenan type) 5

C++ 언어의역사및특징 (cont d) C++ 언어의표준화과정 1998 년, C++98 : ISO/IEC 14882:1998 2003 년, C++03 : ISO/IEC 14882:2003 2005 년, TR1 (Library Technical Report 1) 오늘날대부분의 C++ 컴파일러에서지원 C++0x : ISO/IEC JTC1/SC22/WG21 C++ 표준화위원회 C++ 프로그래밍언어를위한새로운버전의비공식적인명칭 TR1 라이브러리를포함하여 C++ 표준라이브러리를확장 2010년 03월, 최신드레프트 (draft) 문서발표 : N3092 2011년말에표준완료후발표예정 C++0x 표준안이완료된이후에 TR2를계획 6

통합개발환경 통합개발환경 IDE (Integrated Development Environment) 코딩, 디버그, 컴파일, 배포등프로그램개발에관련된모든작업을하나의프로그램안에서처리하는환경을제공하는소프트웨어 종래의소프트웨어개발에서는컴파일러, 텍스트편집기, 디버거등을따로사용했다. Microsoft Visual C++ 6.0 : 상업용 Visual Studio Express Free Software http://www.microsoft.com/express/ Dev-C++ Free Software(GNU GPL), Open Source http://www.bloodshed.net/dev/ 7

C++ 언어개요 C 언어기반의 C++ C++ 스타일의입출력 데이터형과변수 배열, 문자열, 구조체 C++ 스타일의함수 네임스페이스 참조 동적메모리할당 C 언어기반의 C++ 8

C++ 스타일의입출력 간단한 C++ 프로그램구조 : 과거스타일 /* */ 간단한 C++ 프로그램구조작성자 : 서두옥콘솔출력 (Console Output) : cout 과거스타일!!! #include <iostream.h> cout << "Hello World! << endl; 9

C++ 스타일의입출력 (cont d) 간단한 C++ 프로그램구조 : 현재스타일 /* */ 간단한 C++ 프로그램구조 작성자 : 서두옥 현재스타일!!! std::cout << "Hello World! \n" << std::flush; std::cout << "Hello World!" << std::endl; 10

C++ 스타일의입출력 (cont d) 프로그램예제 : 다양한데이터출력 char ch = 'A'; int i = 10; double d = 10.12345; std::cout << "ch : " << ch << std::endl; std::cout << "i : " << i << std::endl; std::cout << "d : " << d << std::endl; std::cout << " 정수형상수 : " << 10 << std::endl; std::cout << " 실수형상수 " << " : " << 3.14 << std::endl; std::cout << " 문자형상수 : " << 'A' << std::endl; std::cout << " 문자열상수 : " << "Hello World!!!" << std::endl; 11

C++ 스타일의입출력 (cont d) 프로그램예제 : 데이터입력및출력 int a, b, res; std::cout << " 두정수입력 : " ; std::cin >> a >> b; res = a + b; std::cout << a << " + " << b << " = " << res << std::endl; 12

데이터형과변수 새로운형태의자료형 : bool bool형변수의상태는true와 false 둘중하나가될수있다. std::cout << true << std::endl; std::cout << false << std::endl; 13

데이터형과변수 (cont d) 프로그램예제 : 새로운자료형 -- bool bool state = false; if(state == true) std::cout << " 참!!!" << std::endl; else std::cout << " 거짓!!!" << std::endl; 14

변수 (variable) 데이터형과변수 (cont d) 변수이름의길이에는제한이없다. C 에서변수이름의길이제한 : 63 번째문자까지만인식 지역변수선언의위치제한이없다. int i = 100; std::cout << i << std::endl; int j = 200; std::cout << j << std::endl; 15

데이터형과변수 (cont d) 프로그램예제 : 제한없는지역변수의선언 int num; std::cout << " 원하는단 : "; std::cin >> num; for( int i = 1; i<10; i++) std::cout << num << " * " << i << " = " << num * i << std::endl; 16

데이터형과변수 (cont d) 명시적형변환 (explicit type conversion) cast 수식연산자 (cast expression operator) 임의로어떤형식에서다른형식으로데이터를변환시킨다. int i; double d = 3.14159; // i = (int)d; i = int(d); // C++ 에서만가능 std::cout << "i : " << i << std::endl; std::cout << "d : " << d << std::endl; 17

배열, 문자열, 구조체 C 언어스타일의문자열 (string) C++ 에서제공하는문자열조작함수를사용 : <cstring> #include <cstring> char str[] = "Hi~ Clickseo!!!"; char copy[1024]; int len = strlen(str); strcpy(copy, str); std::cout << " 길이 : " << len << std::endl; std::cout << "str : " << str << std::endl; std::cout << "copy : " << copy << std::endl; 18

배열, 문자열, 구조체 구조체 (structure) 구조체 (cont d) C++ 에서는구조체의태그 (tag) 가곧자료형이다. struct ; _score char int float name[12]; kor, eng, math, tot; ave; _score temp; 19

배열, 문자열, 구조체 프로그램예제 : 구조체의태그를이용한자료형 구조체 (cont d) struct ; _score char int float name[12]; kor, eng, math, tot; ave; _score temp; std::cout << " 이름 : "; std::cout << " 국어 : "; std::cout << " 영어 : "; std::cout << " 수학 : "; std::cin >> temp.name; std::cin >> temp.kor; std::cin >> temp.eng; std::cin >> temp.math; temp.tot = temp.kor + temp.eng + temp.math; temp.ave = float(temp.tot)/3; std::cout << "\n ### 출력결과 ###" << std::endl; std::cout << temp.name << " " << temp.kor << " " << temp.eng << " " << temp.math << " " << temp.tot << " " << temp.ave << std::endl; 20

C++ 스타일의함수 함수다중정의 (Function Overloading) C++ 에서함수들이동일한이름을사용할수있는기능 단, 인자의종류 ( 매개변수의자료형이나개수 ) 는달라야한다. int ADD(int, int); double ADD(double, double); ADD(10, 20); ADD(10.5, 20.5); int ADD(int a, int b) return a + b; double ADD(double a, double b) return a + b; 21

C++ 스타일의함수 (cont d) 디폴트인자 (Default Arguments) 따로값을지정해주지않은경우에선택하는인자의값 함수호출시적당한값을모르는경우에사용 매번함수를호출할때마다똑같은인자의값을적어주는것을피하는용도로사용 디폴트인자의제한 : 디폴트인자는오른쪽끝에모여있어야한다. int ADD(int, int = 0); std::cout << ADD(10) ) << std::endl; std::cout << ADD(10, 20) << std::endl; int ADD(int a, int b) return a + b; 22

C++ 스타일의함수 (cont d) 함수오버로딩 vs. 디폴트인자 int ADD(int a); int ADD(int a, int b = 0); std::cout << ADD(10) << std::endl; // error int ADD(int a) return a; int ADD(int a, int b) return a + b; 23

C++ 스타일의함수 (cont d) C 언어스타일의 in-line 화 : 매크로함수 프로그램을컴파일하기전에전처리기에의해정의된코드로치환 #define ADD(a, b) ((a) + (b)) #define ADD(a, b) ((a) + (b)) int sum; int sum; sum = ADD(10, 20); sum = (10) + (20); 적용전 preprocessing (macro expansion) 적용후 24

C++ 스타일의함수 (cont d) C++ 스타일의 in-line 화 : 인 - 라인함수 (in-line Function) 키워드 inline을이용한함수의 in-line화는컴파일러에의해처리 inline int ADD(int, int); 컴파일러에의해처리 int sum; sum = ADD(10, 20); std::cout << " 합계 : " << sum << std::endl; inline int ADD(int a, int b) return a + b; 25

네임스페이스의등장배경 네임스페이스 같은이름의함수를포함하면컴파일시문제발생 void OUTPUT(void) std::cout << "Hello World!!!" << std::endl; return; // error C2084: function 'void cdecl OUTPUT(void)' already has a body void OUTPUT(void) std::cout << "Hi~ Clickseo" << std::endl; return; OUTPUT(); 26

네임스페이스 (cont d) 네임스페이스 (namespace) 특정영역 ( 공간 ) 의범위를지정하고이름을붙여준것 이름공간이다르면 namespace A 같은이름의변수나함수의선언이허용된다. void OUTPUT(void) std::cout << "Hello World!!!" << std::endl; return; namespace B void OUTPUT(void) std::cout << "Hi~ Clickseo" << std::endl; A::OUTPUT(); B::OUTPUT(); return; 범위지정연산자 (scope resolution operator) 27

네임스페이스 (cont d) 네임스페이스에별칭부여 네임스페이스의이름이너무긴경우에는간단한별명을붙여준후에, 그별명을대신사용할수잇다. using std::cout; using std::endl; namespace Clickseo_namespace_data_temp int temp; namespace Click = Clickseo_namespace_data_temp; cout << "temp : " << Click::temp << endl; 28

프로그램예제 : 중첩된네임스페이스 using std::cout; using std::endl; namespace Clickseo namespace TEMP1 int a = 10; 네임스페이스 (cont d) namespace TEMP2 int a = 20; cout << "Clickseo::TEMP1::a : " << Clickseo::TEMP1::a << endl; cout << "Clickseo::TEMP2::a : " << Clickseo::TEMP2::a << endl; 29

네임스페이스 (cont d) 이름없는네임스페이스 다른파일에서접근제한 static 키워드를사용한전역변수나함수를정의한경우와동일한효과 using std::cout; using std::endl; using std::cout; using std::endl; namespace extern void OUTPUT(void); int temp = 10; extern int temp; void OUTPUT(void) cout << "temp : " << temp << endl; cout << "temp : " << temp << endl; OUTPUT(); return; 1.cpp 2.cpp 30

분할컴파일 namespace A void OUTPUT(void) 네임스페이스 (cont d) namespace A void OUTPUT(void); namespace B void OUTPUT(void); id) A::OUTPUT(); B::OUTPUT(); main.cpp std::cout << "Hello World!!!" << std::endl; return; namespace B void OUTPUT(void) std::cout << "Hi~ Clickseo" << std::endl; 1.cpp return; 2.cpp 31

프로그램예제 : 데이터입출력 네임스페이스 (cont d) int temp; std::cout << " 정수입력 : ; std::cin >> temp; namespace std cout??? cin??? endl??? std::cout << "temp : " << temp << std::endl; 32

네임스페이스 (cont d) 프로그램예제 : 데이터입출력 -- using using std::cout; using std::cin; using namespace std; using std::endl; int temp; cout << " 정수입력 : ; cin >> temp; cout << temp : " << temp << endl; 33

프로그램예제 : 지역변수와전역변수 네임스페이스 (cont d) using using std::cout; std::endl; int temp; int temp = 10; ::temp++; cout << " 지역변수 : " << temp << endl; cout << " 전역변수 : " << ::temp << endl; 34

참 조 참조 (Reference) 이름이존재하는메모리공간에하나의이름을더부여하는행위 참조는일종의별칭 (alias) 만드는방법 : 대상개체의형을적고참조연산자 (&) 와참조의이름을적으면된다. 참조는만드는순간초기화되어야한다 ( 단, 상수로초기화할수는없다 ). int a = 10; 1. 메모리공간할당 2. 이름부여 1000 1001 int *pa = &a; a 10 1002 int &ra = a; 1003 1. 이름하나더부여 1004 35

참 조 (cont d) 프로그램예제 : 참조 (reference) 의이해 using using std::cout; std::endl; int a = 10; int &ra = a; a++; cout << a : " << a << endl; cout << "ra : " << ra << endl; ra++; cout << a : " << a << endl; cout << "ra : " << ra << endl; 36

참 조 (cont d) 참조에의한호출 (Call by reference) using using std::cout; std::endl; void SWAP(int &, int &); int a = 10, b = 20; a b 10 20 cout << "a : " << a << ", b : " << b << endl; SWAP(a, b); cout << "a : " << a << ", b : " << b << endl; void SWAP(int &ra, int &rb) int temp; temp = ra; ra = rb; rb = temp; 37

참 조 (cont d) 프로그램예제 : 부담스러운 Call-by-value using std::cout; using std::endl; struct _score char int float ; name[12]; kor, eng, math, tot; ave; data 서두옥 70 80 90 240 70.0 void OUTPUT(_score); 서두옥 70 80 90 240 70.0 _score data = " 서두옥 ", 70, 80, 90, 240, 80.0; OUTPUT(data); d void OUTPUT(_score temp) cout << " 이름 : " << temp.name << endl; cout << " 국어 : " << temp.kor << endl; cout << " 영어 : " << temp.eng << endl; cout << " 수학 : " << temp.math << endl; cout << " 총점 : " << temp.tot tot << endl; cout << " 평균 : " << temp.ave << endl; temp 38

참 조 (cont d) 프로그램예제 : Call-by-reference using std::cout; using std::endl; struct _score char int float ; name[12]; kor, eng, math, tot; ave; void OUTPUT(const _score &); _score data = " 서두옥 ", 70, 80, 90, 240, 80.0; OUTPUT(data); d void OUTPUT(const _score &temp) temp cout << " 이름 : " << temp.name << endl; cout << " 국어 : " << temp.kor << endl; cout << " 영어 : " << temp.eng << endl; cout << " 수학 : " << temp.math << endl; cout << " 총점 : " << temp.tot tot << endl; cout << " 평균 : " << temp.ave << endl; 서두옥 70 80 90 240 70.0 data 39

동적메모리할당 C 언어스타일의동적메모리할당 동적메모리관리에쓰이는 4가지함수 표준라이브러리헤더파일 <stdlib.h> 에서찾을수있다. 메모리할당 : malloc, calloc, realloc 메모리해제 : free Memory Management malloc calloc realloc free 40

동적메모리할당 (cont d) C++ 스타일의동적메모리할당 : new, delete 연산자 new 연산자 : 동적메모리할당 메모리할당실패시 NULL 포인터반환 int *p = new int; int *arr = new int[size]; // 정수하나를저장할메모리할당 // 정수를 size 개수만큼저장할메모리할당 delete 연산자 : 동적메모리해제 delete p; delete []arr; // 할당된메모리공간해제 // 할당된메모리공간이배열일경우 41

동적메모리할당 (cont d) 프로그램예제 : 동적메모리할당 using namespace std; int i, size; cout << " 입력할학생수 : "; cin >> size; int *arr = new int[size]; if(arr == NULL) cout << " 메모리할당실패!!! " << endl; return -1; cout << "\n ### 데이터입력 ###" << endl; for(i=0; i<size; i++) cout << i << " : "; cin >> *(arr+i); cout << "\n ### 결과출력 ###" << endl; for(i=0; i<size; i++) cout << i << " : " << *(arr+i) << endl; delete []arr; 42

참고문헌 [1] 윤성우, 열혈강의 C++ 프로그래밍, 프리렉, 2007. [2] 이현창, 뇌를자극하는 C++ 프로그래밍, 한빛미디어, 2008. [3] H.M. HM Deitel, P. J. Deitel, C++ C HOW TO PROGRAM : 6th Edition, Prentice Hall, 2009. [4] 서두옥, 이동호 ( 감수 ), 또하나의 C : 프로그래밍은셀프입니다, 프리렉, 2011. [5] Wikipedie, http://www.wikipedia.org/. 이강의자료는저작권법에따라보호받는저작물이므로무단전제와무단복제를금지하며, 내용의전부또는일부를이용하려면반드시저작권자의서면동의를받아야합니다. Copyright Clickseo.com. All rights reserved. 43