C언어 18

C 와 C++ 의 차이

목차 1. 입출력 방식 에 있는 std::cout 과 std::cin 을 이용한다. scanf 나 printsf와 다르게 타입에 의존하지 않고 입출력을 할 수 있기 때문에 편의성이 개선되었다. 하지만 개행 등을 후술 template 5. namespace 작업의 규모가 커지고 그룹이 다양해질 경우 서로가 사용하는 변수와 함수들을 분리할 필요가 있다. 겹치면 의도치 않은 에러가 날 수 있기 때문. 그래서 구별할 수 있는 이름을 부여하고 그 이름을 가진 공간에서 사용되는 변수와 함수를 선언해주면 된다. 접근은 :: 연산자로 이루어지며 범위지정 연산자(scope resolution operator) 라고 한다. 이들은 namespace 내부의 선언문과 외부의 정의로 이루어진다. 정의는 namespace의이름:..

C언어 2022.02.21

C++ 프로그래밍 - 예외처리(Exception Handling)와 형변환 연산자(type casting operator)

예외처리(Exception Handling) 런타임에서 발생하는 에러를 다루기 위해서, C에서는 조건문을 이용하여 제한을 주었다. C++에서는 드디어 일반적인 조건문과 예외처리문을 구별하여 쓸 수 있게 되었다. try, catch, throw 예외가 발생할 수도 있는 문장과 그 덩어리를 try{} 블럭 안에 작성하고, 예상되는 에러를 처리하기 위해 catch(에러){}의 블럭 안에 예외 처리 코드를 작성한다. 따라서 try와 catch 는 항상 붙여서 작성해야 하므로 가운데 다른 문장이 들어오는 등 따로 작성할 수는 없다. try 문 안에는 예외객체를 전달해주는 throw 키워드가 존재한다. try 안에서 오류가 발생한다면 throw에 의해서 예외가 던져지고 try는 종료되고 catch 블록에서 예외를 ..

C언어 2021.05.10

C++ 프로그래밍 - 템플릿(Template)

함수와 연산자에 대한 오버로딩을 진행하면서 타입별로 하나하나 해줘야 했었던 불편함을 떠올려보자. 가령 제곱에 대해 오버로딩을 진행하려면 int 가 들어왔을 때, double이 들어왔을때 따로따로 해줬어야 했다. 혹은 #define 을 통해 처리했어야 했다. 하지만 이미 알고 있듯이 #define 의 정의가 힘들기 때문에 함수형으로 사용하고 싶다면 템플릿에 대해 공부해보도록 하자. 함수 템플릿(function template) 템플릿은 어떤 물체를 만들어내는 틀이라고 생각할 수 있다. 템플릿은 template 키워드를 사용한다. #include using namespace std; template T SQR(T a) { return a * a; } int main() { int a = 10; cout

C언어 2021.05.09

C++ 프로그래밍 - 연산자 오버로딩(operator overloading)

목차 연산자 오버로딩의 이해 이제 C++에 대해서 어느 정도 감이 잡혔다. 이번에는 C++의 핵심적인 기능 중 하나인 연산자 오버로딩을 살펴보자. 지난 글까지 객체 다형성과 함수의 다형성에 대해서 들여다 봤다. 하지만 C++ 다형성의 끝판왕은 개인적으로 연산자 오버로딩이라 생각한다. 기본적인 원리와 방식은 기존과 동일하므로 어렵지 않게 공부할 수 있으니 한 번 들여다 보자. 연산자의 오버로딩은 함수의 오버로딩과 거의 차이가 없다. return 타입을 제외한 키값들, 함수명과 인자의 타입, 개수만이 오버로딩의 조건이 된다. 즉 return 타입은 오버로딩과 관련이 없었다는 것을 기억하고 천천히 접근해보자. 가장 기본적인 이해를 위해 잠깐 생성자의 호출을 다시 돌아보자. 앞서 살펴본 생성자 중 복사 생성자라..

C언어 2021.05.09

C++ 프로그래밍 - 클래스의 상속(Inheritance)과 다형성(polymorphism)

목차 상속 객체지향이 절차지향과 아주아주아주 다른 포인트 중 하나인 상속이다. 상속은 말 그대로 누군가에게 물려받는 것을 의미한다. 상속의 개념은 결국 공통점을 묶어서 한 번에 유지,보수하기 편하게 만들기 위함이기 때문에 경제적인 요인과 편의성을 고려한 개념이라고 생각하면 될 것 같다. 클래스에서의 상속은 자신의 멤버 변수와 멤버 함수를 물려주는 것을 의미한다. 이 때, 상속 해주는 클래스는 상위, 기초(base), 슈퍼(super), 부모(parent) 클래스라고 부르고, 상속 받는 클래스는 하위, 유도(derived), 서브(sub), 자식(child) 클래스라고 부른다. 상속의 특징은, 부모의 모든 멤버들을 자식이 물려받는다는 것이다. 또다른 특징은, 부모의 모든 멤버를 자식이 물려받되 온전히 자식..

C언어 2021.05.06

C++ 프로그래밍 - 클래스의 기초

구조체 vs 클래스 C에서 구조체는 많이 사용해봤을 것이다. 구조체 내의 변수와 함수는 멤버 변수와 멤버 함수라고 명칭한다. C++에서는 구조체 안에 함수를 선언하는 것이 가능해졌으며, .연산자를 통해 구조체의 멤버 변수와 함수에 접근할 수 있다. Class 또한 마찬가지이다. namespace때와 마찬가지로, 함수는 클래스 내에 선언만하고 정의는 클래스 외부에서 할 수 있으며, 같은 공간안에 선언된 멤버끼리는 서로 .연산자 없이 접근하여 사용할 수 있다. 그렇다면 구조체와 클래스가 다른 점은 대체 무엇일까? 현재 최신 컴파일러로 오면서 그 차이점은 더더욱 줄어들었다. 과거에는 구조체와 달리 클래스의 멤버 변수들은 초기화하려면 반드시 member initializer 나 constructor를 써야했다...

C언어 2021.05.05

C++ 프로그래밍 - 참조자(Reference)

참조자 C언어에서 C++로 나아가기 위해서 추가적으로 알아야할 사항들이 많이 남아있다. 이번 글에서는 참조자에 대해서 공부한 내용을 기록한다. C에서 포인터의 개념을 정확하게 이해했다면 참조자에 대한 이해는 상당히 쉽다. 물론 포인터를 몰라도 이해할 수 있을만큼 참조자는 간단하다. 참조자는 말하자면 별명이다. 예를 들어보자면, 어느 집에 강아지 1마리가 있다. 이 집안에서는 강아지의 이름을 뽀삐라고 지었다. 가족들은 뽀삐를 뽀삐라고만 불렀지만, 어느 날 옆집에서 아이가 놀러와서 뽀삐를 얘삐라고 불렀다. 결국 뽀삐는 옆집에서는 얘삐라는 이름으로 불리게 되었다. 여기서 뽀삐는 결국 얘삐와 동일한 강아지를 가리키는 단어이다. 뽀삐에게 밥을 너무 많이줘서 살이 1kg 쪘다면 결국 얘삐가 1kg 찐 것이랑 마찬가..

C언어 2021.05.05

C++ 프로그래밍 - 표준 입출력, 이름공간(namespace), 인라인 함수(inline function), 함수 오버로딩(function overloading)

C의 진화 절차지향 언어인 C언어는 직관적이고 편리했다. C언어는 함수 기반으로 작동하기 때문에, 필요할 때마다 함수를 작성하고 가져다 쓰기만 하면 되어서 쉽고 빠르게 작성하는 것이 가능했다. 하지만 소프트웨어가 발달함에 따라서 거대한 프로젝트들이 등장하여, 빠르게 새로운 코드를 작성하기보다 기존 코드들을 유지, 보수하는 일이 중요해졌고, 전체적인 코드의 이식성과 유동성이 중요하게 되었다. 예를 들어, 동일한 프로젝트에서 여러 사람이 동시에 개발할 때, 변수나 함수 이름이 겹치는 경우에 이름 재정의 오류가 발생하면서 프로그램 전반에 걸쳐서 이름을 수정하는 등의 문제가 발생했다. 이러한 변화에 따라 C언어도 변화가 필요했다. 사실 잘 생각해보면 C언어를 조금 더 넓은 세상으로 확대시켰다고 생각할 수 있다...

C언어 2021.05.04

C언어의 기초 - 연결 리스트 Linked List

연결 리스트를 사용하면 배열을 선언하고 특정 상황에 이용할 때 생기는 문제점들을 해결할 수 있다. 가령 배열의 크기를 넘어가는 입력에 대한 처리 같은 유동적인 할당을 하고 싶을 때 사용하면 좋다. 물론 배열의 크기를 바꾸어 다시 선언하거나 동적 할당을 받았다면 realloc 으로 크기를 늘려도 된다. 하지만 런타임 중 수정하기 어려운 문제가 있고, realloc 의 경우 만드려는 충분한 메모리가 없다면 실패할 수 있고, 복사하는 시간이 추가적으로 들기도 한다. 그렇기 때문에 메모리 상의 남은 공간 아무데나 할당 받아 숫자를 저장하고 주소를 외우는 방식이 편리하기도 하다. 그래서 힙 기반의 링크드 리스트를 살펴본다. Head 는 배열의 가장 앞에 있는 녀석으로 첫 요소의 주소를 가리키는 정보만이 중요하다...

C언어 2021.03.04

C) 간단한 정렬 - 버블 정렬(Bubble sort), 삽입 정렬(Insertion Sort), 빠른 정렬(Quick sort)

알고리즘에서 정렬은 엄청나게 강력한 도구 중 하나이다.하지만 비슷한 색의 공을 수만개를 한 번에 정렬하려고 하면 어떨까?마치 퍼즐을 안쪽에서부터 맞추는 것처럼 엄청나게 어려울 것이다.이를 위해 우리가 평상시에 어떤 정렬법을 사용하는지, 조금 더 빠른 정렬은 어떤 방식으로 진행되는지 공부한다.log 수준으로 빠르게 작동하는 정렬법은 선형 자료구조를 마치고 다룬다. 1. 버블 정렬 Bubble sort가장 쉽게 떠올릴 수 있고 개념도 직관적이며 이름마저 귀여운 버블 정렬이다.마치 버블이 떠오르듯 차례대로 비교하며 가장 이해하기 쉽다.하지만 O(N^2)의 수행시간을 반드시 가진다. 거품이 올라가듯 차례대로 스왑하는 것이 특징이다.한 번 끝까지 올라갈때마다 최대수가 끝에 정렬되므로, i번 반복할 때 비교횟수는 ..

C언어 2021.02.23