Digital 3D Anthropometry 2. Review Sungmin Kim SEOUL NATIONAL UNIVERSITY 기존프로그래밍기법의문제점 낮은코드가독성 Introduction 사용자인터페이스와데이터가혼재 사용자인터페이스를만드는코드와데이터정의가같이됨 다른운영체제나프레임워크를쓰는시스템에적용할수없음 코드의중복및복잡함 동일한코드가계속반복됨 구조체변수에동적으로메모리를할당하기어렵다 디버깅의어려움 데이터가체계적이지않아서오류가발생했을때찾기가어렵다 낮은코드재사용성 유사한기능의다른프로그램을만들때코드를재사용할수없다 표준 C 라이브러리와의비교 표준 C 함수처럼어떤프로그램에서도사용이가능한형태의코딩이필요함 2
Struct 의한계 데이터끼리연산이필요한경우함수를만들어야함 Introduction 데이터의종류와데이터를조작하는함수가많아질수록코드의양이증가 다른프로그램에서 struct 를쓰려면관련된코드를전부가지고다녀야함 struct Person AnsiString float Race,Gender,Age; Name; Height,Weight; 3 의등장 데이터를조작하는데필요한함수들까지전부포함하는 Struct의확장판 Property ( 멤버변수 ), Method ( 멤버함수 ) 로구성 내부의복잡한계산을추상화 (Encapsulation) 내부구조를몰라도사용이가능하며독자적유지보수가가능해짐 Introduction Object Property color, size, shape, speed, fuel Method refuel(), getfuel(), setspeed(), getspeed(), drive() - Car 4
를활용한객체지향프로그래밍 주요알고리즘이외의요소는기존라이브러리 (library) 를활용 CAD 프로그램개발에필요한기하학적요소처리클래스 이미지프로세싱개발에필요한대용량이미지핸들링클래스 수치해석시스템개발에필요한미적분해석엔진클래스 하드웨어컨트롤시스템개발에필요한 I/O 컨트롤클래스 Introduction 5 Struct 와 의비교 Struct 를 로바꾸는방법 struct ptpo float x, y; class ptpo ptpo(); ptpo(ptpo&); ~ptpo(); float x, y struct 키워드를 class 로바꾼다 이라는 access specifier 를추가한다 ptpo(), ptpo(ptpo&) 와 ~ptpo() 라는 special member function 들을추가한다 하나의클래스는하나의 unit (cpp 파일 ) 으로저장한다 클래스정의는 ptpo.h 헤더파일로 ( 이클래스를사용하려고할때 include 해주어야함 ) 클래스구현에필요한소스는 ptpo.cpp 파일로 6
Constructor & Destructor Constructor 정의를써서 object 를만들때처음으로실행되는함수 멤버변수들의초기값을결정할수있다 Struct 를만들때는일일이값을초기화해주어야한다 멤버변수가많은경우프로그래머가일일이지정해주지않아도된다 Copy Constructor 이미존재하는 object 를복사해서새로운 object 를만들때사용되는함수 Destructor 심층복사 (deep level copy) 를간단하게수행할수있음 ptpo a,b 가있을때 a=b 와같은조작이가능 생성된 object 를없앨때실행되는함수 동적메모리로할당된멤버변수들을해제» delete, free 함수등 기타 object 가없어질때해야하는많은 procedure 를프로그래머가지정하지않아도수행하게됨 7 Constructor & Destructor ptpo.h //---------------------------------------------------------- #ifndef ptpoh #define ptpoh //---------------------------------------------------------- class ptpo public : #endif ptpo(); ptpo(ptpo&); ~ptpo(); // constructor // copy constructor // destructor float x,y; // member variable ptpo.cpp //--------------------------------------------------------------- #pragma hdrstop #include "ptpo.h" //--------------------------------------------------------------- #pragma package(smart_init) ptpo::ptpo() x=y=0; // initialization ptpo::ptpo(ptpo &p) x=p.x; // copy y=p.y; ptpo::~ptpo() 8
Constructor & Destructor 객체를만드는방법 ptpo *P1=new ptpo; ptpo *P2=new ptpo(p1); // 생성자가호출됨 // 복제생성자가호출됨 ptpo *P3=new ptpo[100]; // 생성자가호출됨 (100% 바람직하지는않은방법 ) 객체를없애는방법 delete P1; delete []P3; // 파괴자가호출됨 // 파괴자가호출됨 객체배열을만들고하고없애는바람직한방법 ptpo **P=new ptpo*[100] for (i=0;i<100;i++) P[i]=new ptpo; for(i=0;i<100;i++) delete P[i]; delete []P; 9 Constructor & Destructor 동적으로객체의배열을만드는방법 ptpo **P; P=(ptPo**)calloc(100,sizeof(ptPo*)); // 처음으로배열을만들때 P=(ptPo**)realloc(P,sizeof(ptPo*)*100); // 배열의크기를바꿀때 for(i=0;i<100;i++) P[i]=new ptpo; 10
Member Variable 클래스의모든멤버함수가자유롭게 Access 가능 외부로부터의 Access 는 Access Specifier 에따라제한됨 Public 외부 process 에서자유롭게접근이가능 코드작성은쉽지만외부에서접근이쉬워오류가능성이높아짐 Private 내부변수는내부함수에서만접근이가능하게제한 변수 / 함수가외부와격리 (isolation) 되어안정성이높아지며수정이용이해짐 Protected 외부에서는접근이불가능하지만상속된클래스에서는참조가능 void private: AddIntParam(); GetIntParamNum() return iparamnum; GetIntParam(); iparamnum; *iparam; 11 Member Function 클래스의멤버함수를이용한계산을수행 계산에필요한코드가클래스에포함되므로재사용이용이해짐 비슷한작동을하는함수들의추상화에의한직관적프로그래밍이가능해짐 struct ptpo float x,y;... ptpo a,b; a.x=10; a.y=10; b.x=20; b.y=30; float c=getdistance(a,b);... Struct 를이용하는방법 float GetDistance(ptPo a,ptpo b) return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); class ptpo ptpo(); float x,y; float Distance(ptPo); float ptpo::distance(ptpo a) return sqrt((x-a.x)*(x-a.x)+(y-a.y)*(y-a.y));... float c=a.distance(b); 를이용하는방법 12
Polymorphism ( 다형성, 多形性 ) 동일한이름의함수를여러개만들수있음 파라미터를이용해서구분가능 다양한옵션을가지는함수를같은이름으로관리하므로기억하기쉬움 class ptpo ptpo(); ptpo(float,float); ptpo(ptpo&); ~ptpo(); float x,y; float Distance(ptPo); float Distance(float,float); ptpo::ptpo(float X,float Y) x=x; y=y; float ptpo::distance(float X,float Y) return sqrt((x-x)*(x-x)+(y-y)*(y-y)); 13 Operator Overloading 필요성, float 과같은기본형변수의경우사칙연산등을직관적으로할수있다 수학적인요소를 class 화한경우에도이런연산을할수없을까? ptpo 의경우 ptpo class a,b,c 를정의했을때 c.add(a,b), c.subtract(a,b) 라는함수를만드는것보다 c=a+b, c=a-b 와같이쓸수있다면? ptpo class a,b 와 float d 를정의했을때 d=a.innerproduct(b) 라는함수를만드는것보다 d=a*b 라고쓸수있다면? 14
Operator Overloading +, - 연산과내적계산 class ptpo ptpo(); ~ptpo(); ptpo(ptpo&); ptpo ptpo float operator+(const ptpo& N); operator-(const ptpo& N); operator*(const ptpo& N); ptpo ptpo::operator+(const ptpo& N) return ptpo (x+n.x,y+n.y); ptpo ptpo::operator-(const ptpo& N) return ptpo (x-n.x,y-n.y); float ptpo::operator*(const ptpo& N) return x*n.x+y*n.y; 응용분야 행렬, 복소수등여러 data class 에적용가능 15 Inheritance 기존에존재하는 의모든기능을상속받은새로운클래스의작성 Parent class 에는기본적인기능만을정의 기본기능에새로운기능을계속추가할수있음 TShape TCaption TEdit TComboBox TButton 16
Design TPo2D 평면상에서점의좌표를정의하고점과관련된연산을수행 TPo3D 공간상에서점의좌표를정의하고점과관련된연산을수행 TNewFileStream 바이너리데이터의입출력을수행 TNewCanvas 2D 그래픽용좌표변환을수행 TModel3D 3 차원모델을정의하며데이터의입출력을수행 TOpenGL 3 차원물체를 2 차원화면에표시하는기능을수행 TBodyData 인체데이터의정의및렌더링을수행 TBodySection 인체의단면정보를기록하며단면내각종계측을수행 TBodyLandmark 인체의랜드마크정보를관리 17