시작은 미미하나 끝은 쥬쥬하리라.

Study 76

[열혈 C++ 프로그래밍] (16) C++ 형 변환자

C언어 기반 C++ 2 형 변환 연산1 형 변환 연산2 형 변환 연산3 형 변환 연산1 C++ 형 변환 다운 캐스팅 등 문법적으로 에러가 있더라도 컴파일 에러를 일으키지 않고 형 변환 연산 처리 C++의 형 변환 : 4가지의 종류로 분할하여 사용 -> 각 종류 별 케이스에 일치하지 않으면 컴파일 에러 발생, 문법적 오류 발견 가능 1. static_cast 2. const_cast 3. dynamic_cast 4. reinterpret_cast dynamic_cast(안전성 보장) static_cast(안전성 미 보장) 형 변환 연산2 dynamic_cast 포인터 또는 참조자를 T형으로 변환하되, 안전한 형 변환만을 허용 ex) B클래스의 기초 클래스 A클래스일 때, B클래스의 포인터를 A클래스의 포인..

[열혈 C++ 프로그래밍] (15) 예외처리

예외처리 예외 상황, 예외 처리 예외처리 메커니즘 Stack Unwinding 예외상황 표현하는 예외 클래스 설계 예외처리 예외 상황, 예외 처리 예외 상황 문법적 오류가 아닌 프로그램 논리에 맞지 않는 오류 ex) 나이 입력 : 0보다 작은 값 입력 -> 예외 상황 예외 처리 조건문을 통해 예외를 발견하고 처리가 가능하지만 이러한 방식은 예외처리부와 일반 코드를 쉽게 구분 불가 -> C++에서 별도 메커니즘 제공 : try, catch, throw 예외처리 메커니즘 try, catch, throw try 블록에서 발생한 예외는 catch 블록에서 처리 try : 예외 발생의 검사 범위를 지정, 예외가 발생할 가능성이 있는 코드 블록 catch : try블록에서 발생한 예외를 처리, 예외 핸들러가 처리할..

[열혈 C++ 프로그래밍](14) 템플릿 2

템플릿 2 내용 확장 클래스 템플릿의 특수화 템플릿 인자 템플릿과 static 내용 확장 const 변수, 객체의 상수화 키워드 클래스 템플릿의 특수화 템플릿 컴파일러가 클래스를 만드는데 사용되는 템플릿을 정의 -> 컴파일러가 템플릿을 확인하고 템플릿 기반 클래스를 생성 -> 템플릿 클래스에서 객체를 생성 BoundCheckArray iarr(50); BoundCheckArray oarr(50); -> 와 같이 객체 생성 가능 Point int형 : BoundCheckArray로 객체 생성 -> typedef Point* POINT_PTR; = BoundCheckArray oparr(50);과 동일 + 템플릿 클래스 자료형을 대상으로 일반함수 정의 가능 + 클래스 템플릿 내부에서 일반 함수를 대상으로 f..

[열혈 C++ 프로그래밍] (13) 템플릿 1

템플릿 1 템플릿과 함수 템플릿1 템플릿과 함수 템플릿2 클래스 템플릿 템플릿 일부만 결정되어 있고 나머지는 사용하는 순간에 결정되는 것 -> 함수의 기능은 결정되어 있지만 자료형이 결정되어있지 않고 의존적이지 않은 것 int add(int a, int b) { return a+b } -> double형 데이터를 대상으로 연산하지 못함 -> double형 데이터를 int형으로 캐스팅하여 연산 할 수 있지만 데이터 손실 발생 -> double형 데이터 연산을 하는 함수 작성 필요 -> 자료형 마다 함수를 추가 작성하는 것이 비효율적이라서 템플릿 사용 T add(T a, T b) { return a+b } -> 함수 템플릿 -> T가 어떤 것인지 컴파일러가 알 수 있게 명시 + template {typena..

[열혈 C++ 프로그래밍] (12) String 클래스 디자인

String 클래스 디자인 C++표준, string클래스 문자열 처리 클래스 C++ 표준, string 클래스 String 문자열 처리를 위해 제공되는 클래스, string.h 헤더 파일을 포함해야 사용 가능 string str1 = "a"; string str2 = "b"; string str3 = str1 + str2; -> str1.operator+(str2);를 호출 : operator+() 함수는 string.h 헤더 파일에 정의 -> operator+() 이외에도 문자열과 관련한 operator+=(), ==() () 등의 함수가 정의 문자열 처리 클래스 length() 문자열의 길이를 반환하는 stirng 메소드 size()메소드도 길이를 반환하고 같은 값을 반환하지만, size는 객체가 메..

[Window System Programming] Chapter 21. DLL

4-21 DLL DLL(Dynamic Linked Library) DLL(Dynamic Linked Library) 라이브러리 정적 라이브러리 / 동적 라이브러리 존재 정적 라이브러리 : 각 실행 파일에 라이브러리를 별도로 저장 동적 라이브러리 : 각 실행 파일이 라이브러리 파일을 공유 정적 동적 라이브러리 차이 정적 라이브러리 : 프로그램에 미리 맵핑 되어 가상 메모리에 올라와 있으며 프로그램이 실행되면 메인 메모리에서 사용 동적 라이브러리 : 프로그램이 실행될 때 링크 필요, 수정하고자하는 일부만의 변경 가능 -> 별도의 DLL 파일 존재 정적 라이브러리(좌)와 동적 라이브러리(우) 파일의 동작 비교 (1) 정적 라이브러리 메인 메모리에 올라온 경우, 컨텍스트 스위칭이 일어나면 동일한 영역이더라도 새..

[Window System Programming] Chapter 20. 가상 메모리 & 힙 컨트롤 / MMF

4-20 가상 메모리 & 힙 컨트롤 / MMF 가상 메모리 컨트롤 힙 컨트롤 MMF(Memory Mapped File) 가상 메모리 컨트롤 가상 메모리 컨트롤 CPU와 프로그래머 고나점의 메모리는 가상 메모리, 실제로 물리적 메모리에 맵핑되는 구조 가상 메모리 페이지 Windows OS는 가상 메모리의 페이지를 관리할 때, 페이지에 특성을 부여 -> COMMIT 상태 : 물리적 메모리가 할당된 상태 -> FREE 상태 : 물리적 메모리가 할당되지 않은 상태, 메모리 맵핑이 되지 않은 상태 -> Malloc() 함수를 통해 COMMIT, FREE 상태로의 전환을 수행 REVERSE 상태 사용해야되는 메모리를 COMMIT 상태로 놓게되면 다른 곳에서 사용 불가 -> 연속적인 페이지 할당을 원하기 때문에 필요..

[Window System Programming] Chapter 19. 비동기 I/O와 APC

4-19 비동기 I/O와 APC I/O와 클럭 비동기 I/O 중첩 I/O 완료 루틴 기반 I/O 알람 가능한 상태(Alertable State) & APC(Asynchronous Procedure Call) I/O와 클럭 ex) 1초에 100번의 연산(100클럭)을 하는 A시스템과 1초에 200번의 연산(200클럭)을 하는 B시스템이 있는 경우 -> 100클럭의 연산데이터를 버퍼를 통해 전송하고 버퍼는 10 클럭마다 비워진다고(전송된다고) 가정 -> A 시스템은 연산에 1초가 소요되며 데이터를 10개로 분할하여 전송 -> B 시스템은 연산에 0.5초가 소요되며 데이터를 20개로 분할하여 전송 -> 일반적으로는 B 시스템(클럭이 높은)이 더 빨라 보이나, 이는 핸드 쉐이크 등 과정이 2배로 사용되는 것을 ..

[열혈 C++ 프로그래밍] (11) 연산자 오버로딩 2

연산자 오버로딩 2 대입 연산자의 오버로딩 배열의 인덱스 연산자 오버로딩 연산자 오버로딩1 연산자 오버로딩2 연산자 오버로딩3 대입 연산자의 오버로딩 대입 연산자 오버로딩 객체 간의 대입 연산은 대입 연산자의 호출로 이어짐 -> 직접 대입 연산자를 정의해주지 않으면 디폴트 대입 연산자 호출 -> 디폴트 대입 연산자는 멤버 대 멤버의 복사를 수행 a1 = a2; -> 일반적으로 객체 간 대입을 불가하지만 a1.operator=(a2)로 해석, 디폴트 연산자 호출 Point pos1(5,7); Point pos2 = pos1; -> 객체 간 복사(복사 생성자 호출) Point pos1(5,7); Point pos2(9,10); -> 대입 연산자 호출 문제점 : 동적 할당하는 경우, 같은 메모리 공간을 참조 ..

[열혈 C++ 프로그래밍] (10) 연산자 오버로딩 1

연산자 오버로딩 1 연산자 오버로딩 단항 연산자의 오버로딩 교환법칙 문제 해결 cout, cin, endl 연산자 오버로딩 하나의 연산자를 여러 의미로 사용할 수 있게 해주는 것 -> 객체 간 불가능한 연산을 사용자가 정의를 한 것을 토대로 객체 간 연산을 가능하게 만듬 p1.operator+(p2); -> p1 객체를 대상으로 p2를 인자로 함수를 호출 p1 + p2 => operator+(p1, p2); 주의점: 1. 연산자의 우선순위와 결합성을 불변 2. 매개변수의 디폴트값 설정 불가 3. 연산자의 순수 기능 변경 불가 -> ex) operator+() { num1*num2 } : 객체가 아닌 변수간 단순 덧셈 - Position 생성자와 operator-() 함수를 정의 - operator-() ..

반응형