6월, 2017의 게시물 표시

STL

stl은 c++언어로된 라이브러리다. 크게 4개로 구성되어있다. -알고리즘(algorithm) -컨테이너(container) -반복자(iterator) -함수객체(functor) 기본이 되는 컨테이너는 c++로 구현된 잘 다듬어진 자료구조라고 보면된다. 그러나 게임관련쪽에서는 stl이 무거워서 새로 정의해서 쓰기도한다. 보통 실무에선 stl을 쓴다고한다. stl구현의 핵심은 템플릿이다. 컴파일할때 결정되는 다형성을 지니게 해준다. stl의 컨테이너는 크게 연관컨테이너(associative container),순차컨테이너(sequence container)로 나뉜다. 컨테이너란 객체를 담는 객체라고 생각하면된다. 객체를 저장하고,정렬 삭제 추가 등등을 할수있게 해주는 기본베이스이다. 순차컨테이너 : vector,list,deque가 있다. 그외에도 slist라던가 있지만 list를 알면 slist는 따라온다.  자료에 순서를 두기때문에 sequence container라고 칭한다. 연관컨테이너 : set,multiset,map,multimap이 있다. 자료의 순서보단 자료간의 관계를 중심으로 두기때문에 associative container라고 칭한다. 자료구조를 공부해보면 알겠지만 자료에 접근하기위해선 자료를 가리키는 무언가가  필요하다. C에서 자료구조를 구현하기위해 포인터를 사용한 경험이있을탠데, stl에선 반복자(iterator)개념을 사용하여 구현한다. iterator는 탬플릿클래스이다. 내부에 알고리즘,탐색등등 유용한 멤버함수와 객체를 가르키는 포인터가 있는 아주 강력한 클래스이다. vector ::iterator iter;     //int를 담는vector구조의 iterator 'iter'를 생성한다. 이렇듯 iterator를 사용하고자 하는 자료구조에 맞춰서 생성시켜줘야한다.

시스템 프로그래밍

-아스키코드와 유니코드 아스키코드 - 1바이트로 표현된다. 알파벳과 확장문자를 표현할수있다. 256개가 안넘어가서 1바이트로 표현한다. 유니코드 - 아스키코드로는 다른국가에서 사용하는 문자들을 표현할수없다. 그래서 유니코드가 나왔다. 유니코드는 2바이트를 사용한다. 65536개의 문자를 표현가능하다. 전세계문자를 표현가능하다. 문자셋이란? 약속된 문자의 표현방법. SBCS(Single Byte Character Set) -1바이트만 사용하는방식. 아스키코드가 대표적이다. MBCS(Multi Byte Character Set) -문자를 표현하는 데 있어서 다양한 바이트 수를 사용해서 문자를 표현하는 방식. 어떤문자는 1바이트,어떤문자는 2바이트로 표현한다. SBCS를 포함하는 개념이다. 영어사용시 1바이트 한글사용시 2바이트 이런식으로 유동적으로 사용한다. 그만큼 사용시 주의해야한다. WBCS(Wide Byte Character Set) -유니코드방식이다. 모든 문자를 2바이트로 표현한다. 유니코드방식을 사용하려면 문자를 다룰때 앞에 L을 붙여야함 wchar_t str[] = "ABC";  //오류 wchar_t str[] = L"ABC"  // 정상. 2바이트씩 NULL도 2바이트로 표현됨

c++)Friend에관해

class A { … friend void Func(); } void Func() { …           //class A의 모든 멤버를 접근 제한 없이 사용할 수 있다. } 단점) OOP의 장점인 캡슐화의 성능을 저해시킨다.

c++)오버로딩

컴파일러는 기본타입에 대한 연산자를 제공한다. ex)int a = 10,b=10; a+b ;  //결과는 20 그러나 사용자 정의타입에는 연산에 대한 정의가 되있지않기때문에 불가능하다. class point {  ………… } point a(10),b(10); a+b;    //오류! 연산정의가 안되있음 이때 연산자 오버로딩을 사용하면 사용자 정의타입끼리 연산이 가능하다. (코드의 직관성과 가독성을 높이기위해서 ) void operator+(point rhs) { } p1 + p2  //  p1.operator+(p2)와 같은 표현 오버로딩이 가능한 단항연산자 종류 {!,&,~,*,+,-<++,--} 컴파일러가 정의해논 ++연산자 void operator++() //전위 ++ 연산자 void operator++(int) //후위 ++연산자 이떄 int는 전위 후위를 구분하기위해 의미없는(dummy)정수형 인자를 전달 //////////////////////////////////////// 오버로딩이 가능한 이항연산자의 종류 { +,-,*,/,==,!=,<,<= 등등} 사용방법은 단항연산자와 동일,인자로 같은클래스(혹은 원하는 객체) 받음 //////////////////////////////////////// 전역함수로 연산자 오버로딩하기 기본적으로 point x,y; x+y ; 는 x.operator+(y)와 같다. 그러나 k + x; //k는 다른 어떠한 객체 에서는  x.operator+(k)가 아니다. operator+(k,x)가 된다. 이때 k는 오버로딩 객체가 아니므로 전역 함수 연산자 오버로딩을 사용해야한다. 그러나 클래스 내부가 아니기때문에 멤버변수에 접근이 불가능하므로 getter ,sette...

C언어 파일입출력문제

두개의 텍스트파일이 같은지 다른지 확인하기 공백하나라도 틀리면 다른파일이다. 1. fgetc로 하나씩 비교하기 2. feof로 언제까지 읽을지.. 구하기 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include      void main() {     FILE* fp1 = fopen("data1.txt", "r+t");     FILE* fp2 = fopen("data2.txt", "r+t");       char ch1, ch2;     int check = 1;     while (!feof(fp1) && !feof(fp2))     {         ch1 = fgetc(fp1);         ch2 = fgetc(fp2);           if (ch1 != ch2) {           ...

SnS로 버튼누르면 새로운창으로 교체하기

버튼을 눌렀을때 (시그널)->이벤트함수 호출(슬롯) hide()메서드 호출 -> 원래 있던 창이 숨겨짐 새로운 윈도우창 생성 -> 동적할당 후 show()

Qwidget

버튼을 버튼안에 넣을수있다. 자식을 생성할때 부모를 참조하면된다. 부모가 제거될때 자식도 사라진다. 이런식으로 계층구도를 짜나갈수있다. 자식의 위치는 부모의 위치기준으로 생성된다. //////////////////////////////////////// QWidget은 콘테이너형식이다. 담을수있는 공간이라고보면됨. //////////////////////////////////////// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include   < QApplication > #include   < QPushButton > int  main( int  argc,  char   * * argv) {  QApplication app (argc, argv);  QWidget window;  window.setFixedSize( 100 ,  50 );  QPushButton  * button  =   new  QPushButton( "Hello World" ,  & window);  button - > setGeometry( 10 ,  10 ,  80 ,  30 );  window.show();   return  app.exec(); } Colored by Color Scripter cs window라는 이름의 위젯을 생성한다 ->콘테이너가 되줌 window의 크기를 설정 window를 부모로 하는 자식버튼 동적으로 생성 버튼 생성위치 설정 window를 보...

Java-1

자바언어는 이식성이 높다. 자바언어로 개발된 프로그램은 JRE(Java Runtime Environment)이 설치되있는 모든 운영체제에서 실행 가능하다. 프로그램을 개발하는 기법으로 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립 및 연결해서 전체 프로그램을 완성하는 기법을 객체 지향 프로그래밍(OOP:Object Oriented Programming)이라고 한다. 이때 사용하는 언어를 객체지향언어라고 하는데 자바는 객체지향언어이다. 자바는 함수적 스타일 코딩을 지원한다. 함수적 프로그래밍은 대용량 데이터의 병렬처리 그리고 이벤트 지향 프로그래밍에 적합하다. 자바는 메모리를 자동으로 관리해준다. 자바는 개발자가 직접 메모리에 접근할 수 없도록 설계되었다. 메모리는 자바가 직접 관리한다. 객체 생성시 자동적으로 메모리영역을 찾아서 할당하고, 사용이 완료되면 Garbage Collector를 실행시켜 자동적으로 사용하지 않는 객체를 제거시켜준다. 자바는 Java SE(Special edition)을 제공해준다. 자바프로그램 개발에 필수적인 도구와 라이브러리 API를 정의해준다. 자바프로그램을 개발하고 실행하기 위해서는 반드시 JDK(Java Development Kit)를 설치 해야한다. 멀티스레드관련 API도 제공하고 있어서 쉽게 구현가능하다. 소스파일 ->컴파일러->바이트코드파일->JVM(java virtual machine)->실행 JRE = JVM + 표준 클래스 라이브러리 JDK = JRE + 개발에 필요한 도구

QtWidget의 계층구조

이미지
Qt의 제공클래스는 논리적인 계층구조를 따른다. 아래사진은 계층의 일부다. QObject는 매우 기본적인 클래스인데 다수의 클래스들이 QObject를 상속받는다. Widget들은 이벤트에 반응하고 signal과 slot메카니즘을 사용한다. 모든 widget들은  QObject를 상속받는다. 가장 기본적인 widget이 바로 QWidget클래스다. 위젯은 쉽게 윈도우창이라고 생각하면 편하다. 윈도우창처럼 크기,그안에서의 커서,툴팁,위치등등 여러 속성들을 가진다. 여하튼 계층구조를 아는것은 중요하다 . 왜? Q체크박스나 Q푸쉬박스를 생성해도 결국 커서모양이라던지 위치 이런것은 상속받은 QWidget에서 결정된다. 즉 공통적인 성질이란거다 크기나 커서모양 이런것은 계층구조를 파악하면 쉽게 파악및 사용이가능하다. 가족시스템(Parenting system)은 Qt 객체들을 다룰때 굉장히 유용하다. QObject를 상속받은 객체들은 가족시스템을 사용할수있다. 1.어떠한 객체가 파괴되면 그 자식객체들도 파괴된다.(delete된다.) 2.모든 객체들은 findChild,findChildren메서드를 가지고 있어서 자식을 검색하기 편하다. 3.하위 위젯은 상위위젯에 자동으로 들어가진다.

about Qt

Qt는 크로스플랫폼프레임워크입니다. 기본언어는 c++이지만 다양한 언어도 이제 사용가능합니다. 데이타베이스를 관리하는 gui를 만들거나 ,웹앱제작을 할수있는등 만능프레임워크다. 라이센스는 GPL/GNU GPL/Commercial 이 있다. 많은 위젯클레스(1000+)와 qwt클레스(125+)가 제공된다. 좋은 다큐멘테이션과 도움말, example이 있다. 무엇이 qt로 만들어졌는가? google earth,skype,KED(Operating System Dist.on Linux),Autodesk maya(animation) 등등 많이사용되었다. Qt Tools -Qt Creator : Cross platform IDE -Qt Designer : GUI layout and forms bulider -Qt Linguest : internationalization toolset -Qt Assist : Customizable documentation reader -Qt Qmake : cross platform build tool -Plugin for other IDE : intergration with visual studio and eclipse qt sdk : rich c++ library commercial라이센스는 너의 소스를 오픈소스로 공개하지않아도된다. -QT SDK- QtCore는 콘테이너,쓰레드관리,이벤트관리등등을 제공하는 라이브러리 QtGui,QtWidgets는 gui툴킷입니다. 어플리케이션디자인을위한 다양한 그래픽구성요소를 제공합니다. QtNetwork는 네트워크소통을 다루기위한 유용한 클래스를 제공합니다. QtWebkit는 Qt어플리케이션 안에서 웹페이지와 웹앱을 사용할수 잇게 해주는 웹킷엔진입니다. QtSQL 자체 드라이버로 확장 가능한 완전한 기능의 SQL RDBM 추상화 계층, ODBC, SQLITE, MySQL, PostgreSQL및 PostgreSQL이 ...

About 연산자 함수

연산자함수 어떤 클래스의 두 객체를 선언했다고 생각해보자. 기본적으로 객체끼리의 연산은 불가능하다. (ex)Rectangle1 + Rectangle2 = ???          //불가능 하지만 클래스 내부에 연산자함수를 정의해준다면 이러한 연산이 가능해진다. 정사각형을 두개 더한다고 생각해보자. 사람들마다 정사각형을 더했다! 라고 생각하는 값이 다를 것이다. 어떤사람은 "합한 결과는 마름모다" 라고 생각할 수도 있고, 어떤사람은 "합한 결과는 두 정사각형의 변의길이의 합이다" 라고도 할 수도 있겠다. 이렇게 사람마다 다르기 때문에 컴파일러 자체에서도 연산자를 자동생성하지 않는다. 대신 클래스 내부안에 +연산을 '두 객체의 변의 길이의 합을 변의 길이로 하는 정사각형' 이라고 정의를 내린다면 , 그때부터 그 규칙에 의해 연산이 가능하다. 변의길이가 9인 정사각형c =변의길이4 정사각형a + 변의길이5 정사각형b   이런식으로 말이다. 물론, 따로 멤버함수를 정의해서 같은 연산을 할수있겠지만.. a.plus(b) 보다 a+b가 가독성이 높은건 사실이다. 정의 형을 유지한 체 정보만 연산하는 것이 핵심이다. 정사각형 두개를 더한다고 생각하면, 정사각형이라는 형태는 유지하지만  변의 길이라는 정보는 연산이 되어야한다. 이런 규칙으로 만들어야 한다. Colored By Color Scripter ™ 1 2 3 4 5 6 7 8 9 10 11 12 13 class  Rectangle {      public :     Rectangle  operator +( const  Rectangle...