[아두이노] [아두이노 강좌] 20. String (3) - 유용한 함수들
*주의 : 이번 강좌는 정말, 생각 외로, 함수가 많아서 엄청 길어졌.. 각오하고 봐야 하는 페이지 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ |
String 객체 설명으로 강좌 3개까지 할 줄은 정말 몰랐어요. ㅋㅋㅋㅋ
일단 예제부터 보자. 엄청 긴 예제니까 긴장긴장!
간장게장 먹고싶…
StringFunctionTest.ino |
String stringOne = "abcdefghijklmnopqrstuvwxyz"; String stringTwo="abc";
void setup() { Serial.begin(115200); }
void loop() { } |
훠우. 이 때까지 봤던 예제 중에 제일 긴 예제구만!
너무 길어서 여기에 다 못 씀;; 첨부 파일로 소스 파일 첨부해뒀으니 다운로드 받아서 실행해보자. 어차피 함수 설명하면서 소스 하나하나 확인해볼 것이므로, 강좌 다 읽고 실행해도 상관은 없다. 소스 설명 옆에 실제로 출력되는 문자열을 주석으로 처리해 뒀으므로 참고할 것.
실행하면 아래와 같은 결과가 나와욥.

그럼 stringOne 객체에는 "abcdefghijklmnopqrstuvwxyz"가, stringTwo 객체에는 "abc"가 저장되어 있다는 것만 기억하면서, 함수 설명 시~작!
String.charAt(index)
String 객체에 저장된 문자열 중 index 번째의 문자를 반환한다. 예제에서 3번째 문자를 요청했고, ‘d’라는 문자가 반환되었다. 문자 배열의 인덱스는 0번부터 시작하므로 index 값으로 3을 주면 실제로 4번째 문자가 반환된다는 것에 유의하자.
Serial.print("charAt(3) : "); Serial.println(stringOne.charAt(3)); // charAt(3) : d |
매개 변수 index : 읽어 올 문자의 자리. int 형. 반환 값 char 형 문자 : index 번째의 문자 반환
|
String[index]
[] 연산자를 사용해서 charAt() 함수와 같은 결과를 얻는다.
String.compareTo(string1)
String 객체에 저장된 문자열과 string1 문자 배열을 비교하는 함수이다. String과 string1 문자 배열이 같으면 0을 반환하며, 다를 경우 int 형 숫자를 반환한다.
Serial.print("stringTwo.compareTo(abc) : "); Serial.println(stringTwo.compareTo("abc")); // stringTwo.compareTo(abc) : 0 Serial.print("stringTwo.compareTo(def) : "); Serial.println(stringTwo.compareTo("def")); // stringTwo.compareTo(def) : -3 |
반환 값은 String과 string을 첫 문자부터 검사하여 두 문자가 다른 시점의 문자의 아스키 코드 차이 값을 의미한다. 즉, “abc”와 “def”를 비교했을 때 첫 문자 ‘a’와 ‘d’를 비교하여 ‘d’의 아스키 코드 값 100과 ‘a’의 아스키 코드 값 97의 차이인 -3을 반환한 것. 만일 String 객체에 “def”가 저장되어 있고 매개 변수로 “abc”를 전달했다면 +3이 반환된다.
매개 변수
string1 : String 객체와 비교할 문자 배열 또는 다른 String 객체. 반환 값
int 형 숫자 : String과 string1이 같을 경우 0을 반환.
|
String.equals(string1)
compareTo() 함수와 마찬가지로 String 객체와 string1 문자 배열을 비교하는 함수지만, compareTo() 함수와 달리 0, 1 값만을 반환한다. 같으면 1(TRUE), 다르면 0(FALSE). 소문자 ‘a’와 대문자 ‘A’는 다른 아스키 코드 값을 가지므로 다른 문자로 판단되어 예제에서는 0을 반환한다.
Serial.print("stringTwo.equals(ABC) : "); Serial.println(stringTwo.equals("ABC")); // stringTwo.equals(ABC) : 0 Serial.print("stringTwo.equalsIgnoreCase(ABC) : "); Serial.println(stringTwo.equalsIgnoreCase("ABC")); // stringTwo.equalsIgnoreCase(ABC) : 1 |
매개 변수 string1 : String 객체와 비교할 문자 배열 또는 다른 String 객체.
반환 값 0 또는 1 : 두 문자열이 같으면 1, 다르면 0을 반환한다. |
String.equalsIgnoreCast(string1)
equals() 함수와 마찬가지로 String 객체와 string1 문자 배열을 비교하여 0 또는 1 값을 반환한다. 단, 대소문자를 구분하지 않아 ‘a’와 ‘A’를 같은 문자로 판단한다.
String.concat(string1)
+ 연산과 같은 기능을 한다. 아두이노 홈페이지의 함수 설명에는 매개 변수가 2개로 되어 있는데, 실제로는 하나만 사용해야 한다. 2개 쓰니까 에러나던데?
→ 수정 (2017.06.05)
홈페이지의 레퍼런스가 라이브러리와 맞게 수정된 듯 하다. 매개 변수는 1개만 쓰면 되고, String 뿐만 아니라 string, char, int, long 등 String()에 사용할 수 있는 타입은 모두 사용된다.
문자열 추가가 성공할 경우 true, 실패할 경우 false를 반환한다.
stringTwo.concat("def"); Serial.print("stringTwo.concat(def) : "); Serial.println(stringTwo); // stringTwo.concat(def) : abcdef |
매개 변수 value : String 문자열에 추가할 String, string, char, int, unsigned int, long 등의 값 반환 값 true(1) 또는 false(0) : 문자열 추가 성공 여부를 반환한다. |
Serial.print("stringOne.startWith(abc) : "); Serial.println(stringOne.startsWith("abc")); // stringOne.startsWith(abc) : 1 |
매개 변수 string1 : 문자 배열 또는 다른 String 객체.
반환 값 0 또는 1 : String 객체가 string1 문자열로 시작하면 1, 아니면 0을 반환. |
String.endsWith(sring1)
String 객체의 문자열이 string1 문자 배열로 끝나는지 검사한다.
Serial.print("stringOne.endsWith(abc) : "); Serial.println(stringOne.endsWith("abc")); // stringOne.endsWith(abc) : 0 |
매개 변수 string1 : 문자 배열 또는 다른 String 객체 반환 값 0 또는 1 : String 객체가 string1 문자열로 끝나면 1(TRUE), 아니면 0(FALSE)을 반환. |
String.length()
String 객체의 문자열 길이를 반환한다. ‘\0’ 문자는 길이에 포함시키지 않는다.
Serial.print("stringOne.length() : "); Serial.println(stringOne.length()); // stringOne.length() : 26 |
반환 값 int 형 숫자 : String 문자열의 길이. |
String.indexOf(string1)
String.indexOf(string1, from)
String 객체의 문자열에서 string1 문자열을 찾아서 첫 문자의 인덱스 값을 반환한다. String 문자열에서 string1 문자열을 찾기 시작할 인덱스를 지정할 수 있다. 예제에서는 ‘stringOne’ 객체에서 “def” 문자열을 0번째 문자(‘a’)부터 찾아, ‘d’의 인덱스 값인 3을 반환하고 있다. (인덱스는 0부터 시작하는 것에 유의.) 만일 string1 문자열을 찾지 못하면 -1을 반환한다.
Serial.print("stringOne.indexOf(def,0) : "); Serial.println(stringOne.indexOf("def",0)); // stringOne.indexOf(def,0) : 3 |
매개 변수
string1 : String 문자열에서 찾을 문자 배열 또는 다른 String 객체.
from : string1 문자열을 찾기 시작할 String 문자열의 인덱스 값. from 값을 설정하지 않으면 String 문자열의 제일 처음부터 찾는다.
반환 값
int 형 숫자 : string1 문자열을 찾으면 첫 문자의 인덱스 값을 반환, 찾지 못하면 -1을 반환. |
String.lastIndesOf(string1)
String.lastIndexOf(string1, from)
String 문자열에서 string1 문자열을 뒤에서부터 찾는다. from 값을 설정하면 해당 인덱스부터 찾는다. 예제에서 “opq” 문자열을 20번째 문자(‘u’)부터 앞으로 이동하며 찾는다. indexOf() 함수와 마찬가지로 찾지 못하면 -1을 반환한다.
Serial.print("stringOne.lastIndexOf(opq, 20) : "); Serial.println(stringOne.lastIndexOf("opq", 20)); // stringOne.lastIndexOf(opq,20) : 14 |
매개 변수
string1 : 문자 배열 또는 다른 String 객체
from : string1 문자열을 찾기 시작할 인덱스 값. from 번째 문자부터 앞으로 찾는다. from 값을 설정하지 않으면 맨 뒤부터 찾는다.
반환 값
int 형 숫자 : -1 또는 찾은 문자 배열의 인덱스 값. |
String.toCharArray(buf, length)
String.toCharArray(buf, length, index)
String 객체의 문자열을 문자 배열로 length만큼 복사한다. index 값을 주면 해당 인덱스부터 복사한다. 예제에서 buf 문자 배열로 10만큼 복사하는데, 실제로 buf 문자 배열에는 9개의 문자(“abcdefghi”)만 복사되었다. 마지막에 ‘\0’ 문자가 붙어야 하기 때문. 즉, 실제로 복사할 문자열 길이보다 1 더해서 length 값을 설정해야 한다. 물론 buf 배열의 크기도 length 값과 같이 1 더해서 정해줘야 하고.
char buf[10]={0}; stringOne.toCharArray(buf, 10); Serial.print("stringOne.toCharArray(buf, 10) : "); Serial.println(buf); // stringOne.toCharArray(buf,10) : abcdefghi |
매개 변수 buf : 복사한 문자열을 저장할 char 형의 배열 또는 char* 형의 포인터 변수. length : 복사할 문자 배열의 길이. ‘\0’ 문자까지 포함되어야 한다. index : 복사를 시작할 String 문자열의 시작 인덱스. 설정하지 않으면 처음부터 복사된다. |
String.getBytes(buf, length)
String.getBytes(buf, length, index)
toCharArray() 함수와 같지만 한 가지 차이점이 있다. buf 배열의 자료형이 char 형이 아니라 unsigned char 형이라는 것. 매개 변수는 동일하다.
stringOne.getBytes((unsigned char*)buf, 10); Serial.print("stringOne.getByte(buf, 10) : "); Serial.println(buf); // stringOne.getByte(buf,10) : abcdefghi stringOne.getBytes((unsigned char*)buf, 10, 5); Serial.print("stringOne.getByte(buf, 10, 5) : "); Serial.println(buf); // stringOne.getByte(buf,10,5) : fghijklmn |
String.substring(start)
String.substring(start, end)
String 객체에서 원하는 자리의 문자열을 복사하여 새로운 String 객체로 반환한다. start 번째 문자부터 복사하고, end 번째 문자 앞까지 복사한다. end 번째 문자는 포함되지 않는다는 것에 유의. end 값을 설정하지 않으면 문자열의 끝까지 복사하여 반환한다.
String stringSub = stringOne.substring(5, 10); Serial.print("stringOne.substring(5, 10) : "); Serial.println(stringSub); // stringOne.substring(5,10) : fghij |
매개 변수 start : 복사를 시작할 문자의 인덱스 값 end : 복사를 끝낼 문자의 인덱스 값. end 번째 문자의 앞까지 복사된다. 반환 값 String 객체 : 새로운 String 객체에 문자열을 복사하여 반환한다. |
String.setCharAt(index, char)
index 번째의 문자를 char 문자로 변경한다. 예제에서 stringOne 객체를 복사한 stringReplace 객체(“abcdefghijklmnopqrstuvwxyz”)의 0번째 문자를 대문자 ‘A’로 바꿨다.
String stringReplace = stringOne; stringReplace.setCharAt(0,N'A'); Serial.print("stringReplace.setCharAt(0, A) : "); Serial.println(stringReplace); // stringReplace.setCharAt(0,A) : Abcdefghijk.... |
매개 변수 index : 교체할 문자의 인덱스 값. char : 교체할 문자. |
String.replace(char1, char2)
String.replace(string1, string2)
String 객체의 문자열에서 char1 문자를 찾아 char2 문자로 교체한다. 또는 string1 문자열을 찾아 string2 문자열로 교체한다. 예제에서 “def” 문자열을 찾아 “xxx” 문자열로 교체했다. 만일 String 객체의 문자열에 찾는 문자 또는 문자열이 2개 이상 존재할 경우 찾은 문자 또는 문자열을 모두 교체한다.
stringReplace.replace("def", "xxx"); Serial.print("stringReplace.replace(def, xxx) : "); Serial.println(stringReplace); // stringReplace(def,xxx) : Abcxxxghijk... |
매개 변수 char1, string1 : 찾을 문자 또는 문자 배열 또는 String 객체 char2, string2 : 교체할 문자 또는 문자 배열 또는 String 객체 |
String.remove(index)
String.remove(index, count)
index 번째 문자부터 count 개수만큼의 문자를 제거한다. count 값을 주지 않으면 끝까지 제거된다. index 번째 문자부터 제거된다는 점에 유의하자.
이 remove() 함수는 스케치 툴 버전 1.0.6부터 생긴 거 같은데, 릴리즈 노트를 암만 뒤져봐도 히스토리가 없네;; 쨌든, 스케치 툴 버전이1.0.6 이전 버전이라면 remove() 함수를 사용할 수 없다.
stringOne.remove(10); Serial.print("stringOne.remove(10) : "); Serial.println(stringOne); // stringOne.remove(10) : abcdefghij |
매개 변수
index : 제거할 문자열의 시작 인덱스.
count : 제거할 문자의 개수. 설정하지 않으면 끝 문자까지 제거된다. |
String.toInt()
만일 String 문자열이 숫자를 나타내는 문자열이라면 실제 숫자(정수) 값으로 변환하여 반환한다. 숫자는 long 타입의 범위에서 변환할 수 있다. –값도 변환 가능하다. 예제에서 “1234”라는 문자열이 저장되어 있고, toInt() 함수를 이용해서 실제 int 형의 변수에 1234라는 값이 저장되었다. 만일 문자열이 “-1234”였다면 iValue 값은 -1234가 된다.
문자열이 “123abc”와 같이 숫자 뒤에 다른 문자가 붙은 형태라면 123이라는 값을 반환하고 뒤의 문자는 무시된다. 단, 숫자가 아닌 문자로 시작하는 문자열이라면 0을 반환한다.
String stringInt = "1234"; int iValue = stringInt.toInt(); Serial.print("stringInt.toInt() : "); Serial.println(iValue); // stringInt.toInt() : 1234 |
반환 값
long 형 숫자 : 문자열이 숫자를 나타내는 문자열이라면 실제 숫자로 변환하여 반환한다. 만일 숫자를 나타내는 문자열이 아니라면 0을 반환한다. |
String.toFloat()
스케치 버전 1.0.6부터 사용 가능한 함수다. String 문자열이 실수를 나타내는 문자열이라면 실제 실수 값으로 변환하여 반환한다. toInt() 함수와 마찬가지로 숫자 뒤에 붙은 문자는 무시되며, 숫자가 아닌 문자로 시작하는 문자열일 경우 0.0을 반환한다. 단, 문자열이 너무 길 경우 하위 자리는 변환되지 않을 수 있다.
String stringFloat = "3.14"; float fValue = stringFloat.toFloat(); Serial.print("stringFloat.toFloat() : "); Serial.println(fValue); // stringFloat.toFloat() : 3.14 |
반환 값
float 형 실수 : 문자열을 실수형 숫자로 변환하여 반환한다. 문자열이 정수를 나타내는 문자열일 경우에도 실수형 타입으로 반환되며, 숫자가 아닐 경우 0.0을 반환한다. |
String.toLowerCase()
.. 함수 왜이래 많노. String 객체의 문자열 중 알파벳 문자를 찾아 모두 소문자로 변환한다.
String.toUpperCase()
String 객체의 문자열 중 알파벳 문자를 찾아 모두 대문자로 변환한다. 힘들어서 간단하게 설명하는거 아님. 원래 간단한 함수임.
String stringLower = "AbcDeFGh"; String stringUpper = "AbcDeFGh"; stringLower.toLowerCase(); stringUpper.toUpperCase(); Serial.print("stringLower.toLowerCase() : "); Serial.println(stringLower); // stringLower.toLowerCase() : abcdefgh Serial.print("stringUpper.toUpperCase() : "); Serial.println(stringUpper); // stringUpper.toUpperCase() : ABCDEFG |
String.trim()
앞, 뒤에 있는 공백 문자를 제거한다. 예제에서 “abcd “(공백 문자 4개) 문자열의 길이를 출력하면 8이 나오고, trim() 함수를 사용하여 공백을 제거한 후 문자열의 길이를 출력하면 4로 바뀐 것을 확인할 수 있다.
String stringTrim = "abcd "; Serial.print("stringTrim.length() : "); Serial.println(stringTrim.length()); // stringTrim.length() : 8 stringTrim.trim(); Serial.print("(After trim())stringTrim.length() : "); Serial.println(stringTrim.length()); // (After trim()) stringTrim.length() : 4 |
String.reserve(size)
예제 소스에는 없지만 마지막으로 설명하고 넘어가자. 드디어 마지막!!
String 객체는 저장하는 문자 배열의 길이에 따라 저장 공간이 자동으로 할당되는데, reserve() 함수를 사용하면 미리 저장 공간을 확보해둘 수 있다. 언제 사용하는지는 잘 모르겠네. -_- 언젠간 사용되겠지. (지금 예상 외로 글이 길어져서 멘붕 상태.)
내가 지금 무슨 짓을...
인사할 기운도 없...
안ㄴㅕ.....