본문 바로가기

프로그래밍7

[C++] 함수 오버로딩과 매개변수의 디폴트 값 Ⅰ. 함수 오버로딩 C언어에서는 다음과 같이 두개의 함수의 이름이 다른 것을 허용하지 않았다. 예를 들어 int func(int a); int func(int a, int b); 이런 형식으로 이름이 같은 함수 두개를 구분하지 못해 함수의 이름을 항상 다르게 해야했다. 하지만 우리가 보기엔 이 두 함수를 매개변수를 보고 충분히 구분할 수 있을 것 같아 보인다. 따라서 C++에서는 이렇게 같은 이름의 함수라도 매개변수를 통해 구분할 수 있다면 함수를 정의할 수 있다. 이렇게 C언어와 C++에서의 규칙이 다른 이유는 함수를 찾는 방법이 서로 다르기 때문이다. C언어의 경우 함수를 찾을 때 함수의 이름만을 이용해 찾게 된다. 즉, 위 코드에서는 func이라는 이름만 보고 구분이 불가능하다고 판단한 것이다. C.. 2022. 7. 13.
[C++] C++의 입출력 방식 std::cout, std::cin C언어를 공부할 때의 입출력 방식은 printf, scanf를 이용했을 것이다. 하지만 C++에서는 더이상 이 printf와 scanf를 이용해 입출력을 하지 않는다. 대신 std::cout, std::cin을 이용해 입출력을 처리하게된다. Ⅰ. #include 기존에 C언어에서는 입출력을 위한 헤더파일로 를 사용했다. 하지만 C++에서는 이라는 헤더파일을 사용한다. #include int main(){ } 이렇게 헤더파일을 선언해주면 입출력을 할 준비가 된 것이다. 여기서 약간의 상식으로 에는 와 달리 확장자인 .h가 빠져있는것을 볼 수 있다. 사실 과거에는 라는 헤더파일을 선언하였으나 새로운 C++표준의 도입이 되며 많은 변화가 생겼고, 이 때문에 과거의 표준 라이브러리와 새로운 표준 라이브러리를 구.. 2022. 7. 13.
Call by value/ Call by reference(Call by pointer)의 개념 함수의 호출 방법이다. 하지만 값에 의해 호출되느냐, 참조에 의해 호출되느냐에 따른 차이가 존재한다. Call by value 함수를 호출할 때 넘겨주는 인자의 값이 매개변수에 복사되는 것이다. 함수내에서 직접적으로 데이터의 값들을 바꿔주어도 해당 인자에는 아무런 영향이 미치지 못한다. 가장 유명한 예시인 swap함수를 통해 설명 할 수 있다. #include void swap(int a, int b){ int tmp = a; a = b; b = tmp; } int main(){ int a = 10; int b = 20; swap(a,b); printf("%d %d", a, b); } 10 20 swap함수에서 a와 b의 값을 바꿔주었지만 이는 그저 swap함수 내의 a에 main함수에서의 a에 들어있는.. 2022. 7. 10.
[C언어] 배열과 포인터 사이의 관계 - 2 (포인터 - 4) 저번 포스트에서 배열과 포인터의 관계를 끝내보려했지만... 생각보다 내용이 많아서 끊고 2편으로 가기로 했다. [C언어] 배열과 포인터 사이의 관계 - 1 (포인터 - 3) Ⅰ. 배열과 포인터 배열의 각 원소들은 메모리 상에 연속적으로 위치해 있게 된다. 즉, int형 배열을 선언을 하면 각 원소들은 4바이트씩을 차지한체로 줄지어서 놓여있게 된다는 의미이다. 우리 jikim08.tistory.com Ⅰ. 배열 이름의 주소값 이전에도 설명했듯이 배열의 이름은 sizeof연산자와 주소값 연산자(&)를 사용할 때를 제외하고는 배열의 첫번째 원소를 가리키는 포인터로 타입변환된다. 그런데 sizeof는 어떤 부분이 다른지 이미 알고 있지만 &연산자를 사용하면 무엇이 달라지는지 아직 모른다. 우선 다음 예제를 살펴.. 2022. 7. 10.
[C언어] 배열과 포인터 사이의 관계 - 1 (포인터 - 3) Ⅰ. 배열과 포인터 배열의 각 원소들은 메모리 상에 연속적으로 위치해 있게 된다. 즉, int형 배열을 선언을 하면 각 원소들은 4바이트씩을 차지한체로 줄지어서 놓여있게 된다는 의미이다. 우리는 이전에 포인터의 덧셈을 어떻게 하는지 보았고, int형 데이터를 가리키는 포인터 p에 1을 더하면 4바이트가 더해진다는 사실을 알고 있다. 그런데 배열은 메모리 상 연속적이기 때문에 arr[0]을 가리키는 포인터가 p라면 arr[1]을 가리키는 포인터는 p+1이 된다. #include int main(){ int arr[3] = {1,2,3}; int *p = &arr[0]; printf("%p %p\n", p, &arr[0]); printf("%p %p", p+1, &arr[1]); return 0; } 000.. 2022. 7. 8.
[C언어] 상수 포인터와 포인터의 연산(포인터 - 2) Ⅰ.상수포인터 우리는 절대 값이 변하지 않을 것 같은 변수를 상수로 만들어 주기 위해 const를 사용한다. const를 사용하면 변수를 상수로 만들어서 중간에 해당 변수의 값을 바꿀 수 없도록 만들어 줄 수 있다. 예를 들어 const int a = 3; a = 4; 이 경우 오류가 발생한다. a는 상수라서 바꿀 수 없는 값인데 4로 바꾸려 시도했기 때문에 오류가 발생하는 것이다. const int a = 3; a = 3; 이 경우에도 물론 오류가 발생한다. a의 값은 바뀌지 않았음에도 바뀔 가능성이 있었기 때문에 오류가 생기게 되는 것이다. a에 무슨 값이 들어가는지는 상관이 없이 바뀔 가능성이 있다면 오류가 생긴다. 때문에 절대로 바뀌지 않을 값에는 항상 const를 붙여서 상수로 만들어주는 습관을.. 2022. 7. 5.
[C언어] 포인터에 대해 이해하기(포인터 - 1) Ⅰ.포인터를 이해하기 앞서 우리가 저장하는 모든 데이터는 메모리 상의 공간에 저장되게 된다. 예를 들어 int형 변수를 만들어 값을 저장하면 4바이트짜리 공간에 4바이트짜리 데이터를 저장하는 식으로 처리된다. 이러한 공간들을 구분하기 위해 컴퓨터 내에서 메모리 상의 공간마다 주소가 붙어있게 된다. 포인터는 이러한 주소값들을 저장하기 위해 만들어진 변수이다. 결국 포인터라는게 int, char, float와 같은 자료형들과 다른게 아닌 '변수'라는 점을 기억하자. 특별히 데이터의 주소값을 저장하는 변수. 그래서 int형 변수 a에 2를 저장했다가 이후에 3을 저장하는게 가능하듯이 포인터도 a라는 변수를 가리켰다가 b라는 변수를 가리켰다가 하며 바뀔 수 있다. int a; a=2; a=3;//a값이 2에서 .. 2022. 7. 3.