찾는 글자가 없을 경우를 생각해야 한다고? 헷갈릴 준비를 해라 애송이.

제로부터 시작하는 이세계 strpos()


코딩을 하다 보면 어떤 문자열 안에 어떤 문자(들의 덩어리)가 있는지, 있다면 어디쯤에서 그게 처음 등장하는지 알고 싶을 때가 있다. php는 이걸 어떻게 할까? 스트링 포지션이라고 읽는 strpos()이 있다.

return strpos("hello world", "h");
// 반환값: 0
// 왜 0이냐고? hello world에서 h는 첫번째 글자 즉 제0번 글자에서 처음 등장하기 때문이다.

여기서 퀴즈. 존재하지 않는 문자(들의 덩어리)를 찾으라고 하면 strpos()는 무엇을 반환할까?
0은 아닌 것 같고, 그렇다고 아무것도 안 돌려주면 오류 같아서 헷갈릴 거 같고, 자바스크립트에서 indexOf()는 존재할 리 없는 위치라는 의미에서 -1을 돌려주는 것 같던데… php는?

처음 이걸 알게 되면 누구나 미간을 찌푸리고 머리를 긁는데, 이때 strpos()는 FALSE 즉 거짓 진위값을 던져준다.


뭐가 문제냐고? 실무로 가면 이거 가지고 변수 만들고 로직 짜다가 대환장 파티가 벌어진다.

// 소개문에 "man"이 있고 "woman"이 없을 때 "한남재기해라"를 출력하시오
$intro = "i am a man and i hate kimchinyeo";
if (strpos($intro, "woman") == false) { if (strpos($intro, "man") > -1) {
// 여기와
} else {
// 여기 2군데 중에서 // 과연 어디에 "한남재기해라"를 넣어야 할까요?
} } else {
// ...아니면 혹시 여기에 넣어야 하나?? 😂😂😂
}

오늘 같은 팀 옆자리 팀원님과 팀장님이 PHP 레거시를 막 보다가 (일단은 PHP 개발자인) 나한테 문득 strpos()의 행동을 물어본 게 생각나서 써 봤다. JS 위주로 작업하시는 옆자리 팀원님이 “이거는 문자열 못 찾을 땐 어떻게 돼요?”라길래 “false 불리언 떨어져요.” 했더니 “-1이 아니고?”라고 곧장 되물어보는데 그 황당함이 감추어지지 않던 그 표정이란 참 봐줄 만한 것이었다.


PS1. 위 퀴즈 정답이 뭐냐고? “여기와”라고 적은 맨첫번째 구간에서 한남 재기하라고 해야 정상 동작을 한다. 어때 헷갈려 미치겠지?
PS2. 아니, 실은 정상 동작을 하지 않는다. if (strpos(…) == false)는 오동작을 한다. 반드시 if (strpos(…) === false)로 타입까지 강력하게 비교해야 된다!  😇😇😇