InputFilter: 개념, InputFilter 인터페이스 및 Android에서의 필터링

저자: IT Sectr 게시일: 2026-07-08 읽는 시간: 5 분

InputFilter는 EditText에 표시되기 전에 입력 텍스트를 가로채고 수정할 수 있는 Android SDK 인터페이스입니다. 개발자는 필터링 규칙(허용 문자, 최대 길이, 입력 형식)을 설정합니다. Android Developers, 2026에 따르면 InputFilter는 문자, 숫자, 특수 문자의 입력을 제한하고 텍스트를 자동으로 서식 지정하는 데 사용됩니다. TextWatcher와 달리 필터는 텍스트 변경 전에 작동하므로 소스 수준에서 잘못된 입력을 방지합니다.

핵심 포인트

  • InputFilter는 EditText 및 TextView에서 입력을 제한하고 서식을 지정하는 Android 인터페이스입니다.
  • filter 메서드는 텍스트 변경 전에 호출되며 변경이 허용되면 필터링된 CharSequence 또는 null을 반환합니다.
  • InputFilter.LengthFilter는 최대 텍스트 길이를 제한하는 표준 구현입니다.
  • 사용자 정의 필터는 특정 문자를 금지하거나, 입력 마스크를 적용하거나, 대소문자를 변환할 수 있습니다.
  • 필터 체인 — 하나의 EditText에 여러 InputFilter를 동시에 적용할 수 있으며 순차적으로 실행됩니다.

InputFilter란 무엇이며 왜 필요한가?

InputFilter는 android.text 패키지의 함수형 인터페이스로, 단일 메서드 filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend)를 정의합니다. 사용자가 EditText에서 텍스트를 입력, 붙여넣기 또는 교체하려고 할 때마다 자동으로 호출됩니다. 반환 값은 변경 사항이 수락, 거부 또는 수정될지 결정합니다.

InputFilter의 주요 목적은 텍스트가 필드에 들어가기 전에 잘못된 입력을 방지하는 것입니다. 예를 들어, 전화번호 숫자 입력 필드에서 필터는 문자와 특수 문자를 차단할 수 있습니다. 비밀번호 필드에서는 최소 길이를 적용할 수 있습니다. 확인 코드 필드에서는 숫자만 허용할 수 있습니다. TextWatcher를 통한 검증과 달리 필터는 잘못된 문자가 화면에 표시되는 것 자체를 방지합니다.

Android Developers에 따르면 InputFilter는 TextInputEditText의 모든 Material Design 구성 요소에서 사용됩니다. PhoneNumberFormattingTextWatcher와 같은 라이브러리는 완전한 서식 지정을 위해 TextWatcher와 InputFilter를 결합합니다. 잘못된 입력에 대한 첫 번째 방어屏障으로 InputFilter를 사용하고, 입력 후 추가 로직에는 TextWatcher를 사용하는 것이 좋습니다.

InputFilter의 작동 방식

filter 메서드는 6개의 매개변수를 받습니다: source — 입력 텍스트, start와 end — 입력 조각의 경계, dest — 필드의 현재 내용, dstart와 dend — 삽입 위치입니다. 메서드가 null을 반환하면 변경 사항이 그대로 수락됩니다. 빈 문자열 “”을 반환하면 변경 사항이 차단됩니다. 새 CharSequence를 반환하면 원본 텍스트가 반환된 값으로 대체됩니다.

예를 들어, 숫자만 허용하는 필드에 사용자가 문자 “a”를 입력하려고 하면 필터가 “”을 반환하고 문자가 나타나지 않습니다. “123”이 입력되면 필터가 구분 기호를 추가하여 “1-2-3”을 반환할 수 있습니다. 이 메커니즘은 TextWatcher 없이 전화번호, 날짜 및 기타 구조화된 데이터의 자동 서식 지정을 가능하게 합니다.

중요: InputFilter는 원본 데이터 소스를 수정하지 않으며 필터링된 버전만 반환합니다. Android 자체가 반환된 값을 Editable에 적용합니다. 필터가 null을 반환하면 추가 작업이 필요하지 않습니다. 수정된 텍스트를 반환하면 Android가 원본 범위를 제거하고 새 범위를 삽입합니다.

Android SDK의 표준 필터

Android SDK는 InputFilter의 여러 내장 구현을 제공합니다. 가장 일반적인 것은 InputFilter.LengthFilter로, 최대 텍스트 길이를 제한합니다. 생성자는 정수(최대 문자 수)를 받습니다. 현재 텍스트 길이와 입력이 제한을 초과하면 필터가 잘린 문자열을 반환하여 제한 초과를 방지합니다.

InputFilter.AllCaps도 사용 가능하며, 모든 입력 문자를 대문자로 변환합니다. 코드, 우편번호 및 대소문자가 중요한 기타 데이터 필드에서 사용됩니다. 필터는 단순히 소문자를 차단하는 것이 아니라 변환하므로 사용자가 변환 결과를 볼 수 있습니다.

여러 제한을 위한 InputFilter.LengthFilter — 필터 조합을 통해 구현됩니다. 예를 들어, 길이를 20자로 제한하고 숫자만 허용해야 하는 경우 LengthFilter + 사용자 정의 숫자 필터를 적용할 수 있습니다. 각 필터는 순차적으로 실행되며 이전 필터의 결과가 다음 필터의 dest가 됩니다.

필터목적사용 예
LengthFilter텍스트 길이 제한이름 필드 최대 50자
AllCaps대문자 변환우편번호 필드
사용자 정의 InputFilter임의 필터링 규칙숫자만, 특수 문자 금지

사용자 정의 InputFilter 만들기

사용자 정의 필터를 만들려면 InputFilter 인터페이스를 구현하고 filter 메서드를 재정의해야 합니다. 일반적인 작업은 숫자만 허용하는 필터입니다. 이 경우 메서드는 Character.isDigit을 사용하여 source의 각 문자를 확인하고 모든 문자가 유효하면 필터링된 문자열 또는 null을 반환합니다.

kotlin
class DigitsInputFilter : InputFilter {
    override fun filter(
        source: CharSequence?,
        start: Int,
        end: Int,
        dest: Spanned?,
        dstart: Int,
        dend: Int
    ): CharSequence? {
        val sb = StringBuilder()
        for (i in start until end) {
            val c = source?.get(i)
            if (c != null && Character.isDigit(c)) {
                sb.append(c)
            }
        }
        return if (sb.length == end - start) null else sb
    }
}

DigitsInputFilter 예제는 입력 텍스트의 모든 문자를 반복하며 숫자만 유지합니다. 모든 문자가 검사를 통과하면 메서드가 null을 반환합니다 — 추가 메모리 작업이 필요하지 않으므로 최적의 경우입니다. 일부 문자가 폐기되면 새 문자열이 반환되고 EditText에는 숫자만 도달합니다.

또 다른 일반적인 시나리오는 특수 문자를 차단하는 필터입니다. 구현은 유사합니다: Character.isLetterOrDigit을 통한 각 문자 확인 또는 허용 문자 목록과 비교합니다. 이러한 필터는 사용자 이름 필드, 검색 문자열 및 특수 문자가 허용되지 않는 기타 위치에서 사용됩니다.

EditText에 InputFilter 적용하기

필터는 setFilters(InputFilter[]) 메서드를 통해 EditText에 설정됩니다. 필터 배열은 현재 필터를 대체하므로 기존 필터에 추가하려면 getFilters()로 현재 필터를 가져오고 새 배열을 만들어 다시 설정해야 합니다. EditText에는 XML에서 android:maxLength를 통해 설정되는 기본 필터(LengthFilter)가 하나 있습니다.

kotlin
val editText = findViewById<EditText>(R.id.phone_input)
editText.filters = arrayOf(
    DigitsInputFilter(),
    InputFilter.LengthFilter(10)
)

예제에서는 DigitsInputFilter(숫자만)와 LengthFilter(최대 10자)의 두 필터가 설정됩니다. 배열에서 필터 순서가 중요합니다: 첫 번째 필터가 원본 입력을 받아 처리하고 결과를 두 번째 필터에 전달합니다. DigitsInputFilter가 일부 문자를 필터링하면 LengthFilter는 이미 필터링된 텍스트를 보고 길이 제한을 적용합니다.

필터는 XML 속성 android:inputType을 통해 설정할 수도 있으며, 일부 필터가 자동으로 추가됩니다. 예를 들어, inputType=“phone”은 DigitsKeyListener를 추가하고 숫자와 일부 특수 문자만 허용합니다. 그러나 필터링을 완전히 제어하려면, 특히 여러 규칙을 결합할 때 프로그래밍 방식으로 setFilters를 사용하는 것이 좋습니다.

InputFilter와 입력 검증

InputFilter와 TextWatcher는 서로 다른 기능을 수행하며 종종 함께 사용됩니다. InputFilter는 입력 수준에서 작동하여 잘못된 문자가 필드에 들어가는 것을 방지합니다. TextWatcher는 입력 후에 작동하여 변경 사항에 반응하고, 복잡한 검증 규칙을 수행하며, UI를 업데이트할 수 있습니다. 두 접근 방식의 조합이 최상의 결과를 제공합니다.

예를 들어, 이메일 입력 필드의 경우: InputFilter는 입력 수준에서 공백과 키릴 문자를 차단할 수 있고, TextWatcher는 각 변경 후 완전한 이메일 패턴 준수 여부를 확인할 수 있습니다. 전자는 명백한 오류로부터 보호하고, 후자는 구조적 오류로부터 보호합니다. 이러한 책임 분리는 코드를 더 깔끔하게 만들고 검증 부하를 줄입니다.

Material Design Guidelines에 따르면 필터는 엄격한 제약이 있는 필드(전화번호, 확인 코드, PIN, 우편번호)에 적용해야 합니다. 유연한 검증이 필요한 필드(이름, 주소, 댓글)에서는 사용자가 합법적이지만 비표준적인 값을 입력하는 것을 방해하지 않도록 TextWatcher만으로 충분합니다.

기준InputFilterTextWatcher
작동 시점텍스트 변경 전텍스트 변경 후
목적잘못된 문자 차단변경에 반응, 검증, UI
반환 값필터링된 텍스트 또는 null없음 (void)
적용setFilters()addTextChangedListener()

자주 묻는 질문

InputFilter와 TextWatcher의 차이점은 무엇인가요?

InputFilter는 텍스트 변경 전에 입력을 가로채서 차단하거나 수정할 수 있습니다. TextWatcher는 변경 후에 호출되어 새 값에 반응할 수 있습니다. InputFilter는 예방적 보호, TextWatcher는 후처리입니다. 완전한 양식 검증을 위해서는 두 접근 방식을 모두 사용하는 것이 좋습니다.

EditText에 여러 필터를 적용하려면 어떻게 하나요?

setFilters() 메서드에 필터 배열을 전달합니다. 필터는 배열 순서대로 순차적으로 실행됩니다. 기존 필터를 잃지 않으려면 getFilters()로 가져오고, 배열 복사본에 새 필터를 추가한 후 setFilters로 다시 설정합니다. 이미 설치된 필터를 고려하지 않고 덮어쓰지 마세요.

InputFilter를 텍스트 서식 지정에 사용할 수 있나요?

네, InputFilter는 수정된 CharSequence를 반환하여 입력을 수정할 수 있습니다. 예를 들어, 전화번호 필터는 공백이나 괄호를 추가할 수 있습니다. 그러나 복잡한 서식 지정의 경우 InputFilter를 TextWatcher와 결합하는 것이 좋습니다. 필터는 후처리보다는 차단에 중점을 두기 때문입니다.

InputFilter를 통해 어떤 문자를 차단할 수 있나요?

모든 문자: 공백, 문자, 숫자, 특수 문자, 유니코드 문자. 사용자 정의 필터에서 Character.isLetter, isDigit, isWhitespace를 사용하거나 블랙리스트/화이트리스트와 비교하여 조건을 정의합니다. 필터는 라틴 문자만, 키릴 문자만, 또는 특정 문자 집합만 허용할 수 있습니다.

InputFilter는 프로그래밍 방식의 텍스트 변경에도 작동하나요?

아니요, InputFilter는 사용자 입력 또는 클립보드 붙여넣기 시에만 작동합니다. setText()를 통해 프로그래밍 방식으로 텍스트가 설정되면 필터가 적용되지 않습니다. 프로그래밍 방식 텍스트를 확인하려면 TextWatcher 검증 또는 설정 전 명시적 확인을 사용하세요.

요약

  • InputFilter는 EditText에 표시되기 전에 문자 수준에서 입력을 필터링하고 서식을 지정하는 Android 인터페이스입니다.
  • filter 메서드는 입력을 허용하려면 null, 차단하려면 “”, 수정하려면 새 CharSequence를 반환합니다.
  • LengthFilter와 AllCaps는 길이 제한 및 대소문자 변환을 위한 표준 Android SDK 필터입니다.
  • 사용자 정의 필터는 사용자 정의 문자 확인 로직으로 InputFilter 인터페이스를 구현하여 생성됩니다.
  • 필터 체인을 통해 순차적으로 실행되는 여러 규칙을 결합할 수 있습니다.
  • InputFilter와 TextWatcher는 충돌하지 않고 상호 보완적입니다: 전자는 문자를 차단하고 후자는 변경에 반응합니다.
  • 프로그래밍 방식 텍스트 변경(setText())은 InputFilter를 통과하지 않습니다 — 별도의 검증이 필요합니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기