본문 바로가기

C++16

Python과 Go: 미래의 프로그래밍 언어는 어떤 것이 더 유망할까? 프로그래밍 언어를 선택하는 것은 개발자에게 중요한 결정입니다. 어느정도 개발 경험이 있는 경우에 어떤 언어를 더 깊이 공부해 볼지에 대한 고민이 많아지는데요, 오늘날 가장 인기 있는 두 언어인 Python과 Go에 대해 알아보겠습니다. Python과 Go의 개요 Python은 1991년에 출시된 범용 프로그래밍 언어로, 데이터 과학, 기계 학습, 일반적인 프로토타이핑 등에 널리 사용됩니다. Python은 간단하고 읽기 쉬운 구문으로 알려져 있으며, 동적 타이핑을 지원하므로 명시적인 타입 선언이 필요하지 않습니다. 또한, Python은 클래스, 상속, 다형성을 지원하는 객체 지향 기능을 가지고 있습니다. 반면에 Go는 2009년에 Google에서 출시한 상대적으로 새로운 언어로, 클라우드 기반 웹 애플리케.. 2024. 4. 21.
[C++/STL] How to find the size, length of a vector In C++, there are several ways to calculate the size of a vector, which indicates how many items it contains. Although there isn’t a single definitive method, you can choose from the following summarized approaches. Keep in mind that there isn’t necessarily a right or wrong answer; consider these as reference points. 1. std::vector::size: This directly returns the size of the vector. For example.. 2024. 4. 21.
C++ extern 개념, 사용방법 정리 C++ 개발을 하다보면 클래스별로, 기능별로 여러 파일을 만들어야 하는 경우가 있습니다. 다른 파일의 전역변수를 사용하는게 잘 되지 않아서 전역변수를 포기하고 별도의 객체를 만들어야 할지 고민하기도 하는데요. 이럴 때 도움이 되는 키워드 extern 에 대해 알아보겠습니다. 개요 개발을 하면서 두개의 소스코드 : a.cpp, main.cpp 를 만들었다고 가정해 봅시다. a.cpp은 전역변수를 선언하고 있고, main.cpp는 이를 사용하는 코드입니다. a.cpp int test=123 main.cpp #include using namespace std; int main () { cout 2024. 4. 21.
[C++] nullptr과 NULL차이 - nullptr 조건문 사용시 주의사항 NULL NULL은 C에서 주로 많이 사용하게 되는 값 입니다. 보통 0으로 정의되어 있습니다. 초기화 또는 문자열 끝을 표현하기 위해, 할당 된 값이 없음을 의미하고 싶을 때 보통 사용하게 됩니다. In C, the macro NULL may have the type void*, but that is not allowed in C++ because null pointer constants cannot have that type. C 에서는 NULL은 void* 타입을 갖게된다. 하지만 C++에서는 다르며, 이는 null pointer 상수가 void* 타입을 가질 수 없기 떄문이다. C에서의 NULL type은 void* 입니다. 하지만 C++은 조금 다른데요, C++ 11 이전에는 NULL 매크로를 .. 2024. 3. 19.
C와 C++이 백악관에서 더 이상 사용하지 않게 된 이유 C와 C++을 그만 사용해야 하는 이유 최근 ciokorea.com 에서 발행한 뉴스기사 중 재밌는 글을 보았다. 제목은 백악관, 'C'와 'C++' 사용 중단 촉구··· 전문가들 "시의적절한 권고" 였는데, 사실 예전부터 계속 나오던 얘기이기는 하다. 기사가 궁금한 분들은 아래 링크를 확인해 보자 백악관, 'C'와 'C++' 사용 중단 촉구··· 전문가들 "시의적절한 권고" 바이든 행정부가 버퍼 오버플로 및 기타 메모리 액세스 취약성을 유발하는 프로그래밍 언어에서 벗어날 것을 촉구했다. Image Cr www.ciokorea.com C, C++ 이 보안적으로 문제가 있고 이러쿵저러쿵.. 우리는 메모리를 관리하는 언어를 사용해야 하며 go 나 rust가 그런 것이다! 이런 주장이 대부분이었다. 사실 틀린.. 2024. 3. 17.
C++ vector 를 랜덤으로 섞는 방법, random_shuffle 사용방법 안녕하세요 warehouse입니다. 오늘은 C++ 에서 생성 한 vector 를 마구잡이로 섞는 함수 random_shuffle 에 대해서 알아보려고 합니다. 프로그래밍을 하다보면 vector에 값을 넣는 순서대로 데이터가 저장되어 저장 된 값을 사용할 때 편향성을 갖는 경우가 있습니다. 벡터에 데이터를 쌓아둔 상태에서 사용하고 다시 집어넣는 알고리즘이 있다고 하면, 가장 앞 또는 뒤에있는 데이터가 우선적으로 빠지고, 다시 넣게 될 것입니다. 특별한 구현을 하지 않는다면, 다음 동작에서도 동일하게 동작하겠죠 그런데 여기서 random_shuffle 함수를 이용하면 매 동작마다 꺼내지는 데이터를 섞어 줄 수 있습니다. 이제 코드 예시를 통해 어떻게 동작하는지 봅니다. 테스트 코드 우선 벡터를 하나 만들어 .. 2022. 7. 31.
[C++] const 의 개념 그리고 포인터 에서의 const 안녕하세요 warehouse입니다. 오늘은 const 의 개념에 대해 알아 봤습니다. 그동안 아무 생각없이 const 는 그저 상수의 개념 정로도 이해하고 사용했었는데요 조금은 더 알고 써야하지 않을까 라는 생각에 가볍게 리서치 한 내용을 남겨봅니다. 변경할 수 없는 변수, 상수 const const 라는 예약어 이름 자체는 constant 라는 단어에서 왔으며 말 그대로 상수를 의미합니다. constant 형용사 1. a.불변의, 일정한(opp. variable)at constant temperature[speed] 일정한 온도[속도]로 b.끊임없이 계속하는, 지속적인, 부단한be in constant pain 통증이 계속되다 c.[문어] 충실한, 절개가 굳은(faithful), 견실한 ((in)); .. 2022. 3. 27.
[C++/STL] std::set 사용방법, 목적 짧은 정리 - 리눅스에서 C++ 개발하기 오늘은 C++개발을 하면서 많이 사용하는 STL 의 std::set 사용하는 방법을 알아보려고 한다. 업무환경은 Redhat 7.3 을 사용하고 있고, 포스팅을 위한 테스트환경은 Ubuntu 임을 알린다. 정의 Set 은 unique element (유일한 요소)를 저장하는 container 이다. 목적 정의 그대로 자료구조에 저장하고자 하는 데이터를 유일하게 관리하고 싶을 때 사용한다. 중복을 제거하는데 도움이 된다. 어떤 프로그램에서 메모리에 id를 관리하고자 한다면, std::set이 제격이다. 그리고 공간 복잡도 측면에서는 비 효율 적이지만, std::vector나 다른 자료구조에서 중복 된 항목들을 제거하고 싶다면, set에 한번 넣어주면 O(N)으로 중복제거가 가능하다. 사용방법 아래 코드를 .. 2022. 1. 27.
[C++/STL] vector의 크기, length 를 구하는 방법 C++ 에서 제공하는 vector의 크기 즉, 몇 개의 아이템이 들어있는지 계산하는 방법은 그리 많지는 않지만 여러 방법으로 알아 낼 수 있다. 아래 정리 된 방법 중 하나 마음에 드는 것을 사용하되, 정답이 있는 부분은 아니니 참고만 하도록 하자. 1. std::vector::size 말 그대로 vector의 size를 리턴 해 준다. std::vector v_ints; cout 2021. 11. 29.
C++ 에서 구조체를 초기화 하는 여러가지 방법 사실 최근 까지도 C 스타일로 구조체를 선언하고 초기화하는 방식을 선호했었는데, 다양한 방법이 있고 조금 더 깔끔한 방법이 좋을 것 같아서 알아봤다. 사실 코드를 보는 입장에서 그렇게 큰 차이를 갖는다고 생각하지는 않지만, 자기만족이라는게 있으니 익숙한 스타일을 만들어 보는 것이 좋겠다. 1. 변수선언 후 값 입력하기 C언어를 처음 배울 때 이런 방식으로 배워서 계속 초기화를 이렇게 해 왔던 것 같다. 물론 구조체 자체에 초기값을 지정할 수야 있겠지만, 사용하는 위치마다 값이 달라지고 해서.. 값을 입력하는 과정이 필요했다. #include using namespace std; struct sa { int i_val; bool b_val; }; int main() { sa s_1; s_1.i_val = .. 2021. 7. 29.
[C++] map 에 값을 입력하지 않아도 찾아지는 경우 - map 사용 시 주의사항 C++ 에서 key, value 형식의 데이터를 저장하기 위해서 map 자료구조를 많이 사용하게 되는데, 이 때 조금 주의해야 하는 부분이 있어서 가볍게 정리한다. 우선 내가 하려고 했던 작업은, map 의 find 멤버함수를 이용해서 값이 있는지 여부를 조건문으로 판단하고, 없는 경우 특정 작업을 하려고 했었다. 아래는 코드 예시이다. void doSomething () { std::map mymap; .... do insertion or nothing if ( mymap.find( 'k' ) == mykey.end() ) { // no data } else { // have one func ( mymap[ 'k' ] ); } return; } 위 코드의 의도는 mymap에서 k 라는 키가 있으면 fu.. 2021. 7. 18.
[C++] vector 값과 함께 초기화 하는 방법 오늘 코드를 짜다가 간단히 정리할 거리가 떠올라서 퇴근후에 적어본다. 특정 조건문에서 vector 를 초기화 해야했고, 그 vector 에 들어갈 한개의 값을 가지고 있는 코드였다. 처음에는 아래와 같이 코드를 짰다. int condition_a = 1; string a = "I'm the first"; if ( condition_a == 1 ) { // vector 생성 vector my_list; // a를 삽입 my_list.push_back( a ); ..... } 그런데 가만 생각해보니.. 각종 변수들은 값과 함께 초기화 하는데 만들어놓고 push_back 하는 것은 여러모로 이상하다고 생각했다. 그래서 아래와 같이 코드를 바꿔 별도로 삽입하는 과정을 없앴다. int condition_a = 1.. 2021. 7. 8.
[Effective C++] 상속받은 비가상 함수를 파생클래스에서 재정의 하지 말자 주요 개념은 클래스를 상속받는 하위 클래스에서 상위 클래스에 있는 비 가상함수를 재정의 하게되는 경우 생각하지 못한 동작이 발생할 수 있다는 부분을 설명해 준다. 코드 예시를 보자. class Fruit { public: void get(); ... }; class Apple : public Fruit { ... }; 위 코드를 바탕으로 아래처럼 구현 시 결과가 생각과 다를 수 있다. Apple a; Fruid *f = &a; f->get(); // a 에 대한 포인터로 get을 호출한다. // 위의 코드는 아래 코드처럼 동작하기를 기대하면서 작성되었다. Apple *aa = &a; aa->get(); // 하지만, Apple 에서 get을 다시 정의하는 경우 문제가 발생한다. class Apple : .. 2021. 6. 11.
[Effective C++] public 상속 모형은 반드시 "is-a" 를 따른다. C++ 에서 public 상속을 하는 경우 하위 클래스는 반드시 상위 클래스 개념에 속해야 됨을 의미하며 부모 A 클래스, 자식 B 클래스가 있는 경우에 'B is an A' 여야 한다는 것이다. 아래 예시코드를 살펴보자. class Fruit { ... }; class Apple : public Fruit { ... }; // Apple is a fruit. 사과는 과일이기 때문에 위 코드는 is-a 관계가 성립한다. 이런 is-a 관계의 개념은 public 상속에만 해당하며 private, protected 는 개념이 조금 다르니 나중에 다른 포스팅에서 다뤄볼 예정이다. is-a 관계라는 것을 숙지하고 있음에도 불구하고 의식의 흐름에 따라 코드를 구현하다보면 아래와 같은 상황에 직면한다. class .. 2021. 6. 5.
[Effective C++] 내부에서 사용하는 객체에 대한 핸들은 반환하지 말자 C++ 에서 객체를 다룰 때 내부에서 private으로 선언 된 멤버변수에 대한 핸들을 밖으로 반환하지 않는 것이 좋다. 코드를 보면 이런 동작이 왜 위험한 지 이해하기 쉬울 것이다. class Apple { private: int brix; public : void setBrix(int v); // brix 값을 설정한다. const int& getBrix(); // brix 수정을 막기위해 const 로 선언한다. } 위의 코드를 보면 getBrix 멤버함수를 통해 Apple의 brix 값을 밖으로 가져올 수 있게된다. 그런데 여기서 문제는 가져오는 값이 복사 값이 아니라 참조자라는 것이다. 참조자를 반환하기 때문에 사실 상 Apple에서 getBrix를 호출한다는 것은 밖에서 brix 에 접근이 가.. 2021. 6. 2.