소개
이 게시물의 목적은 매우 간단한 클래스를 만들고 Arduino 코어에서 해당 개체를 인스턴스화하는 방법을 설명하는 것입니다.
객체 지향 프로그래밍(OOP)은 한 게시물에서 다루기에는 너무 광범위한 주제이기 때문에 이것은 클래스를 만드는 방법에 대한 간단한 자습서일 뿐입니다.
그럼에도 불구하고 OOP를 배우면 훨씬 깨끗하고 정교한 코드를 작성할 수 있는 일련의 도구가 제공되며 그 사용은 마이크로컨트롤러의 범위를 훨씬 뛰어 넘습니다.
또한, 우리는 많은 Arduino 라이브러리의 소스 코드를 보다 쉽게 분석할 수 있어 내부에서 무슨 일이 일어나고 있는지 이해하고 필요에 따라 변경을 수행할 수 있습니다.
언급해야 할 다른 중요한 사항은 Arduino가 이 언어 위에 구축되었기 때문에 여기에서 다루는 개념이 C++ 언어라는 것입니다[1]. 게다가 이러한 테스트는 ESP 제품군 장치에서 수행되었지만 코드는 모든 일반 Arduino 보드에서 제대로 작동해야 합니다.
이 코드는 ESP32와 ESP8266 모두에서 테스트되었습니다. 테스트는 ESP32 FireBeetle 보드에 통합된 DFRobot의 ESP-WROOM-32 장치를 사용하여 수행되었습니다 .
코드
클래스를 별도의 파일에 보관하고 필요할 때 가져오는 것이 좋습니다(Arduino 라이브러리와 거의 유사). 단순화를 위해 기본 코드 파일에서 클래스를 선언합니다.
클래스를 선언하기 위해 class 키워드를 사용 하고 이름을 부르고자 합니다. 그런 다음 클래스 정의를 대괄호 안에 묶습니다. 관례에 따라 클래스의 이름은 첫 글자를 대문자로 지정합니다.
1 2 삼 |
class TestClass{ // Class definition }; |
우리 클래스에는 정수가 될 두 개의 데이터 멤버 가 있습니다. 설명을 위해 임의의 값으로 초기화합니다.
그러나 이러한 클래스 데이터 멤버를 선언하기 전에 가시성 개념을 살펴볼 필요가 있습니다 . 가시성을 통해 클래스 멤버에 액세스할 수 있는 엔터티를 제어할 수 있습니다.
가시성 개념은 의도한 대로 계속 작동하기 위해 외부에서 액세스하거나 수정해서는 안 되는 클래스 멤버가 있을 수 있기 때문에 매우 중요합니다. 따라서 이러한 구성원을 외부에서 액세스하지 못하도록 보호하고 의미 있는 구성원만 노출할 수 있습니다.
예를 들어, 우리 클래스가 제대로 작동하기 위해 많은 내부 구성이 필요한 매우 복잡한 알고리즘을 구현하는 경우 해당 데이터 멤버의 수정을 허용하지 않고 비공개 로 유지할 수 있는 것이 현명합니다 . 반면에 입력 값을 전달하고 출력 값을 가져오는 데 필요한 멤버는 액세스할 수 있어야 하므로 public 으로 유지해야 합니다 .
우리의 경우, 지금은 간단하게 유지하기 위해 읽기와 쓰기 모두에 대해 클래스 구성원에 대한 액세스를 허용합니다. 따라서 앞에서 언급한 2개의 정수를 선언하기 전에 public 키워드 뒤에 콜론 을 사용합니다 .
가시성을 지정하는 데 사용되는 키워드를 액세스 수정자[2]라고 합니다.
1 2 삼 4 5 |
class TestClass{ public: int x = 1; int y = 2; }; |
이제 클래스를 선언하고 정의했으므로 나머지 코드로 이동합니다. Arduino 설정 기능에서 클래스를 테스트합니다. 그러나 먼저 직렬 연결을 열어 나중에 테스트 결과를 얻습니다.
1 | Serial.begin(115200); |
다음으로 우리는 해당 클래스의 객체를 생성하는 것에 해당하는 클래스를 인스턴스화할 것입니다. 생성자 를 선언하지 않았으므로 단순히 클래스 이름 뒤에 객체 이름을 사용할 수 있으며 기본 생성자 (인수를 사용하지 않고 본문이 비어 있음)는 암시적으로 [3] 호출됩니다.
1 | TestClass myObject; |
데이터 멤버에 기본값을 할당했으므로 객체를 사용하여 해당 값을 확인할 수 있습니다. 따라서 데이터 멤버에 액세스하려면 객체에 점 연산자를 사용하고 그 뒤에 데이터 멤버 이름을 사용하면 됩니다.
1 2 |
Serial.println(myObject.x); Serial.println(myObject.y); |
또한 점 연산자를 사용하여 클래스 데이터 멤버에 액세스한 다음 일반 변수와 마찬가지로 등호 연산자로 할당을 수행하여 클래스 데이터 멤버에 다른 값을 할당할 수도 있습니다.
1 2 삼 |
myObject.x=40; Serial.println(myObject.x); |
이것이 잘 작동하더라도 private으로 노출되어야 하는 데이터 멤버를 정의한 다음 setters 및 getters 로 액세스/수정해야 하는 데이터 멤버를 정의하는 유효한 접근 방식이기도 합니다 .
다른 중요한 사항은 객체의 데이터 멤버가 동일한 클래스에서 생성할 수 있는 다른 객체와 공유되지 않는다는 것입니다. 따라서 동일한 클래스의 다른 객체를 생성하면 해당 객체에 대해 x와 y의 값이 각각 1과 2가 됩니다.
이 튜토리얼의 전체 소스 코드는 아래에서 볼 수 있습니다.
1 2 삼 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
class TestClass{ public: int x = 1; int y = 2; }; void setup() { Serial.begin(115200); TestClass myObject; Serial.print("Data member x value after creating object:"); Serial.println(myObject.x); Serial.print("Data member y value after creating object:"); Serial.println(myObject.y); myObject.x=40; Serial.print("Data member x value after assignment:"); Serial.println(myObject.x); } void loop() {} |
코드 테스트
코드를 테스트하려면 Arduino IDE를 사용하여 장치에 업로드한 다음 직렬 모니터를 여십시오. 그림 1과 유사한 출력을 얻어야 합니다.
그림 1 – 프로그램의 출력. ESP32의 테스트에서 가져왔습니다.
예상대로 데이터 멤버를 초기화할 때 할당한 값을 먼저 얻은 다음 ox 값을 변경한 후 인쇄할 때 새 값을 얻습니다.
참고문헌
[1] https://www.arduino.cc/en/Main/FAQ#toc13
[2] http://www.geeksforgeeks.org/access-modifiers-in-c/
[3] https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/com.ibm.zos.v2r2.cbclx01/cplr376.htm
'ESP32' 카테고리의 다른 글
ESP32 Arduino: Software reset (0) | 2021.08.16 |
---|---|
ESP32 Arduino: HTTPS GET Request (0) | 2021.08.16 |
ESP32 Arduino: External interrupts (0) | 2021.08.16 |
ESP32 Arduino: Timer interrupts (0) | 2021.08.16 |
ESP32 MicroPython: Timer interrupts (0) | 2021.08.16 |