문자열 데이터를 가지고, 특수한 형태로 가공하는 것은 프로그래밍을 하다 보면 자주 보이는 문제 중 하나입니다. 예를 들자면, 전화번호를 가지고 앞에 국번만 따서 어느 지역인지 알아내거나, 이메일 주소를 통해서, 어느 메일을 쓰는지 알아내거나. 이러한 문제들이 많은데요.

 

 오늘은 그 중, instr을 알아보도록 하겠습니다. C언어에서 strstr을 생각하시면 좋습니다. 다만, 다른점은 strstr은 해당 pattern이 나타나는 처음 address를 리턴한다는 것입니다.

 

 


 먼저, 1번째 인자는 string, 2번째 인자는 pattern입니다. 즉, string 안에 pattern이 있는지 확인을 합니다. 만약에 있다면, 처음 패턴이 나타난 위치를 리턴합니다.

 

 

 예를 들어서, 전화번호에서 국번을 찾아야 하는 경우를 생각해 봅시다. 이 때, 국번은, 처음 위치에서부터 -가 처음 나타나는 위치 전까지를 끊어야 합니다. 그러면, instr을 이용할 수 있어요. 이 경우, 타겟은 전화 번호이고, 패턴은 '-'일 거에요. 그러니 위와 같이 써 주면 됩니다.

 

 

 실행 결과는 다음과 같이 나옵니다. 4번째에서 처음 나온다고 하는군요. 만약에, 찾으려는 문자나 패턴이 없다면 어떤 값을 돌려줄까요? 똑같이 입력하되, 2번째 패턴만 '-' 대신에 '@'로 바꾸어 봅시다.

 

 

 그러면 대상체에서 '@'를 찾을 수 없습니다. 이 경우에는, 당연하게도, 찾을 수 없다고 할 건데요. 1번 인덱스부터 세니까, 리턴 값은 왠지 0이 될 거 같네요.

 

 

 대상 pattern이 없으면, 0이 출력됩니다.

 

 


 그러면 이 값은 byte 단위일까요? 아니면, 문자 하나 하나 단위일까요? 이를 알아보기 위한 제일 쉬운 방법은, 1byte로 인코딩이 되지 않는 문자를 섞는 겁니다.

 

 

 예를 들자면, 'a'나 'e'는 1byte로 표현을 할 수 있어요. 하지만, '갑'이나, '분'과 같은 것들은 1byte로 표기를 하지 못합니다.

 

 

 length 함수는 바이트 단위의 길이를 리턴해 주는 함수입니다. '가나다라'의 length를 구해 보면 어떻게 나올까요?

 

 

 12가 나옵니다. 이는 한글 한 글자당, 제 mysql workbeach에서는 3byte로 인코딩을 한다는 소리입니다.

 

 

 그러면, 이것의 결과는 어떻게 나올까요? 만약에 instr이 바이트 단위를 리턴했다면 어떤 결과를 돌려주었을까요?

 

 

 13을 리턴했을 겁니다. 왜냐하면, 제 workbeach에서는, 한글 하나당 3byte를 차지하기 때문입니다. '동'도 3바이트, '해'도, '물'도 '과'도 3byte이니까, 이 네 글자를 저장하기 위해서 12byte가 필요할 겁니다. 그리고 ','가 왔는데요. 기준 base가 1번째라고 한다면, 13번째 위치에 있었습니다.

 

 

 그런데, 실제로는 5가 리턴됩니다.

 

 

 그 이야기는, byte 단위가 아니라, 글자 단위로 몇 번째 위치에 있는지를 계산해서 돌려주었다는 이야기입니다.

 

 C언어의 strstr과 비슷하게 생겼습니다. 둘 다, 해당 패턴이 타겟 문자열에서, 몇 번째에서 최초로 나타내는지를 돌려주는 건 같습니다. 다른 건, strstr의 리턴 값에서, 문자열의 base 주소를 빼면 정확하게, 시작 위치로부터, 몇 byte가 떨어져 있는지를 알 수 있어요. mysql의 instr은, 바이트 단위가 아니라, 문자 단위로 몇 번째 위치에 있는지 돌려줍니다.