목록프로그래밍/C++ (23)
강께르의 개발일지
1. C의 형 변환 int num = 10; std::cout 자식 클래스의 참조/포인터 자식 클래스의 참조/포인터 -> 부모 클래스의 참조/포인터 - static_cast는 dynamic_cast보다 덜 엄격한 기준으로 형 변환을 지원한다. 그렇기에 만약 부모 클래스 객체를 가리키고 있는 부모 클래스의 포인터 변수를 형 변환을 해 자식 클래스 포인터로 바꾸었다면? - 이를 에러라고 잡지는 않겠지만, 원하는 결과가 나오지 않을 수 있다. 이에 대한 책임은 설계한 프로그래머가 져야하는 것이다. - 이런 경우의 에러를 검출하고 조치하고 싶다면 아래의 형 변환 연산자를 사용해야 할 것이다. 3. dynamic_cast dynamic_cast (expr) - dynamic_cast는 상속 관계에서의 안전한 형 ..
1. list 클래스 - list 클래스란 무엇인가? list 클래스는 표준 시퀀스 컨테이너 중 하나이며 선형적 구조를 띠며, 노드 기반 컨테이너이다. - 동적으로 list 클래스를 통해 데이터를 추가할 수 있으며, 그 데이터를 저장할 때 프로그래머는 메모리를 신경쓰지 않아도 된다. - 그럼 vector와 차이가 무엇일까? vector는 데이터를 연속적인 메모리공간에 저장하는 구조로 중간에 데이터를 추가하거나 제거한다는 상황에서 데이터를 다루는 방법이 list와 차이를 보인다. - vector는 중간에 있는 요소를 추가한다고 가정하면, 추가하고자 하는 요소의 주소값에 공간을 확보하기 위해 그 뒤에 있는 인덱스 요소값들을 모조리 인덱스를 하나 추가한 주소값으로 옮겨버린다. 그리고 공간이 확보된 요소의 주소..
1. vector 클래스 - vector 클래스란 무엇인가? STL을 정리하면서 봤었는데 그 글의 일부와 따로 조사한 것들을 정리해보겠다. - vector 클래스는 표준 시퀀스 컨테이너 중 하나이며, 선형 구조를 가진 배열 기반의 컨테이너이다. 동적 배열이라는 특징이 있다. - 그렇기에 원소를 추가하거나 크기를 잡는 등 동적으로 수행하기 때문에 사용자가 많은 것을 생각하지 않게 하며 메모리를 효율적을 관리한다는 장점이 있다. - 하지만 속도에서는 배열에 비해 떨어진다는 단점이 있지만 장점이 훨씬 커 많이 사용한다. - 배열과 마찬가지로 연속된 메모리공간에 데이터를 저장한다. 그렇기에 메모리 재할당에 대한 리스크가 있다는 것도 단점이다. 2. vector 구조 - 다들 vector의 구조를 설명할려고 하면..
- C++을 배우면서 단계를 밟다보니 vector 템플릿 클래스에 대해 얼핏 알게 되었다. 이와 더불어 STL에 속하는 컨테이너라는 것을 알게 되어 이를 정리할 필요성을 느껴 이 글을 작성하게 되었다. 1. STL - STL은 무엇일까? Standard Template Library의 약자이다. 그럼 그게 뭔데? - 표준 템플릿 라이브러리라고도 하며 C++ 표준 라이브러리이다. 컨테이너(자료구조), 반복자, 함수 객체, 알고리즘 등으로 이루어진 라이브러리라고 할 수 있다. 여기서 잠깐, 라이브러리가 무엇일까? ★ 라이브러리 : 소프트웨어를 개발할 때, 재사용이 필요한 기능을 언제든지 필요한 곳에 호출하여 쓸 수 있게 클래스나 함수로 모아둔 것을 의미한다. 특정 기능만을 수행할 수 있도록 제작된 것이라고 ..
1. 클래스 템플릿 - 클래스 템플릿을 선언하는 방법은 함수 템플릿과 유사하다. 다음 코드를 보도록 하자. template class Point { private: T xpos, ypos; public: Point(T x = 0, T y = 0) : xpos(x), ypos(y) { } ... } - 함수 템플릿을 선언한 것처럼 함수 머리 위에 동일한 구문을 작성해준다. 멤버변수나 멤버 함수의 매개변수 중 필요한 곳에 어디든 T를 적용하고, 객체를 생성할 때 자료형을 명시해주면 된다. Point pos(2.4, 4.6); Point pos1(3, 4); - 위와 같이 자료형에 맞는 템플릿 클래스를 통해 객체를 생성하는 모습이다. 이 경우 함수 템플릿과는 다르게 반드시 을 통한 자료형 명시를 해줘야 한다...
1. 템플릿이 무엇인가? - 열혈 C++ 프로그래밍에 적힌 설명이 매우 좋아서 이를 풀어 쓰려고 한다. - 템플릿은 모형자라는 뜻을 가지고 있다. 모형자에는 틀로 모형이 정해져 있고, 사용자는 그 모형틀에 원하는 색의 펜을 넣고 따라 그리면 된다. - 그 모형자의 특징을 풀어 쓰자면 이렇게 표현할 수 있을 것이다. 모형을 만들어 낸다. 모형의 틀은 결정되어 있지만, 모형의 색은 결정되어 있지 않아서 결정해야 한다. - 이 말을 템플릿에게 적용하면 어떨까? 템플릿 중 함수 템플릿을 예로 말을 풀어 써보자. 함수 템플릿은 함수를 만들어 낸다. 함수의 기능은 결정되어 있지만, 자료형은 결정되어 있지 않아서 결정해야 한다. - 이 말은 함수의 기능이 되는 몸체는 정의되어 있지만, 반환형이나 매개변수가 쓸 자료형..
- 앞의 내용에 이어서 연산자 오버로딩에 대해 계속해서 정리하려고 한다. 1. 단항 연산자의 오버로딩 - 앞에서 했던 것은 이항 연산자라고 한다. 지금부터 할 것은 단항 연산자의 오버로딩이다. 대표적인 단항 연산자는 증감 연사자가 있을 것이다. ++pos // 증가 연산자 전위 연산 pos--; // 감소 연산자 후위 연산 - 이것은 어떻게 구현할까? 연산자의 이름은 우리가 알고 있고, 단항 연산자이니 객체가 호출하는 멤버함수의 형태로 오버로딩을 한다면 다음과 같은 형태를 띄게 될 것이다. pos.operator++(); - 전달할 인자가 없는 것은 단항 연산자이기 때문에, 그나마 있는 피연산자 하나는 멤버함수의 호출 용도로 사용하고 있다. 전역함수로 선언한다면 피연산자 하나가 매개변수로 전달되어 다음과..
- 연산자 오버로딩을 공부하던 중, 전역 함수로 연산자 오버로딩을 위해 friend 키워드가 사용된다는 것을 알았다. - 이를 정리하고 연산자 오버로딩을 계속 정리하려고 한다. 1. friend 키워드 - friend 키워드는 멤버로 선언된 특정 클래스나 함수에게 붙여 그들에게 private처럼 접근이 불가능한 멤버를 공개한다는 의미이다. - friend 선언은 어디에 있든지 상관없다. public이든 private든 상관없다. 그렇게 선언된 변수인 클래스나 함수는 그 클래스의 private 멤버에 접근할 수 있다는 것이다. 이는 정보은닉이라는 특징을 무너뜨리는 것이기도 하다. class Point { private: int xPos; int yPos; public: Point(int x = 0, int..
1. 연산자 오버로딩이란? - 오버로딩은 함수의 이름은 같지만 매개변수의 자료형과 갯수에 따라 몸체를 다르게 정의하는 것을 의미한다. - 그럼 연산자 오버로딩은 무엇일까? 연산자가 숫자 계산으로 사용하던 기본적인 기능 말고 오버로딩하여서 다른 자료형 매개변수에 따라 다른 몸체를 정의하는 것이라고 이야기할 수 있겠다. class Point { private: int xPos; int yPos; public: Point(int x = 0, int y = 0) : xPos(x), yPos(y) { } Point operator+(const Point& ref) { Point pos(xPos + ref.xPos, yPos + ref.yPos); return pos; } }; Point pos1(3, 4); Po..