프날 오토핫키 강좌  v2

⚠ 이 강좌는 오토핫키 v2를 다룹니다

지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만, 새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.

62. 아주 간단한 클래스 만들기


객체를 직접 사용해보기 위해 클래스를 만들어보겠습니다.

이 강은 클래스를 만들어 객체를 사용하는 간단한 실습에 의미가 있지, 실제로 아주 구조적인 클래스를 작성하지는 않습니다. 이곳에서 강좌하지 않는 부분은 상속, 접근 제한자(가시성 설정), 생성자 등입니다.

대신, 여기선 오토핫키 언어에서 클래스를 만드는 기초적인 방법과 이를 이용하여 객체(인스턴스)를 생성해보는 실습을 해보겠습니다.

클래스 만들기

클래스는 class 키워드를 통해 만듭니다. 아래와 같이 만들 클래스의 이름을 class 키워드의 오른쪽에 적은 후, 함수를 만들 때처럼 블록으로 클래스의 범위를 지정합니다.

1class TestClass
2{
3
4}
TestClass 클래스를 생성한 모습

이 안에, 필드로 사용할 변수와 메서드로 사용할 함수를 적습니다.

1class TestClass
2{
3    bar := 1
4    baz := 2
5
6    Add(x, y)
7    {
8        return x + y
9    }
10}
필드 bar, baz와 메서드 Add()을 정의한 모습

간단한 형태의 클래스가 완성되었습니다!

클래스 사용하기

클래스를 사용해보겠습니다. 위에서 완성한 클래스를 소스코드의 한 구석에 넣던가, 57강을 참고하여 분할한 후 현재 스크립트 파일에서 불러올 수 있게 합니다.

1. 인스턴스 만들기

앞선 강에서 말씀드렸듯 인스턴스는 클래스가 실체화된 객체입니다. 즉, 우리가 만든 클래스를 이용하여 새 객체를 만들 수 있는데, 이렇게 만들어진 새 객체를 인스턴스라고 하는 것입니다.

클래스로부터 인스턴스를 만들어야, 해당 인스턴스를 이용하여 필드와 메서드에 접근할 수 있습니다. 인스턴스를 만드는 방법은 저번 강 마지막에 짧게 언급한 적 있습니다.

인스턴스명 := 클래스명()

한마디로, 위의 TestClass 클래스를 이용하여 인스턴스를 만들어 보면 아래와 같습니다.

1test := TestClass()
2MsgBox(IsObject(test))
3
4class TestClass
5{
6    bar := 1
7    baz := 2
8
9    Add(x, y)
10    {
11        return x + y
12    }
13}
TestClass 클래스를 이용하여 test 인스턴스를 만든 모습

만든 클래스는 소스 코드 어디에 있어도 상관 없습니다. 저는 인스턴스를 생성하는 부분(=1번 줄) 아래에 클래스를 배치했습니다.

위 코드는 test라는 인스턴스를 생성한 후, IsObject() 함수의 인수로 만들어진 인스턴스를 적어서 반환값을 출력하는 코드입니다. 제대로 따라오셨다면 1이 출력됩니다. IsObject() 함수는 내장 함수인데, 주어진 인수가 객체이면 1을, 그렇지 않다면 0을 출력합니다.

2. 멤버 접근해보기

이제 멤버 접근 연산자를 사용하여 만든 인스턴스의 멤버에 접근해보겠습니다. 편의를 위해 클래스의 정의 부분(이전 코드의 3번 줄 밑)는 생략합니다.

1test := TestClass()
2MsgBox(test.bar)
3MsgBox(test.Add(2, 3))
필드 bar와 메서드 Add()에 접근

우선, 2번 줄에서 인스턴스의 두 개의 필드 중 하나인 bar에 접근했습니다. 클래스를 만들 때 bar의 값을 1로 지정했으므로, 1이 출력됩니다.

그 다음 3번 줄에선 인스턴스의 유일한 메서드인 Add()를 호출했습니다. 매개변수로 2와 3을 전달했네요. 클래스에서 Add() 함수는 두 매개변수의 합을 반환하도록 했으므로, 알림 상자엔 5가 출력될 것입니다.

물론 아래와 같이 변수에 담았다가 출력해도 무방합니다. 굳이 알려드리지 않아도 이젠 자연스럽게 알고 있던 사실이죠?

1test := TestClass()
2testBar := test.bar
3testAdd := test.Add(2, 3)
4MsgBox(testBar)
5MsgBox(testAdd)
bar 필드의 값과 Add() 메서드의 반환값을 미리 변수에 담아두었다가 출력

Tip: 각 인스턴스는 독립적입니다.

만약 아래와 같이 세 개의 인스턴스를 만들면, 각각의 필드와 메서드는 하나의 클래스로부터 파생되었으므로 모두 공유될까요?

1test1 := TestClass()
2test2 := TestClass()
3test3 := TestClass()

아닙니다. 각 인스턴스는 완전히 별개의 객체이기 때문에, test1.baz := 100과 같이 필드의 값을 바꿔도 test2, test3 인스턴스의 필드에까지 영향을 미치지 않습니다.

마치 하나의 붕어빵 틀에서 나온 여러 개의 붕어빵이 모두 독립적이라, 한 붕어빵을 변형시켜도 다른 붕어빵은 온전한 것처럼 말입니다.

this 객체

클래스를 만들 때 자기 자신의 멤버에 접근하려면 어떻게 해야할까요? 즉, 앞서 만든 TestClass 클래스의 Add() 메서드에서 baz 필드의 값을 가져오거나 수정하는 방법은 무엇일까요?

클래스 안쪽에선 '자기 자신'을 나타내는 this 객체가 있습니다. this 객체에는 자기 자신의 멤버가 담겨있으므로, 아래와 같이 사용하여 자기 자신의 멤버를 이용할 수 있습니다.

1class TestClass
2{
3    bar := 1
4    baz := 2
5
6    AddBaz(x)
7    {
8        return x + this.baz
9    }
10}
들어온 입력 값에 자기 자신의 baz 필드의 값을 더하여 반환하는 AddBaz() 함수의 정의

필드의 경우 뿐만 아니라, 만약 클래스 내의 다른 함수를 이용하려면 this.메서드명()으로 이용할 수 있겠죠.

클래스를 작성하는 아주 기초적인 방법만 말씀드리려 했으나, 적어도 this 객체는 알아야 기본적인 클래스를 작성할 수 있으므로 짤막하게 소개해봅니다.

질문하러 가기