본문 바로가기

Delphi

[Delphi] 정의 및 기초 정리

델파이 정의 (네이버지식백과)

미국 볼랜드에서 오브젝트 파스칼 언어의 기능을 향상시켜 개발한 일반 응용 프로그램 개발 언어이다. 또한 데이터베이스 프로그래밍까지 가능한 VCL 개발도구이다. VCL(visual component library)이라고 불리는 하나의 객체 지향적인 구조를 사용하며, 코딩하는 과정에서도 완성 후의 모습을 살펴볼 수 있다.

[네이버 지식백과] 델파이 [Delphi] (두산백과 두피디아, 두산백과)

델파이 정의 (나무위키)

procedure button1Click(Sender : TObject)
begin
  showmessage('Hello, World!');
end

파스칼이 객체지향적으로 발전한 Object Pascal로 만들어진 통합 개발 환경. 흔히 '델파이는 델파이로 만들어졌다'고 하는데 이것을 두고 하는 말이다.

물론 그것도 델파이 7까지의 이야기이고, 현재 매년마다 출시하는 델파이 XE 시리즈는 IDE 자체가 닷넷을 기반으로 한다. XE 개발 당시 닷넷 개발까지 고려하여 IDE를 설계했기 때문이라고 하는데, 결과적으로 IDE가 매우 무겁고 고쳐지지 않는 버그가 끊이지 않는 등 상당한 문제가 있다. 경쟁 제품이라고 볼 수 있는 비주얼 스튜디오와 비교한다면 너무나 단점들이 많아 전면적인 IDE 교체가 필요해 보이지만 개발사가 경영 문제로 여러 번 인수, 합병을 거치고 모바일 플랫폼 위주의 전략을 펼치다보니 당장에 IDE 개선이 이루어지진 않을 듯하다.

그러다보니 구관이 명관이듯이 델파이7이 출시된지 10년도 넘었지만 현역으로 잘 사용된다. 
물론 그 이유에는 잘 설계된 VCL이란 라이브러리와 모든 소스 코드가 포함되어 있어 버그 및 개선이 제 3자에 의해 지속적으로 이루어진다는 점 때문일 것이다. 또한 델파이 7은 닷넷이 필요치 않은 순수 Object Pascal로 만든 버전으로 매우 가볍다는 것과 한창 프로그래밍 붐이 일던 IT, 벤처 시기에 출시된 꽤 완성도 있는 개발툴이란 점도 중요하다. 오히려 현대의 델파이는 버그가 많고 기능이 불완전하다는 평을 받고 있는 것과 대조적이다.

 

https://namu.wiki/w/%ED%8C%8C%EC%8A%A4%EC%B9%BC(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%20%EC%96%B8%EC%96%B4)#%EB%8D%B8%ED%8C%8C%EC%9D%B4 

 

파스칼(프로그래밍 언어) - 나무위키

이 저작물은 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다. (단, 라이선스가 명시된 일부 문서 및 삽화 제외) 기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권

namu.wiki

 

델파이 특징

 

델파이란?


마이크로소프트 윈도우 응용프로그램을 위한 통합개발환경(고속개발도구)입니다. 오브젝트 파스칼 프로그래밍 언어로부터 파생된 언어입니다.

 

01. 오브젝트 파스칼(Object)

파스칼에 객체지향 개념을 포함하여 발전시킨 프로그래밍 언어로 델파이 언어로 잘 알려져 있습니다.

  • 파스칼(Pascal)
    1980년대와 90년대 초반에 걸쳐 널리 사용되었으며 교육용 언어였습니다. 발표당시 아주 기본적인 컴퓨터 언어의 요소만을 가지고 있어 시스템을 직접 다루기엔 부족하였고 포인터를 사용한 구조적 프로그래밍을 특징으로 합니다.

  • 구조적 프로그래밍(structured programming)
    절차지향 프로그래밍이라고도 하며 프로그램의 아무위치에서나 프로시저로 호출될 수 있고 다른 프로시저에서도 호출 가능하고 자기자신에서도 호출이 가능합니다. (GOTO 문이나 JUMP 문을 쓰는 것보다 프로그램 흐름을 더 쉽게 따라갈 수 있게 해주는 장점, 모듈화와 구조화가 가능한 장점)

 

02. 통합개발환경(Integrated Development Environment, IDE)

코딩, 디버그, 컴파일, 배포 등 프로그램 개발에 관련된 모든 작업을 하나의 프로그램 안에서 처리하는 환경을 제공하는 소프트웨어 입니다.

 

03. 고속 응용 프로그램 개발(Rapid Application Development, RAD)

소프트웨어 개발 방식의 하나로, 빠르고 쉽게 응용프로그램(윈도우 응용프로그램, 윈도우, iOS, Android 등)을 만들 수 있는 시각적 도구 입니다.

 

04. 델파이의 장점

델파이는 윈도우 아래에서 모든 부분을 프로그래밍 할 수 있는 강력한 언어로 높은 생산성과 간결한 코드가 대표적인 장점이고, C++과 비슷한 수준의 저순 시스템 프로그래밍도 가능합니다.

 

델파이 언어의 특징


델파이는 마이크로소프트 윈도우 기반하에서 모든 부분을 프로그래밍할 수 있는 강력한 언어로 높은 생산성과 간결한 코드가 대표적인 장점이며 C 이외에도 저수준의 시스템 프로그래밍이 가능한 소수의 언어입니다. 델파이의 일부로 취급되는 경향이 강해 개발사가 주도적으로 언어의 변화를 이끄는 특징이 있습니다.

 

또 현존하는 네이티브 언어(native language) 중 가장 빠른 컴파일 속도도 델파이만의 장점입니다. 대표적인 개발 도구로 볼랜드/코드기어의 델파이, 카릴릭스가 있습니다. 이외에도 프리 파스칼도 고유한 오브젝트 파스칼 외에 델파이를 컴파일할 수 있도록 지원합니다. 델파이는 향후 멀티플랫폼을 비전으로 삼고 윈도우 운영체제 이외에 다른 플랫폼들을 지원하는 방향으로 개발이 진행되고 있습니다. 현재 개발이 가능한 플랫폼으로는 OS X와 iOS, 안드로이드가 있습니다.

 

이전의 오브젝트 파스칼과의 차이

델파이 컴파일러의 지속적인 언어 확장을 통해 이전의 오브젝트 파스칼(터보 파스칼)의 제한을 서서히 벗어나기 시작하며 델파이에서 사용하는 언어를 오브젝트 파스칼이 아닌 델파이 프로그래밍 언어로 부르게 됩니다.

 

아래는 이전 오브젝트 파스칼에서 지원하지 않으나 델파이 컴파일러가 지원하는 특징입니다.

 

  • 멀티 플랫폼(윈도우 32/54비트, OSX, iOS, 안드로이드) 지원
  • 클래스 내의 선언부
  • 클래스 사이의 친구관계 막기
  • 최종 상속자
  • 레코드가 메소드를 포함
  • 인라인 함수
  • 연산자 오버로드
  • for 문의 반복자 사용
  • 제네릭 프로그래밍 지원
  • 유니코드(UTF-16) 지원
  • 익명의 함수 지원
  • Helper를 통한 타입 확장

 출처) https://12bme.tistory.com/244

 

[delphi] 델파이 개념 및 n-tier 구성

엠바카데로 델파이(Embarcadero Delphi Delphi)는 마이크로소프트 윈도우 응용프로그램을 위한 통합개발환경(고속 개발 도구)이며 원래는 볼랜드가 개발하였으나 지금은 엠바카데로사에서 소유하여

12bme.tistory.com

 

 

 

델파이 기초 (생활코딩 강의)

 

델파이 프로젝트

프로그램 개발의 단위. 프로그램 개발에 필요한 정보(소스코드, 폼, 리소스, 옵션 등)들을 모아 놓은 것

프로젝트의 종류

  • VCL 프로젝트(VCL Form Application) - 윈도우 프로그램 개발
  • FMX 프로젝트(Multi-Device Application) - 윈도우/맥/iOS/안드로이드 용 프로그램 개발
  • 콘솔 프로젝트(Console Application) - 화면이 없는 커맨드 라인 기반 프로그램 개발

파일 확장자

확장자 용도
*.pas 델파이 소스 파일
*.dfm 델파이 폼파일(VCL)
*.fmx 델파이 폼파일(FMX)
*.dpr 델파이 프로젝트 소스
*.dproj 델파이 프로젝트 정보, 옵션
*.dcu 델파이 컴파일된 유닛(Delphi Compiled Unit)
*.groupproj 프로젝트 그룹 정보

모두 저장 단축키 : Shift + Ctrl + S

프로젝트 옵션

Project > Options

자주 사용하는 옵션

  • Delphi Compiler
  • Forms
  • Application
  • Version Info

 

델파이 소스파일의 구조

소스파일 종류

  • 프로젝트 소스 파일 - 프로그램 구동에 필요한 소스코드
  • 유닛 파일 - 실질적인 소스 파일
  • 폼 파일 - 폼 정보 기록, 이벤트 등의 소스 파일 정보 포함

프로젝트 소스(*.dpr)

프로젝트 소스 보기 : Project Manager > (프로젝트 선택 후 오른쪽 마우스) > View Source

  • program - 프로그램 명
  • uses - 참조할 유닛(소스) 목록
  • begin ... end. - 프로젝트 소스코드

유닛(*.pas)

  • unit - 유닛 이름
  • interface - 선언부, 다른 유닛에서 참조 가능
  • implimentation - 구현부
  • uses - 참조할 유닛(소스) 목록
  • initialization - (옵션)유닛 초기화 시 수행할 코드
  • finalization - (옵션)유닛 종료 시 수행할 코드
  • end. - 소스의 끝

폼 파일(*.dfm, *.fmx)

  • 폼 정보 보기 : 폼 디자이너 > (우측 마우스 버튼) > View as Text (Alt + F12)
  • 폼 화면 보기 : 코드 에디터 > (우측 마우스 버튼) > View as Form (Alt + F12)

문법 요소

  • 한 문장의 단위
    • ;(세미콜론)으로 마무리
    • begin ... end;
  • 들여쓰기, 빈줄공백
  • 주석
    • // 한줄 주석
    • { 여러 줄 주석 }
    • (* 여러 줄 주석 *)

 

델파이 컴포넌트

컴포넌트 기반 개발

컴포넌트 기반 개발(Component-based development, CBD)은 기존의 시스템이나 소프트웨어를 구성하는 컴포넌트를 조립해서 하나의 새로운 응용 프로그램을 만드는 소프트웨어 개발방법론이다. - 위키백과 참조
(위키백과: https://ko.wikipedia.org/wiki/컴포넌트_기반_소프트웨어_공학)

델파이 컴포넌트

  • 비주얼 컴포넌트: UI 컨트롤(버튼, 체크박스, 에디트 등)
  • 논비주얼 컴포넌트: 기능 제공 목적(타이머, 소켓, DB연결 등)

실습용 컴포넌트

주요 속성(P), 메소드(M), 이벤트(E)

TLabel(레이블)

  • Caption

TEdit

  • Text

TButton

  • Caption
  • OnClick (E)

TMemo

  • Lines
    • Lines[0]
    • Lines.Text
    • LInes.Add (M)

ShowMessage(문자열);

 

 

변수

변수(變數, Variable), 프로그램 실행 중 변할 수 있는 값

변수 선언

1
2
var
변수명[, 변수명2]: 자료형;

변수 사용

1
2
3
4
5
6
7
8
9
10
11
12
var
UserName, Message: string;
Age: Integer;
I, J: Integer;
begin
변수명 := 값;
UserName := '홍길동';
Message := UserName + '님 안녕하세요.';
Age := 23;
I := 10;
J := I + 3;
end;

파스칼 표기법(PascalCase) - 단어의 첫문자를 대문자로 표기

변수 사용의 이점

  • 재사용성 - 한 곳에서 설정한 값을 반복 사용
  • 높은 가독성 - 값의 이름을 지정
  • 복잡성 감소 - 복잡한 계산과정을 분리

변수 사용하지 않고 계산

12,000원을 1년 이율 10%로 상환시 원금과 이자, 상환금액을 계산하는 과정

1
2
3
4
5
Memo1.Lines.Clear;
Memo1.Lines.Add('대출금:'+IntToStr(12000));
Memo1.Lines.Add('월원금:'+IntToStr(Trunc(12000 / 12)));
Memo1.Lines.Add('월이자:'+IntToStr(Trunc(12000 * 0.1 / 12)));
Memo1.Lines.Add('월합계:'+IntToStr(Trunc((12000 / 12) + (12000 * 0.1 / 12))));

만약? 대출금액을 변경하려면?

변수를 사용해 계산

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
Loan: Integer;
MonthlyPay: Integer;
Interest: Integer;
MonthlySum: Integer;
begin
// Loan := 12000;
Loan := StrToInt(Edit1.Text);
MonthlyPay := Trunc(Loan / 12);
Interest := Trunc(Loan * 0.1 / 12);
MonthlySum := MonthlyPay + Interest;
 
Memo1.Lines.Clear;
Memo1.Lines.Add('대출금:'+IntToStr(Loan));
Memo1.Lines.Add('월원금:'+IntToStr(MonthlyPay));
Memo1.Lines.Add('월이자:'+IntToStr(Interest));
Memo1.Lines.Add('월합계:'+IntToStr(MonthlySum));
end;
 

상수

상수(常數, constant), 프로그램 실행 중 변하지 않는 값

상수 선언

1
2
3
4
const
상수명 = 값;
상수명 = 표현식;
상수명: 자료형 = 값;

상수 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const
Min = 0;
Max = 100;
Center = (Max - Min) div 2;
Beta = Chr(225);
NumChars = Ord('Z') - Ord('A') + 1;
Message = 'Out of memory';
ErrStr = ' Error: ' + Message + '. ';
ErrPos = 80 - Length(ErrStr) div 2;
Ln10 = 2.302585092994045684;
Ln10R = 1 / Ln10;
Numeric = ['0'..'9'];
Alpha = ['A'..'Z', 'a'..'z'];
AlphaNum = Alpha + Numeric;

상수 사용의 이점

  • 일관성 - 반복 사용되는 값을 한곳에서 관리
  • 높은 가독성 - 값에 이름을 지정
  • 유지보수성 - 여러 값들을 한곳에서 관리 가능

 

문자 자료형

문자열/문자 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
MyString: string;
MyChar: Char;
begin
MyString := '안녕 하세요';
MyString := '안녕' + ' 하세요';
MyString := MyString + '!';
// 1 + 1 <> '1' + '1' ( 2 <> '11')
 
MyString := '''험프리''님 안녕하세요.';
ShowMessage(MyString);
 
MyString := 'Line1'#13#10'Line2';
 
MyChar := '안';
MyChar := MyString[1];
end;

문자열 종류

종류 최대 길이 비고
string(UnicodeString) ~ 2^30 자 Unicode 문자, 2바이트 문자
WideString ~ 2^30 자 Unicode 문자, 모바일 플랫폼 미지원
AnsiString ~ 2^31 자 1바이트 문자
ShortString 255자 1바이트 문자, 하위 호환용

참고: String Types(Delphi) - 엠바카데로 위키

문자 관련 함수

함수란? - 특정 동작을 수행하도록 구현된 코드블록, 함수 이름, 매개변수(파라메터) 들, 반환 값으로 구성

  • Length(S: string): Integer; - 문자열 S의 길이(글자수) 반환
  • Pos(SubStr, Str: string): Integer; - 문자열 Str에서 SubStr의 위치 반환
  • Copy(S: string, Index, Count: Integer): string; - 문자열 S에서 Index 부터 Count 길이만큼 문자열을 잘라 반환
  • StringReplace(S, Old, New: string; Flags: TReplaceFlags): string; - 문자열 S에서 Old를 New로 치환 해 반환
  • Trim(S: string): string; - 문자열 S 앞뒤의 공백을 제거해 반환
  • IntToStr(Value: Integer): string; - 정수 Value를 문자로 치환해 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Num := Length('안녕하세요');
Memo1.Lines.Add('문자열의 길이: ' + IntToStr(Num)); // 5
 
Num := Pos('하', '안녕하세요');
Memo1.Lines.Add('[하]의 위치: ' + IntToStr(Num)); // 3
 
Str := Copy('안녕하세요', 3, 2);
Memo1.Lines.Add('3번째에서 2글자 복사: ' + Str); // 하세
 
Str := StringReplace('안녕하세요', '하세요', '히가세요', [rfReplaceAll]);
Memo1.Lines.Add('문자열 치환: ' + Str); // 안녕히가세요
 
Str := Trim(' 안녕 하세요 ');
Memo1.Lines.Add('앞뒤 공백 제거: ' + Str); // 안녕 하세요

코드 툴팁(Shift + Ctrl + Space), 코드완성(Complete Code, Ctrl + Space) 활용

연습문제

1, 너의 이름은

아래 코드는 문자열 S에서 이름과 나이를 추출하는 코드입니다.

이름을 추출하는 코드는 이미 완성되었습니다. 나이를 완성하는 코드를 완성하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
S, S2: string;
Name, Age: string;
I, C: Integer;
begin
S := '내 이름은 [홍길동], 나이는 <23> 입니다.';
 
I := Pos('[', S) + 1; // 8
C := Pos(']', S) - I; // (11 - 8) = 3
Name := Copy(S, I, C);
 
// [*] 위의 코드를 참고해 나이를 추출하는 코드를 완성하세요.
// Age := Copy(
 
S2 := '이름 : ' + Name + #13#10;
S2 := S2 + '나이 : ' + Age;
 
Memo1.Lines.Add(S);
Memo1.Lines.Add(S2);
end;

새로운 프로젝트를 만들어 시작해보세요.
(시작이 어려운 분들은 다운로드 링크를 클릭 해 프로젝트를 다운로드 받아 빈 내용을 완성하세요.)

2, 생일 축하

생일을 축하하는 축하메시지를 만드는 프로그램을 만들고 있습니다.

메모에 입력된 축하메시지 양식에서 [Name]과 [Age] 항목을 입력받은 이름과 나이로 치환해 메시지를 표현하는 코드를 완성하세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
var
S, S2: string;
Name, Age: string;
begin
S := mmoMessage.Lines.Text;
Name := edtName.Text;
Age := edtAge.Text;
 
S2 := S;
// S2의 [Name] 항목을 StringReplace 함수를 이용해 입력받은 이름으로 치환하세요.
// S2의 [Age] 항목을 StringReplace 함수를 이용해 입력받은 나이로 치환하세요.
 
ShowMessage(S2);

새로운 프로젝트를 만들어 시작해보세요.
(시작이 어려운 분들은 다운로드 링크를 클릭 해 프로젝트를 다운로드 받아 빈 내용을 완성하세요.)

 

 

숫자 자료형

정수 자료형

종류 범위 형식
Integer -2^31 ~ 2^31-1(-2,147,483,648~2,147,483,647) 부호 있는 32-bit
Int64 -2^63 ~ 2^63-1
(-9,223,372,036,854,775,808~9,223,372,036,854,775,807
)
부호 있는 64-bit
Word 0 ~ 2^16-1(0~65,535) 부호 없는 16-bit
Byte 0 ~ 255 부호 없는 8-bit
Cardinal 0 ~ 2^32-1(0~4,294,967,295) 부호 없는 32-bit
NativeInt (32-bit) -2147483648..2147483647(-2^31..2^31-1)
(64-bit) -9223372036854775808..9223372036854775807
(-2^63..2^63-1)
부호 있는 32-bit
부호 없는 64-bit

참고: Simple Types (Delphi), Integer Types - 엠바카데로 위키

실수 자료형

종류 범위 크기 유효 자리수
Single 1.18e-38 .. 3.40e+38 4 바이트 7~8
Double(Real) 2.23e-308 .. 1.79e+308 8 바이트 15~16
Currency -922337203685477.5807.. 922337203685477.5807 8 바이트 10~20
Extended (32-bit) 3.37e-4932 .. 1.18e+4932
(64-bit) 2.23e-308 .. 1.79e+308
10 바이트
8 바이트
10~20
15~16

참고: Simple Types (Delphi), Real Types - 엠바카데로 위키

부동소수점

산술 연산자

연산자 의미 예제
+ 더하기 2 + 4= 6
- 빼기 6 - 4 = 2
* 곱하기 3 * 4 = 12
/ 실수 나누기 9 / 2 = 4.5
div 정수 나누기의 몫 9 div 2 = 4
mod 정수 나누기의 나머지 9 mod 2 = 1

참고: Expressions, Arithmetic Operators - 엠바카데로 위키

숫자 관련 함수

함수란? - 특정 동작을 수행하도록 구현된 코드블록, 함수 이름, 매개변수(파라메터) 들, 반환 값으로 구성

  • StrToInt(S: string): Integer; - 문자열을 정수로 변환해 반환(TryStrToInt, StrToIntDef)
  • StrToFloat(S: string): Extended; - 문자열을 실수로 변환해 반환
  • Inc(var O: Ordinal; C: Integer = 1); - O 변수의 값을 C만큼 증가(기본 1 증가)
  • Dec(var O: Ordinal; C: Integer= 1); - O 변수의 값을 C만큼 감소(기본 1 감소)
  • Trunc(X: Real): Int64; - 실수의 소수점 절삭 후 정수 반환
  • Round(X: Real): Int64; - 실수를 반올림 후 정수 반환
  • Floor(S: Single): Integer; - 실수의 소수점 절삭 후 정수 반환
  • Ceil(S: Single): Integer; - 실수의 소수점 올림 정수 반환
  • Abs(Integer): Integer; - 절대값 반환
  • FormatFloat(Format: string; Value: Extended): string; - 실수 Value를 Format에 맞는 문자열 반환

수학 관련 함수

 

Mathematical Routines - RAD Studio

<!-- Saved in parser cache with key wikidb-rad_tokyo_en_:pcache:idhash:27332-0!canonical and timestamp 20221104022346 and revision id 228363 -->

docwiki.embarcadero.com

 

불린 자료형

Boolean 문법

1
2
3
4
5
6
7
8
9
10
var
Value: Boolean; // True(참), False(거짓)
begin
Value := True; // False
Value := X > 0;
 
if Value then
begin
end;
end;

비교 연산자/관계 연산자

연산자 연산 예제
A = B A와 B가 같음 Name = '홍길동', X = 1
<> B A와 B가 같지 않음 Name <> '이순신', X <> 0
< B A가 B보다 작음 Age < 18
> B A가 B보다 큼 Age > 13
<= B A가 B보다 작거나 같 Age <= 19
A >= B A가 B보다 크거나 같음 Age >= 20

논리 연산자

연산자 연산 예제
not A A의 부정 not False = True, not (X = 0)
A and B A와 B가 모두 참(논리곱) (Age>=8) and (Age<=13)
A or B A또는 B가 참(논리합) (Age < 8) or (Age > 13)

 

조건문

주어진 조건에 만족한 경우에 문장을 실행하는 문법.

조건식, Boolean

조건문의 조건식은 Boolean 자료형을 갖습니다. 즉, 참 또는 거짓.

  • 비교 연산자 - =, <>, <, >, <=>=
  • 논리 연산자 - not , and, or
 

if 문

조건식이 True인 경우 문장을 실행한다.

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
if 조건식 then
begin
명령문1;
명령문2;
end;
 
if 조건식 then
명령문;
 
if True then
ShowMessage('True');
 
if False then
ShowMessage('False');
 
Bool := (1>0) and (True or False) and not (True and False);
if Bool then
begin
end;
 
if Edit1.Text = '' then
ShowMessage('항목을 입력하세요.');
 
if Age < 18 then
begin
ShowMessage('성인이 아닙니다.');
DoSomething;
Exit;
end;

조건식은 불린 자료형(True 또는 False)이어야 한다.

조건식이 True인 경우만 명령문이 실행된다.

명령문은 한줄 또는 begin...end로 감싼 여러줄을 사용할 수 있다.

if else 문

조건식이 True인 경우 if 이후의 문장을 False인 경우 else 이후의 문장을 실행한다.

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
if 조건식 the
begin
True명령문1;
True명령문2;
end
else
begin
False명령문1;
False명령문2;
end;
 
if True then
ShowMessage('True')
else
ShowMessage('False');
 
if False then
ShowMessage('True')
else
ShowMessage('False');
 
if I mod 2 = 0 then
begin
ShowMessage('짝수입니다.')
end
else
begin
ShowMessage('홀수입니다.');
end;

조건식이 True인 경우 True명령문, False인 경우 False명령문이 실행된다.

명령문들은 한줄 또는 begin...end로 감싼 여러줄을 사용할 수 있다.

else 앞의 end에는 세미콜론(;)이 포함되지 않는 것을 주의한다.

중첩된 if else 문

if else 문을 중첩해 사용할 수 있다.

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
if 조건식1 then
begin
True명령문1;
end
else if 조건식2 then
begin
True명령문2;
end
else
begin
False명령문;
end;
 
if 조건식1 then
begin
if 조건식2 then
begin
명령문1;
end;
명령문2;
end
else
begin
명령문3;
end;

조건식1이 True인 경우 True명령문1이 실행된다.
조건문1이 False이고, 조건문2가 True인 경우 True명령문2가 실행된다.
조건문1과 조건문2가 모두 False인 경우 else의 False 명령문이 실행된다.
else if문의 계속 추가할 수 있지만, if문의 길이가 길어지면 코드를 읽기가 어려워지므로 너무 길지 않게 작성해야 한다.

if문 안에 if문이 포함될 수 있으므로, begin...end로 문장을 감싸고, 들여쓰기로 조건과 명령을 구분해 가독성을 높여야 유지보수가 용이하다.

 

case 문

순서가 있는 값(Ordinal)이 조건값과 같은 문장을 실행한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
case (순서가 있는)값 of
조건값1:
begin
명령문1;
end;
조건값2,조건값3: 명령문2;
조건값4..조건값5: 명령문3;
...
else
else명령문;
end;
 
case Age of
0: Title := '태아';
1..7: Title := '유아';
8..13: Title := '초등학생';
14,15,16: Title := '중학생';
17..19: Title := '고등학생';
else Title := '성인';
end;

case의 값(또는 식)은 순서가 있는 자료형(정수, 열거형, Char 등)이어야 한다.
식에서 함수를 사용할 수 있지만, 가독성을 위해 함수의 결과값을 변수에 담아 변수를 식에서 사용하는 것이 좋다.

조건값은 식의 결과 값을 예상해 하나 또는 여러개의 값(쉽표로 구분) 또는 범위(2개의 값 사이에 마침표(.)2개)로 작성해야 한다.식의 결과 값과 조건값이 같으면 조건값 뒤의 명령문을 실행한다. 명령문은 한줄 또는 begin...end로 감싼 여러줄로 작성할 수 있다.

식의 결과 값이 지정한 값에 포함되지 않으면 else 이후의 else명령문이 실행된다.
else 절은 선택사항으로 else 절을 포함하지 않고도 case 문을 구성할 수 있다.

case 문은 end;로 종료된다. case...end;로 begin이 없다는 것을 주의한다.

 

 

반복문

일련의 문장을 반복적으로 실행하는 문법. 조건 또는 변수의 상태로 반복을 결정.

 

for 문

지정된 범위에서 명령을 반복한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for 반복변수 := 시작값 to 마지막값 do
begin
명령문1;
명령문2;
end;
 
for 반복변수 := 시작값 downto 마지막값 do
begin
명령문1;
명령문2;
end;
 
for I := 1 to 9 do
Memo1.Lines.Add(IntToStr(I * 3)); // 3, 6, 9, ..., 27
 
for I := 9 downto 1 do
Memo1.Lines.Add(IntToStr(I * 3)); // 27, 24, 21, ..., 3

for 문은 시작값 부터 마지막값까지 반복하며 명령문을 실행한다.
반복변수에는 시작값 부터 마지막값까지 반복하며 담기며, to 인경우 1씩 증가, downto인 경우 1씩 감소한다.
반복변수는 명령문에서 참조할 수 있다

for-in 문

데이터 컨테이너에 담긴 데이터 만큼 명령을 반복한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for 데이터변수 in 컨테이너 do
begin
명령문1;
명령문2;
end;
 
const
IntArray: array[0..4] of Integer = (1, 2, 3, 4, 5);
var
I, Val: Integer;
begin
for I := 0 to Length(IntArray) - 1 do
begin
Val := IntArray[I];
// Val에 대한 작업
end;
 
for Val in IntArray do
begin
// Val에 대한 작업
end;
end;

데이터변수의 자료형은 컨테이너에 담긴 데이터의 자료형과 일치해야 한다.

컨테이너는 배열, 문자열, 집합, 컬렉션, 구조체 등을 사용할 수 있다.

 

while 문

조건을 만족하는 동안 명령을 반복한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
while 조건식 do
begin
명령문1;
명령문2;
명령문3;
end;
 
Sum := 0;
I := 1;
while Sum < 100 do
begin
Sum := Sum + I;
Inc(I);
end;

 반복(Loop)이 시작되는 시점에 반복횟수를 알지 못하는 경우 사용.

조건식의 결과 값은 불린 자료형(True 또는 False)이어야 한다.
조건식의 결과 값이 True인 동안 명령문을 반복한다.

조건식과 명령문에서 사용하는 변수는 while문 전에 초기화해야 한다.
조건식을 변경하는 코드가 명령문에 없거나, 잘못 구현되었다면 명령문을 무한반복(무한루프)할 수 있으니 주의해야 한다.
위의 예제에서 I를 증가하는 코드(Inc(I);)가 없다면 I는 계속 1인 상태로 무한반복되고 프로그램이 동작하지 않게 된다.

repeat 문

명령을 실행하고, 조건을 만족하는 경우 반복을 종료한다.

1
2
3
4
5
repeat
명령문1;
명령문2;
명령문3;
until 조건식;

명령문을 실행하고 조건식에서 반복을 종료할지 판단. 조건식의 결과 값이 True인 경우 repeat문 종료.
명령문이 최소한 1번은 실행된다는 것이 특징.

repeat...until 사이에 명령문 작성. begin..end 없이 사용해야 함을 주의할 것
일반적으로 명령문의 내용에 의해 조건식이 결정되는 경우 사용

 

Break;, Continue;

반복문을 중단(Break)하거나, 다음 반복으로 넘어간다.(Continue)

모든 반복문(for, while, repeat)에 적용된다.

Break;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 예제 1
for I := 1 to 5 do
begin
if I = 3 then
Break;
Memo1.Lines.Add(IntToStr(I));
end;
Memo1.Lines.Add('끝');
 
// 예제 2
for I := 0 to Memo1.Lines.Count - 1 do
begin
if Memo1.Lines[I] = '' then
Break;
Memo2.Lines.Add(Memo1.Lines[I]);
end;

반복문에서 Break; 명령어를 만나면, 반복을 중단한다.

예제1에서 for 문은 1 부터 5까지 반복하며 Memo1에 한줄씩 숫자를 기록한다.
하지만, I = 3인 if 문에서 Break를 만나 for 문의 반복(begin..end)을 중단하고 for문 다음 코드를 실행한다.
결과적으로 메모에는 '1, 2, 끝'만 기록된다.

예제2에서 Memo1의 LInes에서 공백인 줄을 만나면 반복문을 중단한다.
즉, Memo1의 내용을 Memo2에 공백 전까지만 복사하는 내용이다.
(한줄씩 복사하다 공백을 만나면 중단한다.)

Continue;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 예제 1
for I := 1 to 5 do
begin
if I = 3 then
Continue;
Memo1.Lines.Add(IntToStr(I));
end;
Memo1.Lines.Add('끝');
 
// 예제 2
for I := 0 to Memo1.Lines.Count - 1 do
begin
if Memo1.Lines[I] = '' then
Continue;
Memo2.Lines.Add(Memo1.Lines[I]);
end;

반복문에서 Continue; 명령어를 만나면, 다음 반복을 진행한다.

예제1에서 I=3인 if 문을 만나면 다음 반복을 진행한다.
즉, I=3인 경우 Continue 다음의 코드(3 출력)를 모두 무시하고 I=4인 반복을 진행한다.
결과적으로 메모에는 '1, 2, 4, 5, 끝'이 출력된다.

예제2에서 Memo1의 Lines에서 공백인 줄을 만나면 다음 반복을 진행한다.
즉, Memo1의 내용 중 공백인 줄을 제외하고 Memo2에 복사하는 내용이다.

 

 

배열(Array)

같은 자료형의 데이터들을 순차적으로 담는 데이터 구조.

배열 데이터 구조 예시

정수 배열 - array[0..9] of Integer

문자열 배열 - array[0..6] of string

다차원 배열 - array[0..2] of array[0..8] of Integer;

배열 길이 지정 방식

  • 정적배열 - 선언 시 배열의 범위(길이) 지정
  • 동적배열 - 사용 시 배열의 길이 지정 및 변경

정적 배열

범위(길이)가 정해진 배열

문법

1
array[시작인덱스..끝인덱스] of 자료형;

선언

1
2
3
4
var
IntArray: array[0..9] of Integer;
StrArray: array[1..10] of string;
EditArray: array[0..1] of TEdit;

배열의 시작인덱스는 끝인덱스보다 작아야 한다.
시작인덱스는 어떤 수로도 시작할 수 있다.

배열의 자료형으로 숫자, 문자, 구조체 등의 기본자료형 및 컴포넌트, 폼 등의 클래스 타입도 사용할 수 있다.

사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
IntArray[0] := 10;
IntArray[1] := 20;
 
for I := 0 to Length(IntArray) - 1 do
IntArray[I] := I;
 
for I := Low(StrArray) to High(StrArray) do
StrArray[I] := IntToStr(I);
 
EditArray[0] := Edit1;
EditArray[1] := Edit2;
 
for Edit in EditArray do
Memo1.Lines.Add(Edit.Text);

배열의 길이는 Length() 함수로 알수 있으며, 길이는 (끝인덱스 - 시작인덱스 + 1)이다.
배열은 시작인덱스는 Low() 함수로, 끝인덱스는 High() 함수로 알수있다.

배열의 각요소는 배열 변수에 대괄호([]) 인덱스로 접근할 수 있다.
다차원 배열은 대괄호의 반복해 접근할 수 있다.

다차원 배열

문법

1
2
3
4
array[시작..끝] of 자료형;
 
array[시작..끝] of array [시작..끝] of 자료형;
array[시작..끝, 시작..끝] of 자료형;

사용

1
2
3
4
5
6
7
8
9
10
11
12
var
Matrix: array[0..2] of array[0..9] of Integer;
Matrix2: array[0..2, 0..9] of Integer;
begin
// 1차원 반복[0..2]
for I := Low(Matrix) to High(Matrix) do
begin
// 2차원 반복[0..9]
for J := Low(Matrix[I]) to High(Matrix[I]) do
Matrix[I][J] := Random(100);
end;
end;
 

동적배열

길이가 정해지지 않은 배열, 상황에 맞게 배열의 길이 설정 후 사용

문법

1
2
3
4
5
array of 자료형;
 
array of array of 자료형;
 
TArray<자료형>; // TArray<T> = array of T

제너릭 배열(TArray<자료형>) 사용 시 System.Generics.Collections 유즈절에 추가 필요(델파이 2009 이상)

선언

1
2
3
4
5
var
IntArray: array of Integer;
StrArray: TArray<string>; // array of string;
 
Matrix: array of array of Integer;

다차원 배열 선언 시 array of 반복

사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SetLength(IntArray, 5); // [0..4]
SetLength(StrArray, Length(IntArray));
 
for I := Low(IntArray) to High(IntArray) do
StrArray[I] := IntToStr(IntArray[I]);
 
SetLength(Matrix, 2);
for I := Low(Matrix) to High(Matrix) do
begin
SetLength(Matrix[I], I+1);
for J := Low(Matrix[J]) to High(Matrix[I]) do
Matrix[I][J] := Random(100);
end;
 
// string = array of Char;
S := 'Hi Delphi';
for I := 1 to Length(S) do // 0번째는 문자열의 길이
Memo1.Line.Add(S[I]);
 
// 배열 직접연산: 델파이 XE7부터 지원
IntArray2 := [1, 2, 3, 4, 5]; // 1,2,3,4,5
IntArray2 := IntArray2 + [8, 9]; // 1,2,3,4,5,8,9
Insert([6, 7], IntArray2, 5); // 1,2,3,4,5,6,7,8,9
Delete(IntArray2, 3, 2); // 1,2,3,6,7,8,9

SetLength() 함수로 동적배열 길이 설정, 이후 사용법은 정적배열과 동일
동적 다차원 배열은 행마다 다른 크기의 열 개수를 지정 가능

XE7 버전 이후, 동적배열 직접 연산(초기화, + 연산자) 지원, Insert/Delete/Concat 함수 지원 추가됨

문자열 - string(array of Char)

배열 상수

배열을 상수로 선언 후 초기값 설정 가능

1
2
3
4
5
6
const
Numbers: array[0..9] of Integer = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
Digits1: array[0..9] of Char = ('0','1','2','3','4','5','6','7','8','9');
DIgits2: array[0..9] of Char = '0123456789';
 
Matrix: array[0..1, 0..2] of Integer = ((0, 1, 2), (1, 2, 3));

배열 타입

배열 타입을 선언 후 변수, 상수의 자료형으로 사용

1
2
3
4
5
6
7
8
9
type
TIntDynamicArray = array of Integer;
TNumbers = array[0..9] of Integer;
TIntMatrix = array of array of Integer;
var
Int1, Int2: TIntDynamicArray;
Matrix: TIntMatrix;
const
NUMS: TNumbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
 

TStringList

문자열 목록을 관리하는 객체
TStrings 클래스 계승해 구현 됨

사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
uses System.Classes;
 
var
I: Integer;
StrList: TStringList;
begin
StrList := TStringList.Create; // (*) 객체 생성
try
// StrList 사용
StrList.Add('항목1');
StrList.Add('항목2');
StrList.Add('항목3');
 
ShowMessage(StrList[0]);
 
for I := 0 to StrList.Count - 1 do
Memo1.Lines.Add(StrList[I]);
finally
StrList.Free; // (*) 객체 해제
end;
end;

'System.Classes'에 구현되어 있음(uses 절에 추가)

객체 생성(.Create)해 사용 후 반드시 해제(.Free)할 것.
try...finally 문법: try..finally 사이의 코드에서 오류가 발생해도 finally...end 사이의 코드가 실행 됨
(즉, 생성한 객체를 해제하지 않으면 메모리 누수 발생)

for-in 문법 지원

주요 기능

  • Add(const S: string) - 문자열 S를 목록에 추가
  • Delete(Index: Integer) - 목록의 Index번째 문자열 삭제
  • Clear - 모든 문자열 삭제
  • Count: Integer - 문자열 갯수 반환
  • IndexOf(S: string): Integer - S 문자열의 인덱스 반환. 없으면 -1 반환
  • Strings[Index: Integer]: string - Index 번째 문자열 반환(Strings 생략 가능)
  • Values[const Name: string]: string - 속성, Key=Value 형식으로 저장 및 조회
  • Text: string - 전체 문자열 반환, 줄바꿈 문자(#13#10)로 구분
  • CommaText: string - 콤마(,)로 구분된 전체 문자열 반환
  • Delimiter, DelimitedText - 구분자 설정, 구분자로 구분된 전체 문자열 반환
 

TList<T>

제너릭 기반 콜렉션 객체. 어떤 자료형이라도 담을 수 있는 추상화된 목록 객체
(델파이 2009 이후 버전 부터 사용 가능)

사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
uses
System.Generics.Collections;
 
var
Num: Integer;
IntList: TList<Integer>;
StrList: TList<string>;
BtnList: TList<TButton>;
RecList: TList<TUserRec>;
begin
IntList := TList<Integer>.Create;
try
IntList.Add(10);
IntList.Add(20);
IntList.Add(30);
 
Num := IntnList[1];
 
for Num in IntList do
Memo1.Lines.Add(IntToStr(Num));
finally
IntList.Free;
end;
end;

'System.Generics.Collections' uses 절 추가

담고 싶은 자료형을 <> 사이에 선언해 목록으로 사용

객체 생성해 사용 후 반드시 해제할 것

for-in 문법 지원

주요 기능

  • Add(Value: T) - 지정한 자료형의 데이터를 목록에 추가
  • AddRange(Value: array of T) - 여러건의 데이터를 목록에 추가(배열로 전달)
  • Insert(Index: Integer; Value: T) - Index 번째 데이터 추가
  • InsertRange(Index: Integer: array of T) - Index 번째 여러건의 데이터 추가
  • IndexOf(const Value: T): Integer - 목록에서 Value 인덱스 반환(없으면 -1)
  • LastIndexof(const Value: T): Integer - 목록에서 Value 인덱스 반환, 뒤에서 부터 탐색
  • Delete(Index: Integer) - 목록에서 Index 번째 데이터 제거
  • DeleteRange(Index, Count: Integer) - 목록에서 Index 번째 부터 Count 개의 데이터 제거
  • Remove(const Value: T): Integer - 목록에서 Value 제거 후 인덱스 반환(없으면 -1)
  • Extract(const Value: T): T - 목록에서 Value 제거 후 해당 값 반환(추출)
  • Sort - 목록 정렬
  • Reverse - 목록 전체의 순서를 바꿈

기타 컬렉션

 

프로시저와 함수

독립적인 문장(프로그램 코드) 블록, 코드를 독립(분리)하고 재사용 가능

프로시저

1
2
3
4
5
6
7
8
9
10
11
12
13
procedure 프로시저이름(매개변수 목록);
{ 선언부 : 구현부에서 사용할 변수,상수,타입 지정 }
begin
{ 구현부 }
end;
 
porcedure TForm1.WriteLog(AValue: string);
var
S: string;
begin
S := FormatDateTime('HH:NN:SS', Now) + ' ' + AValue;
Memo1.Lines.Add(S);
end;

begin...end 사이의 구현부 실행, 매개변수로 받은 데이터 사용 가능

구현부에서 사용할 변수(var), 상수(const), 타입(type) 선언부에 선언

다른 문장에서 프로시저 호출. 프로시저 이름과 매개변수로 전달할 데이터(매개변수와 같은 자료형) 사용

함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function 함수이름(매개변수 목록): 반환값타입;
{ 선언부 }
begin
{ 구현부 }
Result := 반환값;
end;
 
function Add(ANum1, ANum2: Integer): Integer;
var
Sum: Integer;
begin
Sum := ANum1 + ANum2;
Result := Sum; // Add := Sum; 함수이름 변수 사용가능
// Exit(Sum); // Exit 함수 사용시 문장을 빠져나감
end;
 
var
Num: Integer;
begin
Num := Add(10, 20);
ShowMessage('10과 20을 더한 값 = ' + IntToStr(Num));
end;

구현부 문장 실행 후 Result 변수에 반환값 할당(함수이름 변수 사용 가능)

Result 대입 코드 후 다음 줄의 문장 실행 됨(빠져나가지 않음), Exit(반환값); 함수 사용 시 함수 빠져나감

매개변수(Parameter)

함수와 프로시저는 0개 이상의 매개변수 목록을 가진다. 여러개의 매개변수 사용 시 세미콜론(;)으로 구분. 같은 자료형 사용 시 쉼표로 구분 가능

1
2
3
4
procedure Test;
procedure TestStr(AStr: string);
procedure TestStrInt(AStr: string; AInt: Integer);
procedure TestInts(AInt1, AInt2: Integer);

매개변수의 전달방식

  • 값 매개변수(기본)
  • 변수(var) 매개변수
  • 상수(const) 매개변수
  • 출력(out) 매개변수

값 매개변수와 변수 매개변수

값 매개변수는 값에 의해 전달. 변수 매개변수는 참조에 의해 전달
(값 매개변수와 변수 매개변수를 가장 많이 사용)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function DoubleByVal(X: Integer): Integer;
begin
X := X * 2;
Result := X;
end;
 
function DoubleByRef(var X: Integer): Integer;
begin
X := X * 2;
Result := X;
end;
 
var
I, J, V, R: Integer;
begin
I := 4;
J := 4;
V := DoubleByVal(I); // V = 8, I = 4
R := DoubleByRef(J); // R = 8, J = 8
 
R := DoubleByRef(4); // 오류발생
end;

상수 매개변수

읽기 전용 값 매개변수. 값 매개변수와 비슷하지만, 컴파일러가 코드 최적화 가능

1
2
3
4
5
function DoubleByConst(const X: Integer): Integer;
begin
// X := X * 2; // 오류발생
Result := X * 2;
end;

출력 매개변수

변수 매개변수와 같은 참조에 의해 전달. 참조되는 변수의 초기 값은 전달 시 버려짐

1
2
3
4
5
procedure DoubleByOut(X: Integer; out Value: Integer);
begin
X := X * 2;
Value := X;
end;

타입 미지정 매개변수

var, const, out 매개변수를 선언 시 타입 지정 생략 가능

1
2
3
procedure DoSomthingVar(var Value);
procedure DoSomthingConst(const Value);
procedure DoSomthingOut(out Value);

함수 내에서 매개변수 형변환 후 사용

배열 매개변수

1
2
3
4
procedure DoSomethingDynArray(Value: array of Integer);
 
type TNumbers = array[1..4] of Integer;
procedure DoSomethingArrayType(Value: TNumbers);

가변형(Variant) 배열 매개변수

1
procedure DoSomething(Value: array of const);

array of const로 지정 시 타입이 다른 배열을 매개변수로 전달 가능

매개변수 기본값 지정

매개변수 선언 시 기본값 지정 가능, 맨 뒤의 매개변수 부터 연속적으로 기본값 지정 가능

1
2
3
4
5
6
7
8
9
10
11
procedure StrDef(AStr: string = '');
procedure StrsDef(AStr1: string = 'a'; AStr2: string = 'b');
 
procedure IntDef(ANum: Integer = 0);
procedure IntsDef(ANum1: Integer; ANum2: Integer = 0);
procedure IntsDef(ANum1, ANum2: Integer = 0); // 오류발생
 
begin
StrDef('안녕하세요.');
StrDef;
end;

같은 이름의 함수(overload)

overload 지시어 사용 사용 시 같은 이름의 함수, 프로시저 사용 가능. 단, 매개변수 자료형이 달라야 함.

1
2
3
procedure WriteValue(AString: string); overload;
procedure WriteValue(ANumber: Integer); overload;
procedure WriteValue(AArray: array of string); overload;

 

변수와 함수의 참조 범위

  • 전역 변수
  • 지역 변수
  • 멤버 변수
  • 함수 선언과 구현
  • 멤버 함수의 가시성
  • 속성(Property)

전역 변수, 지역 변수, 멤버 변수

  • 전역 변수 - 프로그램 전역에서 사용(참조)할 수 있는 변수
  • 지역 변수 - 루틴(프로시저, 함수) 구현부에서 사용할 수 있는 변수
  • 멤버 변수(필드) - 클래스에 종속된 변수
    • Public으로 선언된 변수 외부에 노출
  • 무분별한 전역변수 사용 시 복잡도 증가
    • 멤버 변수 활용 할 것 - 예) 폼에서 사용하는 변수 등
    • 외부에 노출이 필요한 경우 속성 활용 할 것
    • 개발자가 전역변수 제어가 가능한 경우 한해 사용할 것
      예) 한두곳에서 기록, 다른 곳에서는 읽기만 하는 경우 등

함수 선언과 구현, 멤버 함수

  • 선언부(Interface)에 선언한 함수는 외부 참조 가능
  • 구현부(implimentation)에 구현만한 함수는 해당 유닛에서만 참조 가능
  • 멤버 함수는 private, public 영역에 선언 후 구현해야 함
    • private은 내부 함수, public은 공용 함수 즉 외부 노출 됨
  • 속성(property)으로 pirvate 영역의 변수와 함수 접근 가능

클래스와 객체 사용

클래스

클래스(class)는 객체 지향 프로그래밍(OOP)에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀이다. 객체를 정의 하기 위한 상태(멤버변수)와 메서드(함수)로 구성된다. - 위키백과

클래스와 객체 관계

  • 객체 - 현실의 대상, 인식할 수 있는 사물
  • 클래스 - 객체를 정의하는 설계도/틀, 객체를 추상화해 디자인(설계)
  • 인스턴스 - S/W 상의 실체, 메모리에 할당된 객체, 클래스로 생성, 객체라는 용어로 혼용

객체 생성(그리고 해제)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
인스턴스변수: 클래스타입;
begin
인스턴스변수 := 클래스타입.Create(매개변수);
...
인스턴스변수.Free;
end;
 
var
StrList: TStringList;
begin
StrList := TStringList.Create;
 
StrList.Add('항목1');
StrList.Clear;
 
StrList.Free;
end;

클래스타입의 인스턴스변수 선언, 해당 변수에 클래스타입으로 인스턴스를 생성(Create) 한다.
생성된 인스턴스는 메모리에 상주 함, 인스턴스 변수를 통해 객체의 속성과 메소드를 이용
객체 사용 완료 후 반드시 메모리를 반납하기 위한 해제(Free) 해야 함.

클래스(객체) 종류

  • 다양한 기능 관련 클래스
  • 사용자 제작 클래스
  • 컴포넌트

수업자료

 

기초다지기-클래스

클래스

docs.google.com

 

폼 다루기

애플리케이션의 가장 기본적인 윈도우. 한개의 폼은 한개의 화면. 다른 컴포넌트를 올릴 수 있는 컨테이너 역할.

프로젝트에 폼 추가

  • 메인메뉴 : File > New > Vcl Form
  • 툴바 : New items 아이콘 > Vcl Form
  • Project Manager :  프로젝트 우측 마우스 버튼 > Add New > Vcl Form

폼 관리

  • Project > Options > Forms
  • Auto-create forms - 자동 생성 폼
  • Avaliable forms - 생성 가능한 폼(수동 생성 폼)

폼 동적 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var
폼변수: 폼클래스타입;
Form1: TForm1;
begin
폼인스턴스변수 := 폼클래스타입.Create(소유자);
 
// case #1 - 소유자 지정
Form1 := TForm1.Create(Application);
Form2 := TForm2.Create(Form1);
Form3 := TForm3.Create(Self);
Form4 := TForm4.Create(nil);
 
// case #2 - Application 객체이용, Application.MainForm 지정
Application.CreateForm(TForm1, Form1);
end;
  • Owner(소유자) - 소유자 해제 시 피 소유자 해제
  • 소유자 미지정(nil) 시 직접 폼 인스턴스를 해제(Free)해야 함
  • 프로젝트 소스코드에서 Application.CreateForm 방식 사용

폼 표시 및 해제

  • ShowModal - 모달 폼 표시(새 폼에 제어권 전달, 새 폼만 활성화)
  • Show - 모달리스 폼 표시(새 폼과 메인 폼 모두 활성)

모달리스 폼 표시/해제

메인 폼과 새 폼 모두 활성. 폼을 닫을때 메모리 해제 주의할 것.

1
2
3
4
5
6
7
8
9
10
begin
Form2 := TForm2.Create(Self);
Form2.Show;
end;
 
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree; // caNone, caHide, caFree, caMinimize
Form2 := nil;
end;

모달 폼 표시/해제

1
2
3
4
Form1 := TForm1.Create(nil);
Form1.ShowModal;
 
Form1.Free;

 

출처) 생활코딩 https://www.opentutorials.org/course/3108

 

기초 다지기 - 델파이 프로그래밍

기초 다지기 수업에서 배우는 내용들 프로젝트의 구조 변수와 상수, 자료형 프로그래밍 문법 함수와 파라메터 클래스 사용하기 컴포넌트 사용법

www.opentutorials.org

 

'Delphi' 카테고리의 다른 글

[Delphi] RAD Studio 세팅 및 단축키  (0) 2022.11.04