분류 전체보기 254

[C++] 30. 무효화

[C++] 무효화 기반 클래스에서 정의한 멤버 메서드와 같은 이름으로 파생 형식에서 정의하면 어떻게 동작할까요? 파생 클래스에서 기반 클래스에 정의한 이름과 같은 이름으로 메서드를 만들면 기반 클래스에 정의한 메서드를 무효화합니다. 예를 들어 일반 프로그래머가 있고 EH 프로그래머가 있는데 대부분의 행위에 있어 EH 프로그래머는 일반 프로그래머와 같게 일을 한다고 가정합시다. 하지만 일반 프로그래머가 프로그래밍을 할 때 “생각하면서 코딩을 한다.”와 같이 하는데 EH 프로그래머가 프로그래밍을 할 때는 “생각한 것을 문서화 하고 이를 보면서 코딩을 한다.”고 해 볼게요. 이 때 일반 프로그래머의 프로그래밍이라는 메서드를 무효화합니다. //무효화 #include #include using namespace ..

[C++] 29. 접근 지정자 protected

[C++] 접근 지정자 protected 이번에는 접근 지정자 protected에 관해 알아보기로 해요. 캡슐화에서 접근 지정자를 사용하여 멤버의 가시성을 설정할 수 있다는 것을 다뤘었죠. private으로 접근 지정한 것은 형식 내부에서 사용할 수 있고 public으로 지정하면 모든 곳에서 접근할 수 있다는 것은 이미 소개하였습니다. 파생 클래스를 정의하면 기반 형식의 멤버를 상속받는다고 하였는데 접근 지정을 private으로 설정한 멤버는 어떻게 접근할까요? priavate으로 접근 지정한 멤버는 파생 클래스에서도 접근할 수 없습니다. 분명히 상속받아 개체 내부에 있지만 가시성이 없어 접근할 수 없습니다. 이럴 때는 기반 클래스에서 protected로 접근 지정하여 파생 클래스에서 접근할 수 있게 해..

[C++] 28. 파생 개체의 생성과 소멸 과정

[C++] 파생 개체의 생성과 소멸 과정 이번에는 일반화 관계에 있는 파생 클래스 형식의 개체를 생성과 소멸 과정을 알아보기로 할게요. 파생 클래스 형식의 개체를 생성할 때는 기반 클래스를 생성한 후에 파생 클래스를 생성합니다. 실제 생성한 개체에는 기반 클래스에 정의한 멤버도 만들어지는 것이죠. 그리고 소멸할 때는 생성 과정의 역으로 파생 클래스의 소멸자를 수행한 후에 기반 클래스의 소멸자를 수행합니다. 다음은 이를 확인하기 위해 기반 클래스 음악가와 파생 클래스 피아니스트 클래스에 생성자와 소멸자를 추가하여 어떤 순서로 수행하는지 확인하기 위한 출력문을 작성한 예제 코드입니다. //파생 개체의 생성과 소멸 과정 #include #include using namespace std; class Music..

[C++] 27. 상속(일반화 관계) 개요

[C++] 상속(일반화 관계) 개요 이제 OOP의 세 가지 주요 특징인 캡슐화, 상속, 다형성 중에 상속에 관해 알아볼게요. 상속은 다른 형식에 정의한 것을 마치 자신에서 정의한 것처럼 만드는 OOP의 특징입니다. 이러한 관계를 UML에서는 일반화 관계라 부르고 삼각형과 실선으로 관계를 표시합니다. 일반화 관계는 “피아니스트는 음악가이다.”처럼 “이다.(is a)”로 나타낼 수 있는 관계입니다. 이 때 음악가처럼 일반적인 클래스를 기반 클래스라 말하며 피아니스트처럼 특수한 클래스를 파생 클래스라 부릅니다. C++에서 일반화 관계를 표현할 때 파생 문법을 이용합니다. 파생 문법은 파생 클래스를 정의할 때 기반 클래스를 다음처럼 나타냅니다. class Pianist : public Musician { }; ..

[C++] 26. 캡슐화 최종 실습 – 구체적 구현

[C++] 캡슐화 최종 실습 – 구체적 구현 이제 마지막으로 메서드를 구체적으로 구현합시다. 약속한 기능을 구현하면서 필요하면 별도의 메서드를 추가하세요. 여기에서 추가하는 메서드는 다른 형식에서 호출해서 사용하지 않는 메서드이므로 접근 지정을 private으로 지정하세요. 특히 멤버 필드의 값이 특정 범위 내에 있어서 필터링을 요구하면 설정자 메서드를 추가하여 구현하세요. 설정자 메서드에서 멤버 필드 값을 범위 내에서 조절하는 기능을 작성하면 버그를 만들 확률을 줄일 수 있습니다. 여러분께서 각자 구현해 본 후에 비교해 보세요. 여기에서는 지력, 체력, 스트레스, 연속으로 공부한 횟수는 범위가 정해져 있습니다. 이에 이들 멤버 필드 값을 설정하는 설정자를 추가합시다. 물론 이들 메서드는 형식 외부에서 ..

[C++] 23. 캡슐화 최종 실습 – 멤버 필드 24. 멤버 메서드 25. 테스트 코드 작성

[C++] 캡슐화 최종 실습 – 멤버 필드 23. 캡슐화 최종 실습 – 멤버 필 먼저 클래스 이름은 Student로 정할게요. 주민 번호는 변하지 않으므로 상수화 멤버 필드로 정의하세요. const int pn;//주민번호 주민 번호를 순차적으로 부여하기 위해 정적 멤버 필드로 가장 최근에 부여한 주민 번호가 필요하겠죠. static int last_pn;//가장 최근에 부여한 주민 번호 이름은 문자열로 정하면 되겠죠. string name;//이름 지력과 체력, 스트레스, 연속으로 공부한 횟수는 정수 형식으로 정의하면 되겠네요. int iq;//지력 int hp;//체력 int stress;//스트레스 int scnt;//연속으로 공부한 횟수 최소값, 최대값, 디폴트 값은 형식 내에 정해진 값이므로 정..

[C++] 22. 캡슐화 최종 실습 – 시나리오

[C++] 캡슐화 최종 실습 – 시나리오 이번에는 단계별로 캡슐화를 실습해 보기로 해요. 여러분께서는 각 단계별로 먼저 직접 해 본 후에 비교하시기 바랍니다. 여기에서는 다음의 시나리오를 캡슐화 실습할 거예요. 다음 내용처럼 학생 데이터를 정의하시오. 1. 멤버 필드 주민번호: 순차적 부여 이름: 생성 시 전달 지력:100(최소 0, 최대 200) 체력: 100 (최소 0, 최대 200) 스트레스: 0 (최소 0, 최대 100) 연속으로 공부한 횟수: 0 (0,5), 공부를 하면 1 증가, 그 외의 행위를 하면 0으로 리셋, scnt로 부름 2. 접근 가능한 멤버 메서드(접근 지정이 public) 공부하다(체력 5소모, 지력: scnt 만큼 증가, 스트레스: 2감소) 강의를 받다.(체력 3소모, 지력: ..

[C++] 21. 캡슐화 실습2 – 학생

[C++] 캡슐화 실습 – 학생 클래스 이번 실습은 학생 클래스를 캡슐화하는 실습입니다. 이번에는 시나리오를 보고 클래스 다이어그램을 작성한 후에 이를 구현해 보기로 해요. 1. 시나리오 학생은 생성할 때 학생 이름을 전달받습니다. 그리고 학생 번호는 순차적으로 부여합니다. 이 외에 학생의 국어, 영어, 수학 성적을 -1로 설정합니다. 학생을 생성한 후에는 학생의 국어, 영어, 수학 성적을 입력할 수 있습니다. 만약 학생 성적이 0에서 100을 벗어나면 -1로 설정합니다. 학생 이름과 번호, 각 과목의 성적과 총점 및 평균을 확인할 수 있습니다. 그리고 전체 학생 수를 확인할 수 있습니다. 그리고 학생 정보를 출력하는 기능을 제공합니다. 2. 클래스 다이어그램으로 나타내기 먼저 클래스 이름을 결정해야겠죠..

[C++] 20. 캡슐화 실습1 – 복소수

[C++] 캡슐화 실습 – 복소수 캡슐화 실습을 해 보기로 해요. 이번에는 복소수 클래스 캡슐화예요. OOP 프로그래밍 할 때 구현 이전의 작업과 이후의 많은 작업을 CASE 도구로 UML로 표현할 때가 많아요. CASE 도구에는 Rose, Together, StarUML 등이 있습니다. 이 책에서는 CASE 도구를 사용하는 방법을 구체적으로 다루지는 않지만 많은 곳에서 UML로 작성한 다이어그램으로 실습할 내용 등을 소개할 거예요. UML로 클래스를 표현할 때는 세 칸으로 구성한 사각형으로 나타내요. 맨 위는 클래스 이름, 두 번째는 멤버 필드, 마지막 칸은 멤버 메서드를 표현합니다. 멤버 앞에 +(public), -(private), #(protected)은 접근 지정자를 나타내죠. 그리고 멤버 필드..

[C++] 19. 특별한 멤버 this

[C++] 특별한 멤버 this 개체의 메서드에서는 특별한 키워드 this를 사용할 수 있어요. this는 컴파일러에 의해 자동으로 캡슐화하는 정적 멤버입니다. this 키워드는 개체 자신을 나타내며 클래스 형식의 포인터입니다. this 키워드를 통해 접근할 수 있는 것은 클래스에 캡슐화한 멤버입니다. 따라서 멤버 필드와 지역 변수와 같은 이름이어도 this 키워드로 접근하면 멤버 필드를 접근합니다. 참고로 전역 변수와 지역 변수, 멤버 필드의 이름이 같을 때 전역 변수는 스코프 연산자(::)와 함께 사용할 수 있고 멤버 필드는 this 키워드와 함께 사용할 수 있습니다. 지역 변수는 변수명만 가지고 접근할 수 있죠. 물론 이름이 다르다면 스코프 연산자(::)나 this를 굳이 사용할 필요는 없어요. /..

[C++] 18. 상수화 멤버

[C++] 상수화 멤버 클래스를 정의할 때 멤버 필드 앞에 const를 붙여서 선언한 것을 상수화 멤버라고 말합니다. 비 정적 상수화 멤버 필드는 생성자에서 반드시 초기화 기법으로 상수 값을 설정해야 합니다. 그리고 정적 상수화 멤버 필드는 클래스 외부 선언에서 초기값을 지정해야 합니다. class Student { const int num; //비 정적 상수화 멤버 필드 string name; int hp; static const int max_hp; //정적 상수화 멤버 필드 public: Student(int _num,string _name); }; const int Student::max_hp=200; //정적 상수화 멤버 필드 초기값 지정 Student::Student(int _num,strin..

[C++] 17. 정적(static) 멤버

[C++] 정적(static) 멤버 멤버의 종류를 나누는 기준은 여러 기준이 있어요. 그 중에 하나가 해당 멤버가 개체의 멤버인지 혹은 형식의 멤버인지로 구분하는 거예요. 이러한 기준으로 구분하면 형식의 멤버와 개체의 멤버로 구분할 수 있어요. 형식의 멤버는 static 키워드를 사용하여 선언해서 정적(static) 멤버, 개체의 멤버를 비정적 멤버라 불러요. C++에서 정적 멤버는 형식 정의 내에서 해당 멤버를 static 키워드를 붙여 선언합니다. 정적 멤버들은 개체마다 제공하는 멤버가 아니라 형식 내에 유일한 멤버예요. 학생을 생성할 때 학생의 일련번호를 차례대로 부여한다고 할 때 학생의 일련번호는 각각의 학생마다 별도로 유지해야죠. 하지만 이번에 생성할 학생에게 어떠한 일련번호를 부여할 것인지는 ..

[C++] 16. 생성자, 소멸자

[C++] 생성자, 소멸자 이번에는 개체를 생성할 때 수행하는 생성자와 소멸할 때 수행하는 소멸자를 알아볼게요. 생성자는 개체를 생성할 때 수행할 기능을 정의하는 특별한 메서드입니다. 생성자는 반환 형식을 개발자가 정할 수 없으며 메서드 이름을 형식 이름과 같게 정의합니다. 그리고 소멸자는 개체를 소멸할 때 수행할 기능을 정의하는 특별한 메서드예요. 소멸자도 반환 형식을 개발자가 정할 수 없으며 메서드 이름은 ~형식 이름이예요. #pragma once //Student.h class Student { public: Student(void);//생성자 ~Student(void);//소멸자 }; C++ 언어에세 생성자는 개체가 만들어지는 시점에 동작합니다. 예를 들어 Student stu; 처럼 클래스 형식..

[C++] 15. 접근 지정자

[C++] 접근 지정자 이번에는 멤버의 가시성을 설정하는 접근 지정자에 관해 알아볼게요. C언어의 구조체는 모든 곳에서 모든 멤버를 접근할 수 있어요. 이러한 특징은 개발자가 멤버에 접근하기 쉬워서 구현하기 쉽게 생각할 수 있지만 시나리오에 맞게 데이터를 유지하는 것은 어려울 수 있어요. 예를 들어 설명할게요. 프로그램에서 이름, 번호, 아이큐를 멤버로 갖는 학생 형식이 있다고 가정합시다. 학생 개체는 생성할 때 이름과 번호를 부여하고 아이큐는 100으로 설정하기로 해요. 그리고 학생이 공부하면 아이큐가 공부한 시간만큼 증가하게 만들거예요. 단 아이큐는 300을 넘지 않게 하기로 해요. 그런데 학생 개체를 사용하는 곳에서 학생 구조체의 멤버에 접근할 수 있어서 “공부하다.” 기능을 호출하지 않고 직접 아..

[C++] 14. 캡슐화 개요

[C++] 14. 캡슐화 개요 이제 C++언어에서 캡슐화에 관한 사항을 알아보기로 해요. 캡슐화는 여러 개의 멤버를 하나의 형식으로 묶는 과정을 말합니다. C언어에서는 구조체를 이용하여 캡슐화를 했었죠. C++언어에서도 구조체를 이용하여 캡슐화를 할 수 있습니다. 하지만 일반적으로 클래스를 이용하여 캡슐화를 할 때가 대부분입니다. 먼저 C언어에서의 캡슐화와 C++언어에서의 캡슐화의 차이를 간단하게 알아볼게요. C언어에서 구조체에는 데이터만 멤버 필드(멤버 변수)로 캡슐화할 수 있었죠. 하지만 C++에서는 기능도 멤버 메서드로 캡슐화를 할 수 있습니다. 그리고 C언어에서는 캡슐화한 멤버를 모든 곳에서 접근할 수 있지만 C++언어에서는 구조체에 접근 지정자를 사용하여 가시성을 설정할 수 있습니다. 그리고 앞..

[C++] 13. OOP 개요

[C++] OOP 개요 이제 C++언어가 갖는 주요 특징인 OOP(Object Oriented Programming, 개체(객체) 지향 프로그래밍)에 관한 사항을 다루기 시작할게요. 특히 OOP에 관한 특징들은 클래스 문법을 통해 다룰거예요. OOP란 프로그램의 세계에 현실 세계를 반영하자는 것에서 출발했어요. 우리가 사는 현실 세계는 수 많은 생명체들이 메시지를 서로 주고 받으면 살아가고 있어요. 이처럼 프로그램도 개체들이 서로 메시지를 주고 받으며 동작하게 하자는 것이죠. 그런데 프로그램에서는 개체를 만들기 위해서는 먼저 형식 정의가 필요해요. 현실 세계에서는 사람이나 호랑이, 음악가, 학생처럼 추상적인 개념을 정의하고 있죠. 마찬가지로 프로그램에서도 형식을 정의할 수 있는데 C++언어와 Java, ..

[C++] 11. 논리 형식 bool 제공 12. string 형식 개요

[C++] 논리 형식 bool , string 형식 개요 11. 논리 형식 bool 제공 C언어에서는 논리 형식을 제공하지 않아요. 대신 0은 거짓으로 취급하고 0 이외의 것은 참으로 판별하죠. 그리고 연산 결과가 거짓이면 0, 참이면 1이었어요. C++언어에서는 높은 가독성과 신뢰성을 높이기 위해 논리 형식 bool을 제공하고 있어요. bool 형식 변수에는 값으로 true와 false를 사용할 수 있어요. 하지만 C++언어에서는 여전히 0은 거짓으로 취급하고 0 이외의 것은 참으로 판별하고 있습니다. //논리 형식 bool 사용 #include using namespace std; bool IsEvenNumber(int num); void main() { bool check = false; int n..

[C++] 10. 신뢰성 강화(열거형)

[C++] 10. 신뢰성 강화(열거형) C++언어는 C언어보다 자료 형식에 관한 부분에서 신뢰성을 강화하고 있어요. 먼저 C언어에서는 열거형 변수에 정수 형식을 대입하거나 초기화를 하는 것이 가능합니다. //C언어에서의 열거형 사용 //Program.c #include enum Gender { FEMALE, MALE }; int main() { enum Gender g = 3;//C언어에서는 열거형 변수에 정수형을 대입 및 초기화 가능 printf("g is %d\n",g); return 0; } ▷ 실행 결과 g is 3 하지만 C++에서는 열거형 변수에 정수 형식을 대입하거나 초기화할 수 없어요. 다음은 열거형 변수에 정수를 대입하였을 때 컴파일 오류가 발생하는 예제 코드예요. //신뢰성 강화 - 열..

[C++] 9. 레퍼런스 변수

[C++] 9. 레퍼런스 변수 C++언어에서 변수 선언문에서 &를 사용하는 참조 변수 선언을 제공하고 있습니다. 참조 변수는 별도의 메모리를 할당하지 않고 변수 선언문에서 초기화에 사용한 변수의 메모리를 참조하여 사용합니다. #include using namespace std; int main() { int i =0; int &r = i; //r은 i변수를 참조 r = 9; //i=9;와 같은 결과(r 변수는 i변수를 참조) cout

[C++] 8. 이름 충돌을 방지하는 namespace

namespace DemoA { struct Stack { int top; }; } namespace DemoB { struct Stack //이미 앞에서 같은 이름으로 정의하고 있음 { int last; }; }​ [C++] 이름 출동을 방지하는 namespace C++언어는 이미 만들어진 지 30여년이 지났습니다. 이러한 역사 속에서 처음에는 없었던 문법이 새롭게 추가한 것들도 있습니다. 이렇게 새롭게 추가한 문법 중의 하나가 namespace죠. 이미 앞에서 cin과 cout을 사용하기 위해 using namespace std; 문을 사용했었죠. 여기에서 namespace 문법을 다루고 나면 왜 이러한 구문을 사용하였는지를 알 수 있을 거예요. namespace는 같은 이름을 충돌하지 않게 하는 문..

[C++] 6. 디폴트 매개 변수 7. 매개 변수 이름이 없는 스텁 매개 변수

[C++] 6. 디폴트 매개 변수 6. 디폴트 매개 변수 C++언어에서는 함수 입력 매개 변수 중에 디폴트 값을 설정할 수 있습니다. 이러한 디폴트 매개 변수는 대부분 같은 값을 전달할 때 호출하는 곳에서 인자를 전달하지 않아도 사용할 수 있게 해 줍니다. 만약 호의 면적을 구하는 함수에 반지름과 각도를 입력 매개 변수로 받게 하였을 때 각도의 디폴트 값을 2*PI로 설정한다고 가정할게요. 이와 같이 정의하면 호출할 때 반지름만 전달하면 각도는 디폴트 값을 사용하여 계산합니다. 물론 호출하는 곳에서 원하는 각도를 전달할 수도 있어요. //디폴트 매개 변수 //Program.cpp #include using namespace std; double CalculateArea(double radius, doub..

[C++] 5. 함수 중복 정의 (FUNCTION OVERLOADING)

[C++] 5. 함수 중복 정의 (FUNCTION OVERLOADING) C언어에서는 같은 이름을 갖는 함수를 정의할 수가 없죠. 하지만 C++언어에서는 같은 이름을 갖는 함수를 정의할 수 있어요. 이와 같은 문법을 함수 중복 정의 (Function Overloading)라고 불러요. C++에서는 개발자가 정의한 코드를 컴파일 과정에서도 전개합니다. 함수 중복 정의가 대표적인 컴파일 과정에 전개하는 문법이예요. C++컴파일러는 개발자가 정의한 함수 명을 입력 매개 변수 리스트에 따라 유일한 이름의 함수 명으로 결정하는 함수 코드화(부호화) 과정이 있어요. 이러한 컴파일 전개가 있어서 같은 이름의 함수를 정할 수 있어요. 예를 들어 두 개의 정수 중에 최대값을 찾는 함수 명이 GetMax라고 정의했을 때 ..

[C++] 4. 태그 명을 형식 명으로 사용

[C++] 태그 명을 형식 명으로 사용 C++언어에서는 신뢰성에 문제가 되지 않는 범위에서 사용자에게 많은 편의성을 제공하고 있어요. 특히 태그 명을 형식 명으로 사용할 수 있어서 변수 선언에 태그 명을 사용할 필요가 없어요. 태그 명은 구조체, 공용체, 열거형을 정의할 때 사용하는 struct, union, enum 과 같은 키워드예요. C언어에서는 태그 명을 형식 명으로 사용할 수 없어서 struct, union, enum 같은 키워드도 같이 사용해서 변수를 선언해야 하죠. 이러한 불편함을 덜기 위해 typedef 문을 통해 형식 명을 정의해서 사용했어요. 하지만 C++에서는 태그 명을 그대로 형식 명으로 사용할 수 있어요. //태그 명을 형식 명으로 사용 //Program.cpp #include u..

strncat 함수, strncat_s 함수 [C언어 표준 라이브러리 함수]

char * strncat ( char * dest, const char * source, size_t n ); 타겟 문자열에 부분 문자열을 합하는 함수 입력 매개 변수 리스트 dest 앞 부분의 원본 문자열이면서 합한 문자열을 설정할 버퍼 source 뒷 부분의 원본 문자열 n source 문자열에서 합할 문자 개수 반환 값 dest strncat 함수는 dest 버퍼 크기가 dest 문자 길이 + n 보다 작으면 버퍼 오버 플로우 버그가 발생합니다. C11에서는 이를 개선한 strncat_s 함수를 제공합니다. 그리고 strncat 함수에서는 문자열을 합한 맨 끝에 종료 문자를 추가합니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //char * strncat ( char * dest, con..

strcat 함수, strcat_s 함수 [C언어 표준 라이브러리 함수]

char * strcat ( char * dest, const char * source ); 문자열을 합하는 함수 strcat 함수, strcat_s 함수 [C언어 표준 라이브러리 함수] 입력 매개 변수 리스트 dest 앞 부분의 원본 문자열이면서 합한 문자열을 설정할 버퍼 source 뒷 부분의 원본 문자열 반환 값 dest 만약 dest 버퍼의 크기가 dest의 문자열 길이 + source의 문자열 길이 -1 보다 작으면 버퍼 오버플로우 버그가 발생합니다. C11에서는 이를 개선한 strcat_s 함수를 제공합니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //char * strcat ( char * dest, const char * source ); 문자열을 합하는 함수 #pragma war..

strncmp 함수 [C언어 표준 라이브러리 함수]

int strncmp ( const char * str1, const char * str2, size_t n); 부분 문자열을 비교하는 함수 입력 매개 변수 리스트 str1 비교 대상 문자열 str2 비교 대상 문자열 n 비교할 문자 개수 반환 값 같을 때 0, str1이 크면 양의 정수, str2가 크면 음의 정수 strncmp 함수는 사전식으로 문자열을 비교합니다. 사전식 비교란 앞에서 부터 비교하면서 차이가 있는 부분이 있으면 그 부분의 문자의 차이로 비교하는 것을 말합니다. 예를 들어 abcd와 abd를 비교하면 세번째 문자에서 차이가 발생하고 c가 d보다 작으므로 abcd가 abd보다 작다고 판단하는 것을 말합니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //int strncmp ( c..

strcmp 함수 [C언어 표준 라이브러리 함수]

strcmp 함수 [C언어 표준 라이브러리 함수] int strcmp ( const char * str1, const char * str2 ); 문자열을 비교하는 함수 입력 매개 변수 리스트 str1 비교 대상 문자열 str2 비교 대상 문자열 반환 값 같을 때 0, str1이 크면 양의 정수, str2가 크면 음의 정수 strcmp 함수는 사전식으로 문자열을 비교합니다. 사전식 비교란 앞에서 부터 비교하면서 차이가 있는 부분이 있으면 그 부분의 문자의 차이로 비교하는 것을 말합니다. 예를 들어 abcd와 abd를 비교하면 세번째 문자에서 차이가 발생하고 c가 d보다 작으므로 abcd가 abd보다 작다고 판단하는 것을 말합니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //int strcmp ( ..

strncpy 함수, strncpy_s 함수 [C언어 표준 라이브러리]

char * strncpy ( char * destination, const char * source, size_t n ); 부분 문자열을 복사하는 함수 입력 매개 변수 리스트 destination 문자열을 복사할 버퍼 source 복사할 원본 문자열 n 복사할 문자 개수 반환 값 destionation strncpy 함수는 n개의 문자를 복사한 뒤 맨 뒤에 종료 문자를 추가하지 않습니다. 그리고 복사할 버퍼 크기가 n 보다 작으면 버퍼 오버플로우 문제가 발생합니다. C11에서는 이러한 문제를 개선하는 strncpy_s 함수를 제공합니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //char * strncpy ( char * destination, const char * source, size_t..

strcpy 함수, strcpy_s 함수 [C언어 표준 라이브러이]

strcpy 함수 [C언어 표준 라이브러이] char * strcpy ( char * dest, const char * source ); 문자열을 복사하는 함수 입력 매개 변수 리스트 dest 문자열을 복사할 버퍼 source 원본 문자열 반환 값 dest strcpy 함수에는 dest 버퍼의 크기를 전달하지 않습니다. 만약 source 문자열의 길이가 dest 버퍼의 크기-1보다 크면 버퍼 오버플로우 버그가 발생합니다. 이러한 문제를 해결하기 위해 C11에서는 strcpy_s 함수를 제공합니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //char * strcpy ( char * dest, const char * source ); 문자열을 복사하는 함수 //문자열을 복사한 후 표준 출력 스트림에..

strlen 함수 [C언어 표준 라이브러리]

strlen 함수 [C언어 표준 라이브러리] size_t strlen( const char * str ); 문자열 길이를 구하는 함수 입력 매개 변수 리스트 str 문자열 반환 값 문자열 길이 문자열 길이를 구하는 strlen 함수는 거짓인 문자(널 문자, ‘\0’, 아스키 코드값 0)을 만날 때까지의 문자의 개수를 반환합니다. 한글 하나의 문자는 2개의 문자로 표현합니다. 사용 예에서는 strlen 함수를 사용하는 예제 코드를 포함하여 strlen 함수와 같은 동작을 하는 ehstrlen 함수를 볼 수 있습니다. 이처럼 라이브러리 함수의 내부를 이해하기 위해 같은 동작을 하는 함수를 만들어 보는 것도 나쁘지 않습니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //size_t strlen( con..