학교다닐 때도 분명 Class에 대해 배웠을 텐데 기억나는 게 없다. 역시 인생은 실전인 게 분명해. 무튼 오늘은 델파이의 클래스에 대해서 간략하게 (왜냐면 내가 자세하게 모룸) 정리하려고 한다. 자바를 배웠다면 클래스의 개념에 대해 어느 정도 알테지만 객체지향을 싫어했던 과거의 나(뺨 대...)는 클래스가 뭐져? 이므로! 다시 한 번 정리.
우선 델파이의 클래스는 아래와 같은 구성을 가진다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | T(클래스명) = class[(부모클래스)] private // private 변수 // private 함수 protected // protected 변수 // protected 함수 public // public 변수 // public 함수 published // published 변수 // published 함수 end; |
private와 protected, public, published는 접근 범위에 따라 선언하는 것으로, 각 접근 범위는 아래 그림으로 정리하였다.
위와 같으며, 보통 공유하지 않고 내부적으로 쓰이는 경우 private를, 상속받은 자식까지 사용가능하면 protected를, 그 외 다른 객체에서 사용가능하려면 public을, 그 외 툴에서 사용가능하게 하려면 published로 선언하게 된다. 개인적으로 private, public을 주로 사용하며 해당 소스가 아닌 큰 규모의, 프로젝트 전체가 공유하는 클래스를 만들 때 protected를 통해 유연하게 사용할 수 있다.
클래스에 대해 정리하기 전에 간단하게 정리할 것이 몇 가지 있는데, 객체와 상속 그리고 재사용의 개념이다.
먼저 클래스는 하나의 독립된 기능을 가지도록 만든 묶음이다. 이때 객체는 정의된 클래스를 기반으로 생성된 실체이며, 예를 들어 자동차 클래스를 기반으로 만든 소나타 객체와 같은 관계를 생각해볼 수 있다. 자동차 클래스는 특정 소스나 프로젝트에서만 사용한 것이 아니라 그대로 복사하거나 소스 참조를 통해서 다른 소스나 프로젝트에서도 사용이 가능해야 한다. 만약 특정 소스에서만 동작하는 경우 제대로된 클래스라고 할 수 없을 것이다.
상속은 부모의 기능을 기초로 하여 기능을 더하거나(Add), 빼거나(Sub), 새롭게 추가하는 것(New)이 가능한 것이다. 여기서 Add와 New의 차이점은 기존의 부모의 프로시저를 조금 변형하여 추가적인 기능을 구현하는 것을 Add, 부모에게 없던 프로시저를 새롭게 추가하는 것을 New라고 생각하면 될 것이다. 이 때 알아둬야 할 키워드(virtual, override, inherited, reintroduce)가 몇 가지 있는데, 추후에 따로 포스팅 할 예정이다.
마지막으로 재사용은 위에 객체를 설명하면서 쓴 내용과 유사하다. 어떤 클래스가 특정 환경(소스 또는 프로젝트)에서만 동작한다면 그것은 엄밀히 말해 객체라고 할 수 없다. 개인적으로 객체의 가장 큰 장점이 바로 이 재사용이라고 생각하며 구현시 가장 염두에 둬야할 부분이다. 이 때, 재사용이라는 관점에서 라이브러리와 혼동이 올 수도 있지만 객체는 상황에 맞게 수정이 가능하다는 점에서 단순히 여기저기서 쓸 수 있는 라이브러리와 차이점을 가진다.
아래는 간단한 클래스 예제(성적 관리 클래스)이다.
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 29 30 31 32 33 34 | TScore = class(TList) private fParent : TMainForm; fActiveClass : TClassScore; procedure SetActiveClass(const aActiveClass : TClassScore); function GetScoreGrid: TPowerStrGrid; function GetStudentGrid : TPowerStrGrid; function GetStudentSumGrid : TPowerStrGrid; protected function Get(Index : Integer) : TClassScore; procedure Put(Index : Integer; Item : TClassScore); public constructor Create(aParent : TMainForm); destructor Destroy; override; function Add(const aClass, aName : String; aKor, aEng, aMath : Integer) : Integer; overload; procedure Add(const aFile : TIniFile; const aClass : String); overload; procedure Clear; override; procedure Delete(Index : Integer); overload; function Delete(const aClass, aName : String) : Boolean; overload; procedure LoadFromFile(const aFileName : String); procedure SaveToFile(const aFileName : String); function ClassbyClassName(const aClass : String) : TClassScore; procedure SelectRow(const aClass : String); property ScoreGrid : TPowerStrGrid read GetScoreGrid; property StudentGrid : TPowerStrGrid read GetStudentGrid; property StudentSumGrid : TPowerStrGrid read GetStudentSumGrid; property ActiveClass : TClassScore read fActiveClass write SetActiveClass; end; | cs |
변수와 함수 사이에 개행, 성격이 다른 프로시저 사이에 개행을 하였다.
먼저 TScore라는 클래스는 TList를 상속받아서 구현하였다. Get, Put의 경우 Add하여 전달하는 변수의 자료형과 반환하는 자료형을 바꿔주었다. 필요하지 않은 프로시저의 경우 굳이 재정의하지 않았으며, LoadFromFile ~ ActiveClass는 상속받지 않은 New 프로시저들이다.
현재 성적을 추가하고, 삭제하고, 파일에서 불러오고, 파일로 내보내고, 클래스명(학년반)으로 추가한 클래스를 리턴받고, grid에 뿌려주는 기능을 가지고 있다. (현재 추가적으로 반 별 성적관리 클래스가 있는데 여기에 첨부하지 않아서 조금 어색한 부분이 있을 것이다) 성적을 관리하는데 필요한 기본적인 기능을 갖추고 있으며, 이 클래스를 그대로 다른 곳에서도 사용이 가능하다. 즉, 객체의 조건을 만족했다고 볼 수 있다(PO자신감WER)(회사사람들이 내 블로그 못보게 해주세요)(제발여).
어떤 식으로 구현하였는지는 지금 중요하지 않기 때문에 클래스 정의부분만 간단하게 살펴보았으며, 다음 포스팅에서 상속 관련 키워드들을 정리해야겠다.
아 const와 var, 그리고 property에 대해서도 정리해야지. 할 게 많구만!
'노동자의 삶 > 델파이' 카테고리의 다른 글
델파이 - 그리드에 체크박스가 안 나올 경우 (0) | 2018.07.27 |
---|---|
델파이의 클래스(2) - 클래스 관련 키워드(Virtual, Override, Inherited, Reintroduce) (0) | 2018.04.30 |
델파이에서 디버깅하기 (0) | 2018.04.24 |
델파이에서 Move와 Copy의 차이점 (0) | 2018.04.23 |
델파이 실행오류 - 동시에 두 개의 델파이를 켜고 싶을 때 (0) | 2018.02.27 |