본문 바로가기

Program Languege/C/C++

오버로딩(overloading)과 오버라이딩(overriding)의 차이점 오버로딩(overloading)과 오버라이딩(overriding)의 차이점 오버로딩 함수의 이름은 같지만 반환형에 상관없이 매개변수, 시그니쳐에 따라 중복 정의하는 것. Ex> int add(int a, int b); float add(float a, float b); double add(double a, double b); void add(int a); void add(float a); void add(void); 이름은 같지만 다 다른 함수로 정의가 가능하다. 그리고 이 때 디폴트 매개변수를 사용하면 함수 호출시에 어떤 함수의 호출인지 모호해지때문에 컴파일 에러가 발생하며 이렇게 가독성을 떨어뜨리거나 혼란을 줄 수 있는 경우는 피하길 바란다. Ex> int add(int a, int b = 10); .. 더보기
std::string std::string c++ 표준라이브러리에서 제공하는 string 클래스이다. 문자열의 처리를 목적으로 정의된 클래스이며 string 헤더파일에 정의되어 있으며 std 네임 스페이스에 포함되어 있다. 템플릿 기반의 클래스이므로 핵심 코드들은 대부분 헤더 파일에 작성되어 있으며 헤더를 열어 보면 소스를 직접 볼 수 있다. Ex> template class basic_string; _Elem은 ANSI문자열을 사용할 것인지 유니코드 문자열을 사용할 것인지 지정하는 역할을 한다. char와 wchar_t로 지정. _Traits는 basic_string을 특수화 시켜서 속성을 변경하고 하는데 자세한 내용은 모르겠습니다. 문자열 클래스는 가변 길이를 다룰 수 있어야 하므로 본질적으로 메모리를 동적 할당해야 한다.. 더보기
구조체 (struct) 구조체 (struct) 구조체는 변수들의 집합이라고 할 수 있다. 변수를 하나하나 선언하기가 불편함을 느끼다가 배열을 알고서 다소 해결 되었을 것이다. 허나 또 욕심이 생기지 않았는가? 학생정보를 저장한다고 할 때, 학생 이름, 학번, 성적, 주소 등등 이 정보들을 배열에 넣는다고 한다면 int형 따로 char형 따로 선언을 해서 사용을 해야한다. 이 불편함을 해결하기 위해 다른 자료형들을 모아서 한번에 관리할 수 없을까? 그것이 바로 구조체이다. 변수들의 집합. 사용자 마음대로 정의할 수 있다. Ex> struct { 구조체 안에 포함 시킬 변수들. } 구조체 이름; 학생정보를 구조체로 표현한다고 해보자. - 소스 코드 예시 struct { char name[10]; // 학생 이름. int ID; /.. 더보기
printf() scanf() printf() 함수 기본 출력함수로써 가변인수 함수라고 분류한다. 가변인수 함수라는 것은 인자가 정해져있지 않고 변할 수 있다는 뜻이다. Ex> int printf(const char * _Format, ...); printf()함수의 원형이다. int형 반환 값이 있는데 이것은 " "안에 들어있는 포맷에 대한 길이를 int형으로 반환한다. ""안에 포맷과 뒤에 전달인자의 개수가 정확히 일치해야한다. 포맷의 형태는 %d(정수), %f(실수float형), %lf(실수 double형), %c(문자), %s(문자열) 등이 있다. scanf() 함수 printf와 마찬가지로 가변인수 함수이다. 하지만 scanf()함수는 입력에 사용한다. Ex> int scanf(const char * _format, ...).. 더보기
함수 오버로딩 함수 오버로딩 오버로딩은 한 마디로 '중복 정의'를 의미한다. 함수 오버로딩은 중복 정의하는 것을 말하는데 여기서 중복 정의는 같은 이름으로 여러 개의 함수를 정의한다는 것이다. c++에서는 함수를 식별할 때 함수 이름, 매개 변수의 수와 매개 변수의 자료형을 가지고 식별한다. 그럼 어떤 경우에 쓰일까? Ex> int Add1(int a, int b); float Add2(float a, float b); double Add3(double a, double b); 위처럼 같은 기능을 하는데 int, float, double에 따라 Add1, Add2, Add3로 정의하였다. 불편하다거나 뭔가 좀 꺼림찍하지 않은가? 같은 기능을 하는데 사용하는 자료형이 다르기때문에 1, 2, 3을 붙여서 구분 짓거나 아니.. 더보기
Call by Call by 함수를 호출할 때 넘겨주는 인자에 따라 Call by value, Call by Address, Call by Reference 세가지로 분류된다. call by value 가장 기본적인 방법으로 함수를 호출해서 매개변수의 값을 복사해서 전달해주는 방식이다. 값을 복사? 그렇다. Ex>int num1 = 10, num2 = 20; Max(num1, num2); 위와 같이 num1과 num2라는 변수를 매개변수로 사용하면 num1과 num2라는 변수 자체가 가는 것이 아닌 안에 들어 있는 10, 20 이 두개의 값만이 전달 된다. 그렇다면 값만 전달되는 Call by value의 단점이나 문제점은 무엇이 있을까? - 소스 코드 예시 void Inc(int a, int b); int main(.. 더보기
함수 함수 함수는 어떤 기능을 수행하는 것이다. 수학의 f(x)처럼 x 값을 넘겨주면 내부에서 연산을 거쳐 y값이 나오는 것을 생각해보면 쉽게 이해가 갈 것이다. 함수는 크게 표준함수와 사용자 정의 함수로 구분할 수 있다. 여기서는 사용자 정의 함수에대해 설명하도록 하겠다. Ex> 자료형 함수이름(매개변수) { 함수 내부. } 자료형은 반환할 값의 자료형을 말한다. 함수가 끝나고 반환할 결과 값의 자료형을 말한다. 함수의 이름은 변수와 같이 정의할 함수의 이름이며 이때 이름은 어떤 기능을 하는 함수인지 보고 알 수 있도록 지어주는 것이 좋다. 매개변수는 함수에서 기능을 수행하기 위해 필요로 하는 값을 넘겨줄 때 사용한다. 예를 들어 두 숫자 중에 큰 값을 알려주는 기능을 하는 함수의 경우 비교할 두 숫자를 매.. 더보기
포인터 변수 - 2 포인터 변수- 2 int *pi; 포인터는 자료형에 상관없이 4바이트의 크기를 가진다고 했었다. 그럼 포인터의 자료형은 어디에 쓰일까? 첫번째로 *연산자로 가리키고 있는 변수를 읽거나 쓸 때 가리키고 있는 변수의 바이트 수와 비트 해석 방법을 알아야하기 때문이다. - 소스 코드 예시 int i = 1234; int *pi; double d = 3.14; double *pd; pi = &i; pd = &d; cout 더보기
C++에서 형변환 종류 C++에서 형변환 종류 static_cast() 논리적으로 변환 가능한 타입만 변환 가능.(컴파일에서 허용하는 한도내에서 형변환 가능.) 내부적으로 에러가 없는지는 검사 안함.(dynamic_cast에서 추가 설명.) 실수형을 정수형으로 캐스팅하거나 반대로 캐스팅하는 것은 허용되며 상호 호환되는 열거형과 정수형, double과 float의 변환 등도 허용되지만 포인터의 경우 다른 것으로 변환하는 것은 허용되지 않는다.(컴파일 시 에러처리) 실수형 포인터를 정수형 포인터로 형변환을 하거나 반대의 경우 등이 이에 포함. 위험한 형변환 연산을 컴파일 중에 알려주면서 실수를 방지할 수 있다. 이에 비해 C의 형변환은 너무 친절..?해서 언제나 OK를 해주다가 프로그램이 언제 KO당할지 모른다고 한다. 포인터끼리.. 더보기
동적 할당 동적 할당 자료 저장을 위해 저장 공간 할당하는 방법에는 정적 할당과 동적 할당이 있다. 정적 할당은 지금까지 해온 변수 선언 방식을 말한다. 프로그램 실행 전에 필요한 기억 장소가 미리 할당된 상태에서 프로그램 동작이 시작되므로 '정적'이라고 한다. '동적'은 미리 할당되지 않는 것을 말한다. 프로그램 실행 중에 필요한 만큼 저장 공간을 요청하는 것이다. 동적 할당은 기억 장소를 할당하고 할당된 저장 공간의 주소를 포인터 변수에 저장하면 된다. 이때 new 연산자를 사용한다. Ex> 자료형 *포인터 변수 = new 자료형[개수]; 필요한 저장 공간이 한개인 경우 뒤에 [개수]는 생략하면 된다. 동적 할당을 받은 경우에는 사용후에 사용을 끝내기위해 해제해야 한다. 해제에는 delete 명령이 사용된다. .. 더보기