안녕하세요.
아두이노의 문자열을 처리하는데 도움을 주는 String 클래스를 정리하겠습니다.
저 또한 개발 시 참고하려고 합니다.
보통 문자열을 다룰 때, 문자열을 검색하거나 비교하는 등의 처리 시 번거로움이 있습니다.
아두이노는 C++ 프로그래밍 언어와 호환되며, 문자열을 편리하게 처리하기 위한 도구로 String 클래스를 제공합니다.
String 클래스는 다른 포스팅에서 설명한 Serial 라이브러리와 함께 사용될 때 더욱 유용해집니다.
함께 사용하는 내용은 별도의 포스팅으로 다루겠습니다.
편리함에 대한 대가로 String 클래스로 객체를 생성하게 되면 아두이노의 프로그램 저장공간을 많이 차지하게 되며 코드 크기에 유의하시어 사용하시면 됩니다.
[포인터를 통한 문자열과 String 클래스를 통한 문자열 처리에 대한 프로그램 저장공간 비교 ]
먼저 살펴볼 내용은 String() 생성자입니다. 대상을 String 객체로 변환합니다.
형식.
String(val)
String(val, base)
String(val, decimalPlaces)
파라메타.
val: String 객체로 바꾸려는 대상(정수, 변수, 문자, 문자열)
base: String 객체로 바꾸려는 대상의 진법(BIN, OCT, DEC, HEX)
decimalPlaces: String 객체로 바꾸려는 대상의 소수점 자리 수
샘플코드1. String 객체 변환
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "Hello String";
Serial.println(str1);
str1 = String('a');
Serial.println(str1);
str1 = String("Hello String");
Serial.println(str1);
String str2 = String(str1 + "with more");
Serial.println(str2);
str1 = String(45, BIN);
Serial.println(str1);
str1 = String(45, DEC);
Serial.println(str1);
str1 = String(45, HEX);
Serial.println(str1);
str1 = String(5.123, 2);
Serial.println(str1);
str1 = String(analogRead(0), DEC);
Serial.println(str1);
Serial.end();
}
위 예제의 출력 결과는 다음과 같습니다.
지금부터는 String 클래스에서 지원하는 함수(메소드)들을 알아보겠습니다.
C++ 언어를 접해보지 못했다면 다음에 설명할 함수들의 사용이 생소할 수 있을 것 같습니다.
참고로 본 포스팅에서 사용하는 용어 중 원본 string과 대상 string은
원본 string.함수명(대상 string)
로 정의하고 설명하겠습니다.
그리고 내용 중 "인덱스"의 의미는 해당 String 문자열의 위치 번호로 다음과 같습니다.
문자열 H e l l o
인덱스 0 1 2 3 4
첫 번째 살펴볼 String 함수는 charAt() 함수입니다. charAt() 함수는 문자열에서 문자의 위치(인덱스 값)에 해당하는 문자를 반환합니다. 문자열 내 첫번 째 문자의 인덱스는 0입니다.
함수.
charAt(n)
매개변수.
n : 반환하려는 문자 위치
반환.
인덱스 값에 해당되는 문자 반환
샘플코드1. 원본 String 문자열 내 인덱스 에 대응하는 문자 반환
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "Hello String!";
Serial.println(str1.charAt(0));
Serial.end();
}
"Hello String!" 문자열 중, 인덱스 0인 첫번 째 문자 'H'가 시리얼모니터로 출력됩니다.
두 번째 살펴 볼 String 함수는 compareTo() 입니다. compareTo() 함수는 원본 String 문자열과 대상 String 문자열을 비교하여 두 문자열이 동일하면 0, 대상이 크면 음수, 작으면 양수를 반환합니다.
ASCII 코드 값이 기준으로 두 String 객체의 값을 비교합니다.
함수.
compareTo(string)
매개변수.
string. 비교 대상 String 객체
반환.
ASCII 코드 값 순서 상 원본 String이 대상 String 보다 앞서면 음수, 동일하면 0, 뒤서면 양수 반환
샘플코드1. 원본 String 문자열과 대상 String 문자열 비교
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "123";
String str2 = "124";
Serial.println("Comparing " + str1 + " to " + str2 + " : " + str1.compareTo(str2));
Serial.println("Comparing " + str2 + " to " + str1 + " : " + str2.compareTo(str1));
Serial.println("Comparing " + str2 + " to " + str2 + " : " + str2.compareTo(str2));
Serial.end();
}
위 예제에서는 String 객체 str1과 str2를 비교하여 그 결과를 시리얼모니터에 출력합니다.
12번 라인의 str1과 str2를 비교하면 str1이 str2보다 앞서기 때문에 음수를 출력합니다.
13번 라인의 str2와 str1을 비교하면 str2가 str1보다 뒤에 있기 때문에 양수를 출력합니다.
14번 라인의 str2와 str2를 비교하면 동일하기 때문에 0을 출력합니다.
*앞선다는 것은 위 str1와 str2의 문자열 비교 시 str1의 마지막 문자 '3'이 앞서 있다는 의미입니다.
세 번째 살펴 볼 String 함수는 concat() 입니다. concat()함수는 원본 string 문자열에 대상 String 문자열를 이어 붙입니다. 대상 String 대신 숫자를 붙일 수도 있습니다.
함수.
concat(string)
매개변수.
string: 연결하려는 string, char, byte, int, long, float, double 수
반환.
성공 시 true, 실패 시 false 반환
샘플코드1. 원본 String 문자열에 대상 String 문자열 추가
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "Happy ";
String str2 = "New year ";
str1.concat(str2);
Serial.println(str1);
str1.concat(2018);
Serial.println(str1);
Serial.end();
}
위 예제에서는 13번의 출력 결과로 시리얼모니터에 "Happy New year"가 출력되며,
16번의 출력 결과로 "Happy New year 2018"이 출력됩니다.
네 번째 살펴 볼 String 함수는 c_str() 입니다. c_str()함수는 원본 string에 대상 String의 문자열을 C 언어 스타일의 포인터로 제공합니다. 이 포인터로 원본 string에 접근할 수 있으나, 문자열을 수정해서는 안됩니다. 원본 string 객체를 수정할 경우 이 포인터는 무효가 됩니다.
(배열에 저장해야 할 경우 toCharArray() 함수를 사용하는 것이 좋습니다. 꼭 필요한 경우에는 참조만 해서 사용하시면 됩니다.)
함수.
c_str(void)
매개변수.
없음
반환.
NULL 문자를 포함한 C 스타일의 문자열 반환
샘플코드1. 원본 String 문자열의 마지막 문자(열)을 대상 String 문자열과 비교
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "c_str() example";
char* pBuf = (char*)str1.c_str();
Serial.println(pBuf);
Serial.end();
}
위 예제에서는 13번의 출력 결과로 시리얼모니터에 "c_str() example"이 출력됩니다.
다섯 번째 살펴 볼 String 함수는 endsWith() 입니다. endsWith()함수는 원본 string에 대상 String의 문자열로 끝났는지 검사합니다.
함수.
endsWith(string)
매개변수.
string: 조사할 대상 문자열
반환.
원본 String이 대상 String 문자열로 끝나면 true, 발견되지 않으면 false 반환
샘플코드1. 원본 String 문자열의 마지막 문자(열)을 대상 String 문자열과 비교
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "AT+TEST=3\r\n";
String str2 = "\r\n";
Serial.println(str1.endsWith(str2));
str2 = "\r";
Serial.println(str1.endsWith(str2));
Serial.end();
}
위 예제에서는 시리얼모니터에 12번의 출력 결과로 true 즉 1이 출력됩니다.
14번의 출력 결과로 false 즉 0이 출력됩니다.
여섯 번째 살펴 볼 String 함수는 equals() 입니다. equals()함수는 원본 string에 대상 String의 문자열이 대소문자까지 동일한지를 검사합니다. equalsIgnoreCase() 함수는 대소문자를 무시하고 검사합니다.
함수.
equals(string)
equalsIgnoreCase(string)
매개변수.
string: 비교할 대상 문자열
반환.
원본 String이 대상 String 문자열과 동일하면 true, 일치하지 않으면 false 반환
샘플코드1. 원본 String 문자열과 대상 String 문자열과 비교 (대소문자 일치)
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "String Equal";
String str2 = "String Equal";
Serial.println(str1.equals(str2));
Serial.end();
}
위 예제에서는 시리얼모니터에 12번의 출력 결과로 true 즉 1이 출력됩니다.
샘플코드2. 원본 String 문자열과 대상 String 문자열과 비교 (대소문자 무시)
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "String Equal";
String str2 = "STRING equal";
Serial.println(str1.equalsIgnoreCase(str2));
Serial.end();
}
위 예제에서는 시리얼모니터에 12번의 출력 결과로 true 즉 1이 출력됩니다.
일곱 번째 살펴 볼 String 함수는 getBytes() 입니다. getBytes()함수는 원본 String의 char형 문자열을 대상 배열에 byte형으로 (len - 1)개 만큼 복사합니다.
함수.
getBytes(buf, len)
매개변수.
buf: 배열 이름(주소)
len: 배열 크기 (*실 저장 데이터는 len - 1 개가 저장됩니다.)
샘플코드1. 원본 String 문자열에서 지정한 배열로 (배열 크기 - 1) 개를 복사
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
byte buf[8];
String str1 = "1234567890";
str1.toCharArray(buf, sizeof(buf));
for (int i = 0; i < 8 - 1; i++) Serial.print(buf[i]);
Serial.end();
}
위 예제에서는 시리얼 모니터에 13번의 출력 결과로 "49505152535455" 7개의 문자가 출력됩니다.
여덟 번째 살펴 볼 String 함수는 indexOf() 입니다. indexOf()함수는 원본 string의 문자열에서 검색할 문자 또는 문자열의 존재 유/무를 검사하며, 해당 문자(열)이 있으면 첫번째 발견된 위치를 반환합니다.
함수.
indexOf(val)
indexOf(val, from)
매개변수.
val: 검색하려는 문자열
from: 원본 string 문자열의 검사 시작 (인덱스) 위치 값
반환.
원본 String 문자열에 검색 문자열이 존재할 경우 인덱스를 반환하며, 존재하지 않을 경우 음수 반환
샘플코드1. 원본 String 문자열 내 대상 문자열 검색 및 인덱스 값 반환
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "AT+REQVER";
Serial.println(str1.indexOf("+"));
Serial.println(str1.indexOf("+", 3));
Serial.end();
}
위 예제에서는 시리얼 모니터에 11번의 출력 결과로 "2"가 출력됩니다.
12번의 출력 결과로 "-1"이 출력됩니다.
아홉 번째 살펴 볼 String 함수는 lastIndexOf() 입니다. lastIndexOf()함수는 원본 string의 문자열에서 검색할 문자 또는 문자열의 존재 유/무를 문자열 끝에서 부터 검사하며, 해당 문자(열)이 있으면 역순으로 첫번째 발견된 위치를 반환합니다.
함수.
lastIndexOf(val)
lastIndexOf(val, from)
매개변수.
val: 검색하려는 문자열
from: 원본 string 문자열의 검사 시작 (인덱스) 위치 값
반환.
원본 String 문자열에 검색 문자열이 존재할 경우 인덱스를 반환하며, 존재하지 않을 경우 음수 반환
샘플코드1. 원본 String 문자열 내 대상 문자열 역순 검색 및 인덱스 값 반환
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "AT+REQ+RSSI";
Serial.println(str1.lastIndexOf("+"));
Serial.println(str1.lastIndexOf("+", 5));
Serial.end();
}
위 예제에서는 시리얼 모니터에 11번의 출력 결과로 "6"가 출력됩니다.
12번의 출력 결과로 "2"가 출력됩니다.
열 번째 살펴 볼 String 함수는 length() 입니다. langth() 함수는 원본 String 문자열의 길이를 반환합니다. 반환하는 길이에는 NULL 문자는 제외됩니다.
함수.
length(void)
매개변수.
없음
반환.
문자열의 길이를 반환 (NULL 문자 미포함된 길이)
샘플코드1. 원본 String 문자열의 길이 출력 (NULL 문자 제외)
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "AT+REQ+RSSI";
Serial.println(str1.length());
Serial.end();
}
위 예제에서는 시리얼 모니터에 11번의 출력 결과로 "11" 이 출력됩니다.
열한 번째 살펴 볼 String 함수는 replace() 입니다. replace()함수는 원본 string의 문자열에서 찾을 문자열을 검색하여 바꿀 문자열로 교체합니다.
함수.
replace(substring1, substring2)
매개변수.
substring1: 찾을 문자열
substring2: 바꿀 문자열
반환.
없음
샘플코드1. 원본 String 문자열에서 찾은 문자열을 바꿀 문자열로 교체하기
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "AT+REQ+RSSI";
str1.replace("REQ", "ACKFROM");
Serial.println(str1);
Serial.end();
}
위 예제에서는 시리얼 모니터에 11번의 출력 결과로 "AT+ACKFROM+RSSI" 가 출력됩니다.
열두 번째 살펴 볼 String 함수는 setCharAt() 입니다. setCharAt()함수는 원본 string의 문자열에서 주어진 인덱스 위치에 있는 문자를 교체합니다.
함수.
setCharAT(index, c)
매개변수.
index: 바꿀 문자 인덱스 위치
c: 바꿀 문자
반환.
없음
샘플코드1. 원본 String 문자열에서 지정한 인덱스 위치의 문자를 바꿀 문자로 교체
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "AT+REQ+RSSI";
str1.setCharAt(0, 'P');
Serial.println(str1);
Serial.end();
}
위 예제에서는 시리얼 모니터에 11번의 출력 결과로 "PT+REQ+RSSI" 가 출력됩니다.
열세 번째 살펴 볼 String 함수는 startsWith() 입니다. startsWith()함수는 원본 string의 문자열이 대상 String의 문자열로 시작하는 지를 검사합니다.
함수.
startsWith(string)
매개변수.
string: 비교 대상 문자열
반환.
원본 String 문자열이 비교 대상 문자열로 일치하여 시작하는 경우 true, 일치하지 않는 경우 false
샘플코드1. 원본 String 문자열의 시작 문자열 비교 확인
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "AT+REQ+RSSI";
Serial.println(str1.startsWith("AT+"));
Serial.end();
}
위 예제에서는 시리얼모니터에 11번의 출력 결과로 true 즉 1이 출력됩니다.
열네 번째 살펴 볼 String 함수는 substring() 입니다. substring()함수는 원본 String의 문자열 중 원하는 문자열만 분리해서 가져올 때 사용하는 함수입니다. substring(from) 함수는 원본 String의 문자열 중 시작위치 부터 끝까지 가져오며, substring(from, to) 함수는 from 위치부터 to 직전 문자까지 가져옵니다.
함수.
substring(from)
substring(from, to)
매개변수.
from: 가져올 문자열의 시작 인덱스 값
to: 가져올 문자열의 끝 인덱스 값
반환.
원본 String 문자열 중 지정된 문자열을 반환
샘플코드1. 원본 String 문자열 중 원하는 문자열 분리하기
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "AT+REQ+RSSI";
String str2 = str1.substring(3);
Serial.println(str2);
str2 = str1.substring(0, 3);
Serial.println(str2);
Serial.end();
}
위 예제에서는 시리얼모니터에 10번의 출력 결과로 "REQ+RSSI" 가 출력됩니다.
15번의 출력 결과로 "AT+"가 출력됩니다.
열다섯 번째 살펴 볼 String 함수는 toCharArray() 입니다. toCharArray()함수는 원본 String의 char형 문자열을 대상 배열에 char형으로 (len - 1)개 만큼 복사합니다.
함수.
toCharArray(buf, len)
매개변수.
buf: 배열 이름(주소)
len: 배열 크기 (*실 저장 데이터는 len - 1 개가 저장됩니다.)
반환.
없음
샘플코드1. 원본 String 문자열에서 지정한 배열로 (배열 크기 - 1) 개를 복사
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
char buf[8];
String str1 = "ABCDEFGHIJKLMN";
str1.toCharArray(buf, sizeof(buf));
Serial.println(buf);
Serial.end();
}
위 예제에서는 시리얼 모니터에 13번의 출력 결과로 "ABCDEFG" 7개의 문자가 출력됩니다.
열여섯 번째 살펴 볼 String 함수는 toInt() / toFloat() 입니다. toInt() 함수는 원본 String의 문자열을 정수로 변환하며, toFloat() 함수는 소수로 형 변환합니다.
함수.
toInt(void)
toFloat(void)
매개변수.
없음
반환.
toInt() 해당 문자열의 변환된 정수 반환
toFloat() 해당 문자열의 변환된 소수 반환
샘플코드1. 원본 String 문자열을 정수와 소수로 바꾸기
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "815";
String str2 = "8.15";
int nData = str1.toInt();
float fData = str2.toFloat();
Serial.println(nData);
Serial.println(fData);
Serial.end();
}
위 예제에서는 시리얼 모니터에 15번의 출력 결과로 "815"가 출력됩니다.
16번의 출력 결과로 "8.15"가 출력됩니다.
열일곱 번째 살펴 볼 String 함수는 toLowerCase() / toUpperCase() 입니다. toLowerCase() 함수는 원본 String의 문자열을 소문자로 변환하며, toUpperCase() 함수는 대문자로 변환합니다.
함수.
toLowerCase(void)
toUpperCase(void)
매개변수.
없음
반환.
없음
샘플코드1. 원본 String 문자열을 모두 대문자 또는 소문자로 바꾸기
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "Welcome to APPSKIT!";
str1.toLowerCase();
Serial.println(str1);
str1.toUpperCase();
Serial.println(str1);
Serial.end();
}
위 예제에서는 시리얼 모니터에 12번의 출력 결과로 "welcome to appskit"이 출력됩니다.
15번의 출력 결과로 "WELCOME TO APPSKIT"이 출력됩니다.
열여덟 번째 살펴 볼 String 함수는 trim() 입니다. trim() 함수는 원본 String의 문자열에 맨 앞과 맨 뒤의 공백 문자를 제거합니다. 문자열 중간의 공백 문자는 그대로 남겨 둡니다.
함수.
trim(void)
매개변수.
없음
반환.
없음
샘플코드1. 원본 String 문자열의 맨 앞과 맨 뒤의 공백 문자 제거하기
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = " 12 345 678 ";
Serial.print("Length before trim: ");
Serial.println(str1.length());
str1.trim();
Serial.print("Length after trim: ");
Serial.println(str1.length());
Serial.println(str1);
Serial.end();
}
위 예제에서는 시리얼 모니터에 11~12번의 출력 결과로 "Length before trim: 20"이 출력됩니다.
15~16번의 출력 결과로 "Length after trim: 10"이 출력됩니다.
18번의 출력 결과로 str1에 남아있는 10개의 문자열인 "12 345 678"이 출력됩니다.
이제 마지막으로 String 클래스에서 지원하는 연산자를 살펴 보겠습니다.
연산자.
[ ] 요소 접근
+ 연결
+= 추가
== 비교
> 보다 큼
>= 보다 크거나 같음
< 보다 작음
<= 보다 작거나 같음
!= 같지 않음
샘플코드1. 원본 String 문자열의 맨 앞과 맨 뒤의 공백 문자 제거하기
void setup()
{
Serial.begin(9600);
while(!Serial);
}
void loop()
{
String str1 = "AB";
String str2 = "CD";
String str3 = "ABCD";
Serial.println(str1[0]);
Serial.println(str1+str2);
str1 += str2;
Serial.println(str1);
Serial.println(str1 == str3); //return ture
Serial.println(str1 > str2); //return false
Serial.println(str1 >= str2); //return false
Serial.println(str1 < str2); //return true
Serial.println(str1 <= str2); //return true
Serial.println(str1 != str3); //return false
Serial.end();
}
위 예제의 출력 결과는 다음과 같습니다.
이상으로 아두이노의 String 클래스와 지원되는 함수(메소드)에 대해 살펴 보았습니다.
만일 잘못되거나 부족한 정보는 추후 업데이트 하겠습니다.
감사합니다.
'앱스킷(APPSKIT) 강좌' 카테고리의 다른 글
[앱스킷](BLUE-ON V1) 저전력 블루투스 모듈 사용방법 알아보기 - 1편 (0) | 2018.11.29 |
---|---|
[코딩노트_I/Os] 디지털 입출력 (0) | 2018.11.29 |
[코딩노트_스케치] 스케치 동작원리 (0) | 2018.11.29 |
[앱스킷](TEMP-ON V1) I2C 온습도 센서 모듈 사용방법 알아보기 (0) | 2018.11.28 |
[앱스킷](LED-ON V1) I2C LED 모듈 사용방법 알아보기 (0) | 2018.11.28 |
댓글