728x90
반응형

프로그래밍 지식/C++ 29

C++문법/ 참조 변수, reference + 참조의 특성

C++에서는 참조 변수라는 새로운 복합 타입을 언어에 추가했다. 여기서 참조는 미리 정의된 어떤 변수의 실제 이름 대신 쓸 수 있는 대용 이름을 말한다. 예를 들어 ace 를 trees 변수의 참조로 만들면 ace와 trees는 같은 변수를 나타내는 것으로 사용할 수 있다. 그런데 생각해보면 굳이 다른 이름을 만들어야 하는가? 라는 의문이 든다. 참조를 하는 주된 이유는 바로 함수의 형식 매개변수에 사용하기 위함이다. -> 해당 변수의 주소를 직접 가리키는 다른 이름의 변수 == 참조 변수 참조를 매개변수로 사용하면 그 함수는 복사본이 아니라 원본 데이터를 가지고 작업한다. 이는 복사본을 만들기 위한 오버헤드가 사라지는 효과도 있다. 그래서 참조는 클래스를 설계할 때 필수적으로 사용된다. 우선 참조가 어..

C++문법/ 인라인 함수, inline

인라인 함수는 프로그램의 실행 속도를 높이기 위해 C++에 새로 보강된 것이다. (C에서는 매크로 기능을 위해 #define을 쓰고는 했다.) 일반 함수와 인라인 함수의 가장 큰 차이는 프로그래머가 코드를 어떻게 작성하느냐에 있는 것이 아니다. C++ 컴파일러가 코드를 프로그램에 어떻게 결합하느냐에 있다. ++ 인라인 함수와 일반 함수의 차이를 이해하려면 프로그램의 내부 구조를 깊이 있게 살펴볼 필요가 있다. (컴퓨터 구조 수업을 들으면 쉽다) 컴파일 작업의 최종 산출물은 기계어 명령으로 이루어진 실행 프로그램이다. (High-level -> Assembly -> Machinary) 프로그램을 실행하면, 운영체제는 이 명령들을 컴퓨터의 메모리에 로드한다. 로드된 명령들은 각각 하나의 특정 메모리 주소를 ..

C++문법/ 가상, Virtual (+ Override)

Virtual이라는 키워드가 C++에 존재한다. 무슨 용도로 쓰일까?? 알아보자 참고로 여기서 가상이라는 것은 실존하지 않는다는 뜻이 절대 아니다. 우선 답부터 말해주자면 동적 바인딩, Dynamic Binding을 위해서 쓰인다. 즉, 컴파일 시에 어떤 함수가 실행될 지 정해지지 않고 런타임 시에 정해지는 것이다. 여기서 동적 바인딩이란 컴파일 시에 정적 타입으로 참조할 주소가 정해지는 것과 달리 객체를 체크해서 참조할 주소를 정하는 것이라 생각하면 된다. 우선 머리에만 넣었다가 이따가 다시 예로 알아보도록 하자. 우선 업캐스팅을 알아보자 (다운 캐스팅도 있지만 생략) 업캐스팅이란 부모 클래스의 타입으로 자식객체를 선언하는 것 다운 캐스팅이란 자식 클래스 타입으로 부모객체를 선언하는 것 질문을 해보겠다..

C++문법/ 생성자와 소멸자 , Constructor & Destructor

생성자란 객체가 생성되면 자동으로 호출되는 것으로 생성자가 정의되어 있다면 해당 생성자가 호출된다. **생성자를 호출해도 생성자는 Return이 없다. 그냥 값 초기화를 위해 쓰기 때문이다. **생성자는 리턴값이 없더라고 void형으로 선언하지 않는다. -> 생성자에는 데이터형을 선언하지 않는다. // 객체를 초기화 하는 역할을 하기 때문에 리턴값이 없다! /* 클래스 이름 */ (/* 인자 */int x, int y ...) { x_ = x; y_ = y; .... .... } **// 언더바 _는 멤버 변수에 붙여서 구분한다. -> 멤버라는 뜻에 m_x 라고도 쓴다. 어..? 근데 나는 그냥 객체에 인자를 넣어서 초기화를 안해도 되던데?? Car c = new Car(); //?? 이래도 오류 안나던..

C++문법 / 문자열 함수를 위한 cctype

코딩테스트에서 유용한 헤더라고 할 수 있다. #include // 문자 관련 함수들의 원형 이 헤더에 문자열에 엄청 유용한 함수들이 들어있다. int isalnum(); //알파벳이나 숫자이면 true int isalpha(); //알파벳이면 int isblank(); // 공백이나 tab이면 int iscntrl(); // 제어문자이면 int isdigit(); // 십진 숫자이면 int isgraph(); // 빈칸이 아닌 인쇄할 수 있는 문자면 int islower(); // 소문자이면 int isprint(); // 빈칸을 포함한 인쇄할 수 있는 문자면 int ispunct(); // 구두점 문자이면 int isspace(); // 빈칸이면 int isupper(); // 대문자면 int isxd..

C++문법 / 포인터, 메모리 해제

포인터는 C에서도 배웠겠지만 값 자체가 아니라 값의 주소를 가지고 있는 변수다. 어려워하는 것은 이해가 가지만 배워보면 그냥 그렇다고 생각이 된다. 변수 -> 주소를 담는 변수 + 값을 담는 변수 다시 말해서 포인터는 주소를 담는 변수(장소) 변수는 값을 담는 장소 일반적으로 포인터변수는 주소를 저장하므로 흔히 주소를 알아내기 위해서 앰퍼샌드,&를 써서 해당 변수의 주소를 알아낸다. int donuts = 4; int* ptr = &donuts; //*은 포인터라는 뜻이다. //출력해보면 /* donuts ptr을 출력해보면 ptr의 가지고 있는 주소 값이 아니라 가리키고 있는 값을 출력하고 싶을 때가 있다. 그렇다면 ptr 자체를 출력하는 것이 아니라 *ptr를 출력하면 ptr이 가리키고 있는 값이 출..

C++문법/ 열거체, Enum

const를 사용해서 기호 상수를 만드는 것 외에도 다른 방법을 제공한다. 새로운 데이터형을 정의할 수 있게 해주는 것이다. **다만 주 목적은 아니다. enum도 구조체 구문과 매우 흡사하다. enum spectrum { red, orange, yellow, green, blue, violet, indigo, ultraviolet }; 이렇게 수행하게 된다면 spectrum 이라는 새로운 데이터형을 만든다. **struct 뒤에 구조체의 이름이 나오는 것과 같다. -> spectrum 이라는 열거체라고 부른다. red, orange...의 순서대로 나온 것들을 순서대로 0부터 7까지 정수 값을 나타내는 상수로 만든다. -> red는 0이 된다. ultraviolet은 7이 된다. ** 명시하지 않았을 ..

C++문법/ 공용체, Union (메모리 절약 가능)

구조체랑 비슷하지만 다르다. 쉽게 말하자면 Type을 여러개 가지고 있는 변수라고 생각하면 되겠다. union one4all { int int_val; long long_val; double double_val; }; //구조체와 선언 방법이 비슷하다. 다만 one4all 이라는 공용체 자체는 한 번에 하나의 타입만 가질 수 있다. int의 값도 저장, long 값도 저장, double의 값도 저장하지만 한 번에 하나의 상태만 가진다. 이 공용체의 크기는 해당 타입 중에서 가장 큰 타입의 공간만큼 차지한다. long이 제일크다면 long의 크기를 가지는 공용체가 되는 것이다. **다시 말하면 이 공용체는 여러 가지 데이터를 쓰게되지만 이들을 동시에 사용할 일은 없을 때 메모리를 절약해주는 역할이다. 예를..

C++ 문법/ 변수, 배열 초기화 [C++]

1. 변수 초기화 C++ 11에서 허용되는 문법과 C++에 넘어오면서 일반적인 변수 초기화와 다른 점이 있다. //일반적인 초기화 int friends = 11; //C++ 에서 넘어온 초기화 int ex(101) ; //ex를 101로 초기화함 //C++11에서 초기화 (배열과 같이 중괄호를 사용) int milk = {11}; // 중괄호로도 바로 초기화 가능 int cheese{ 6 }; // =을 사용하지 않아도 된다. //만약 공백이면 0으로 초기화함 int books = { }; 이렇게 프로그래머에게 자유도를 높여준 것은 C++의 접근성을 높이기 위함이다. 2. 배열 초기화 ** 초기화 형식은 배열이 선언될 때 한다. int cards[4] = {3,6,1,2}; // 모든 원소 초기화 int..

728x90
반응형