반응형

전체 648

포인터사용시 주의점2

일반적으로 포인터는 특정 변수를 가르킨다. 그리고 이 포인터가 가르키는 변수는 타입이 정해져서 그 변수가 담고있는 내용은 틀에 맞춰 끼워진내용이란말이다. 다시말해 형식이 정해져있는 내용이다. 예를들어 int형 변수를 가르키는 포인터는 그변수가 int형(4Byte)를 가르키기때문에 그에 맞춰 변수의 주소값과 변수의 타입명을 확실히 알고 값에 접근할 수가있다. 이제부터 쓰는 내용은 이런 확실함에 대한 이야기다. 내부적으로 컴파일러의 설계에 따라 달라질 수 가 있을지모르겠고, 난 전혀 컴파일러를 설계해보지 않았기때문에 경험적으로 말하는 것임을 미리 말해둔다. char* str; 위선언은 무척 많이 보았을것이다. 위선언을 보고 동적할당을 해야겠구나. 라고 생각을 한다면, 어느정도 기본을 충실히 한 사람일 것이다..

객체지향의 시작 첫번째글

객체지향은 왜 시작되었을까.. 그리고 왜 필요한것일까. C언어를 공부하다 C++을 접하게되면 객체지향의 필요성에대해서 의문을 가지게된다. C언어의 순차적이고 직관적인 문법에비해, 이론만으론 추상적인 개념들에 왜 필요한지 적용하는방법에대해서도 서툴기만하다. 프로그래밍을하면 크게 변수, 함수, 그리고 제어구문 이렇게 큰틀의 반복이다. 전부 변수를 다루기위한것이다. 이런변수를 다루면서 코드의 길이가 길어지면 변수도 많아지고 함수도많아지고 지역변수도많아지고 점점 헷갈리게된다. 또한 전역적으로필요한 변수도 동류끼리 구분지어질 필요가 있을경우가있다. 객체지향은 이런 변수와 함수를 잘사용하기위해 필요하지않을까 생각한다. 객체지향의 이점중 한가지가 계통정리를 통해 동류의 변수들을 묶을 수 있다는 것이다. 또한 이런 동..

프로그래밍/cpp 2013.06.12

오일러의 한붓그리기(작성중)

깊이우선 탐색과 별반 다르지않다. 하지만 알고리즘의 1%만 수정되어도 제대로 이해를 하지못한다면 완전 다르게 보일수도있다. 컴퓨터의 알고리즘이란 1%로인해 전체적이 해법과 결과물이 달라지기때문이다. 익히 말한바와 같이 깊이 우선탐색은 재귀의 진행시 계속해서 시작정점을 반환하는 탐색방법이다. 내가 쓴방법은 한번 갔던 곳은 플래그로 표시를 해두었기때문에 판정을통해 다시는 안가도록 해놓았다. 이런경우는 노드와 노드사이의 간선이 하나만 존재할때 가능한일이다. 간선이 2개이상일땐 플래그를 해놓는 방법은 유용하지않다. 직접 행렬상의 간선의 개수를 지우는 방식으로 하겠다. 또한 한붓그리기의 취지에 맞게 모든 간선을 한번에 다 지나가야하므로 판정을 간선을 다 통과했는지 해야하고 이러한 모든 방법의 수를 구하기위해선, ..

unresolved externals, undefined reference to A::test()

클래스 static 멤버변수는 클래스내부에서 초기화 할 수 없다. 특히 클래스에서 static 함수는 클래스멤버변수중 static 멤버변수만 사용할 수 있는데, 여기서 주의할점은 static 멤버함수가 static만 사용할 수 있다고해서 초기화까지 가능한 것은 아니다. static 멤버변수는 클래스외부에서 명시적인 초기화가 필요하다. ex) int A::num = 1; 명시적 초기화 후에는 스태틱 멤버함수의 명시적인 사용도 가능하다. undefined reference to A::test() 정의되지 않은 참조 A::test() A::test()가 정의되지 않고서 사용을 하려할 경우. 이럴경우 함수정의부분에 클래스명시를 안한경우다. unresolved externals 에러의원인은 다양하다. 보통 클래스..

위상정렬(topological sort)

위상정렬이란 방향 그래프에서 연결되어 있는 정점을 재귀가 회귀하는 역순서로 정렬하는 것을 말한다. (재귀의 진행의 반대는 재귀의 회귀라고 하자. 진행은 스택에 쌓는작업이고 회귀는 스택을 푸는 작업이라고하자.) 내가 이해하는 대로 쓴것이다. 우선 위상정렬은 탐색과 다르게 탐색할때의 정점을 재귀의 회기시에 반환해서 정렬하는 형태를 말한다. 탐색은 정점에서 다음 노드들 다시말에 정점과 연결된 곳을 재귀진행시에 반환 했었다.(다음노드는 다음탐색의 정점이 되어서 탐색을 진행해 나간다.) 이런위상정렬을 할시 폐쇄로가 있다면 위상정렬의 해는 없어지게된다. 위상정렬을 하기위해선 우선 폐쇄로에대한 판단을 먼저 해야한다. 폐쇄로란, 특정 정점에서 시작해서 회로를 도는중 그 정점으로 돌아오는 경우 폐쇄로로 판정된다. 폐쇄로..

탐색-깊이우선탐색, 너비우선탐색

아래 1부터 7 까지의 노드들이 있다. 이런 노드들을 연결해놓은 아래와 같은 그림을 그래프라고한다. 트리와 그래프의 차이는 트리는 한 노드에서 또다른 노드까지 가는 방법이 1가지인데 반해 그래프는 여러가지방법이 있을 수 있다. 이제 깊이 우선 탐색을 알아보겠는데 깊이란 시작점에서 부채모양으로 퍼진형태가아닌 선형태로 탐색을 하는 것을말한다. 그림에서 1-2-4-7 , 1-2-5-6 이런식으로 탐색해 나가는것이 깊이 우선 탐색이라고 한다. 너비우선탐색은 (1-2 ,1-3) (2-4,2-5) 이런식으로 시작점을 정하면 부채꼴모양으로 가능한 연결수를 다 찾아낸후 다음 탐색을 하는 형태이다. 깊이우선탐색은 시작정점의 변경이 한번의 이동에 한번씩 된다. 하지만 너비우선탐색은 시작정점이 있으면 연결된 노드를 다 탐색..

가상함수 virtual 키워드 C++

클래스 타입의 포인터로 멤버함수를 호출할 때 virtual 키워드의 유무에따라 동작이 달라지게된다. 예를들면 class A { public: void test(){코드1} }; class B : public A{ public: void test(){코드2} }; A *a = new B(); a->test(); //동작1 : 코드1이 실행 동작2 : A클래스의 멤버함수인 test()를 virtual로 선언하면 코드2가 실행 좀더 확실하게 살펴보자 다음과 같이 코드를 작성해보자. A클래스와 A를 상속한 B클래스를 선언한 뒤 Message함수를 만들어 A클래스타입의 포인터 pa를 인수로 하여 A객체와 B객체를 정적/동적바인딩을 해보자. 정적바인딩 동적바인딩(vitual 키워드 사용) vitual 키워드의 유무..

프로그래밍/cpp 2013.06.04

상속과 생성자에 대한 고찰 C++

상속을 하면 자식클래스의 생성자는 어떻게될까? 부모의 생성자가 상속이 될 리는 없다. 우선 생성자의 이름이 다르기때문이다. 기능적인 상속조차 안된다는 것이다. 대신 자식클래스의 객체를 생성하게되면 부모클래스(최고부모까지) 거슬러올라가면서 생성자가 차례로 호출된다. 그럼 인수를 받아서 초기화해야하는 생성자의 경우는 어떤한가? 멤버이니셜라이져를 사용하면된다.

프로그래밍/cpp 2013.06.04

포인터 객체배열 C++

포인터 객체 배열이란? 클래스의 객체의 주소값을 가르키는 포인터들을 담는 배열이다. 간략하게 사용법을 적는다. Storage* Arr[100]; 선언을 한후 초기화는 하지않았다. 배열은 선언후 초기화를 해야하지않나요? 하지만 프로그램의 실행중에 동적으로 생성되는 객체를 무슨수로 초기화할 수 있을까. 그럼 메커니즘을 설명해보겠다. Arr[100] 포인터 배열은 초기화가 안되어있으므로 Arr[0]. Arr[1].... --------------> NULL 을 가르킨다. // 전역변수로 선언시! 배열요소가 비어있는 판단하는 기준은 Arr[i]==NULL 인지를 판단하고 객체의 생성은 new키워드의 동적할당이다. 이렇게 동적할당된 ////////// 포인터배열은 전역변수로 선언시 모든 요소는 NULL로 초기화된..

프로그래밍/cpp 2013.06.04
반응형