본문 바로가기

C++

(21)
[C++] 자동 공간, 정적 공간, 동적 공간 자동 공간, 정적 공간, 동적 공간C++에서는 데이터를 저장해 두기 위한 메모리를, 대입하는 방법에 따라 자동공간(automatic storage), 정적 공간(static storage), 동적 공간(dynamic storage)으로 구분한다. 동적 공간은 자유 공간 또는 힙(heap)이라고도 부른다.자동 공간자동 공간(automatic storage)을 사용하는 함수 안에서 정의되는  보통의 변수들을 자동 변수(automatic variable)라고 한다. 예를 들어 임시 배열 temp는 getname()함수가 작동하는 동안에만 존재한다. 프로그램의 제어가 main()으로 다시 넘어가면, temp가 사용하던 메모리는 자동으로 해제가 된다.  만약에 getname()이 temp의 주소를 리턴했다면, m..
[C++] 동적 배열과 배열 표기 new를 사용한 동적 배열의 생성과 파괴int* psome = new int [10]; // 10개의 int형 값을 저장할 블록을 대입delete [] psome; // 동적 배열을 해제 new를 대괄호 없이 사용했으면 delete도 대괄호 없이 사용해야 한다.[1] 배열 표기psome[1]을 살펴보자. C++ 컴파일러는 이것을 *(psome + 1)과 완전하게 동등한 것으로 취급한다. *(psome + 1)은 배열의 두 번째 원소의 주소를 계산하고 그곳에 저장된 값을 알아낸다. 그 결과는 psome [1]이 동등하다는 것을 보여준다.[2]psome[i]를 *(psome + i)로 변환한다 [1]p.193[2]p.199
[C++] new와 delete의 역할 newC++에서는 malloc()과 같은 함수를 통해 동적 바인딩을 했을것이다. 그러나 이 방법은 클래스를 사용할때 단점이 발생한다. 클래스의 생성자를 파괴자를 new와 delete를 통해 자동적으로 호출된다. 물론 malloc()으로 사용하면 사용을 못하는 것은 아니다 다만 자동적으로 실행되지 않는다. new는 어떤 데이터형의 메모리를 원하는지 new 연산자에게 알려 주면, new 연산자는 그에 알맞는 크기의 메모리 블록을 찾아내고, 그 블록의 주소를 리턴한다.[1]deleteint* ps = new int;...delete ps; delete는 위와 같이 사용하면 메모리가 해제된다. 그러나 ps 자체가 없어지는 것은 아니다. 예를 들어, Ps는 새로 대입한 메모리를 지시하는 데 다시 사용할 수 있다...
[C++] 포인터 선언과 초기화 포인터 선언포인터를 선언할때 다음과 같이 선언을 한다.int* p_updates; 여기서 int*는 데이터 타입이고 p_updates가 포인터(주소)이다, * p_updates는 포인터가 아니라 int형 변수이다.[1] 포인터 다중 선언int* p1, p2; 여기서 p1은 포인터 변수고, p2를 보통의 int형 변수로 생성된다.[2] 그러므로 p1과 p2를 모두 포인터 변수로 만들려면 각각의 포인터 변수 이름 앞에 * 연산자를 따로 사용해야 한다.[2] 위험한 포인터 선언long * fellow;*fellow = 223323; 이것은 왜 위험할까? 위에 글을 토대로 fellow가 포인터(주소)이다, * fellow는 int형 변수이다. 그렇다면 223323은 어디에 저장 되었을까?이것은 아무도 모른다. ..
[C++] C++ 프로그래밍 철학: 포인터와 템플릿이 존재하는 이유(객체 지향과 포인터의 관계) C++는 절차 지향과 객체 지향의 이점을 가져가고 싶어하는 모습이 보인다. 그렇다면 그 둘의 장점은 무엇인가 절차 지향은 알고리즘을 강조한다고 말한다. 그렇기에 알고리즘을 재활용할 수 있는 일반화(generic)을 하기위한 C++템플릿을 제공한다.[1]  객체 지향은 데이터를 강조한다고 말한다.[1] 이때 데이터를 다룰때 컴파일 시간(compile time)인지, 실행 시간(run time)인지 명확한 구분을 위해 포인터를 사용한다.객체 지향 프로그래밍은 컴파일 시간이 아닌 실행 시간에 어떤 결정을 내린다는 것을 강조하는 점에서 재래의 절차적 프로그래밍과는 다르다.[2] 실행 시간이라는 것은 프로그램이 실제로 실행되는 동안을 의미한다. 반면에 컴파일 시간은 컴파일러가 소스 코드를 실행 코드로 변환하는 시..
[C++] 프렌드, 예외, 기타 사항 프렌드 클래스하나의 클래스를 다른 클래스의 프렌드로 만들고 싶을 때는 언제일까? 한 예를 살펴보자.텔레비전과 리모콘을 간단한 시뮬레이션을 프로그래밍해야 한다고 가정하자. 텔레비전을 나타내는 Tv 클래스와 리모콘을 나타내는 Remote 클래스를 정의하기로 결정한다. 분명히 Tv 클래스와 Remote 클래스 사이에는 어떤 종류의 관계가 있어야 한다. 대체 그것은 어떤 종류일까? 리모콘은 텔레비전이 아니고, 텔레비전도 리모콘이 아니다. 따라서 public 상속의 is-a 관계가 적용되지 않는다. 또한 리모콘 텔레비전의 한 성분이 아니고, 텔레비전도 리모콘의 한 성분이 아니다. 그러므로 컨텐이먼트 상속 또는 private 상속이나 protected 상속의 has-a 관계도 적용되지 않는다. 그런데 리모콘은 텔레..
[C++] 코드의 재활용(클래스 템플릿) 클래스 템플릿 정의템플릿 클래스는 다음과 같은 형식을 코드를 앞세운다.template  여기 class를 사용하는 것은, Type이 반드시 클래스여야 하는 것을 의미하지 않는다.이와 같은 상황에서 최신 C++ 컴파일러는 이처럼 혼동하기 쉬운 class 대신에 키워드 typename을 사용할 수 있다.template // 최신 컴파일러 템플릿 클래스 자세히 들여다보기이제 우리는 내장 데이터형이나 클래스 객체를 Stack 클래스 템플릿의 데이터형으로 사용할 수 있다. 그런데 포인터는 사용할 수 없을까? 예를 들어, string 객체 대신에 char형을 지시하는 포인터를 사용할 수 있을까? char형을 지시하는 포인터는 C++가 내부적으로 문자열을 처리하는 방법이다. 포인터들의 스택을 생성할 수는 있지만, ..
[C++] 코드의 재활용(다중 상속) C++가 추구하는 중요한 목표 중의 하나가 코드의 재활용성을 높이는 것이다.한 가지 테크닉은, 다른 클래스에 속하는 객체를 클래스 멤버로 사용하는 것이다. 이것을 우리는 컨테이먼트(containment), 컴퓨지션(composition) 또는 레이어링(layering)이라 부른다. 또 한가지 테크닉은, private 상속이나 protexted 상속을 사용하는 것이다. 컨테인먼트, private 상속, protected 상속은 일반적으로 has - a 관계를 나타낸다. has - a 관계는 새로운 클래스가 다른 클래스의 객체를 포함하는 관계이다.  Student  클래스 설계C++에서 has-a 관계를 모델링하는 일반적인 테크닉은, 컴포지션(컨테인먼트)을 사용하는 것이다. 즉, 다른 클래스의 객체들이 멤버..