๐ค String.matches()๋ ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์์๊น?
// String.java
public boolean matches(String regex) {
return Pattern.matches(regex, this);
}
์๋ฐ์์ String ํด๋์ค์ matches() ๋ฉ์๋์์ ๋ด๋ถ์ ์ผ๋ก Pattern ํด๋์ค์ matches ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด Pattern์ matches() ๋ฉ์๋๋ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ท์๊ณผ ๋ฌธ์์ด์ ๋งค์นญ ์ฌ๋ถ๋ฅผ ํ์ธํ ๊น?
// Pattern.java
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
Pattern ํด๋์ค์์๋ ์ ๋ ฅ๋ ์ ๊ท์(regex)์ ์ปดํ์ผํ์ฌ ์๋ก์ด Pattern ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ํด๋น ์ธ์คํด์ค์์ ๋น๊ตํ ๋ฌธ์์ด์ ์ ๋ ฅ๋ฐ์ Matcher ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ ๋ง๋ค๊ณ ๋งค์นญ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๋ฐฉ์์ด๋ค.
๐ฅ String.matches()์ ๋ฌธ์ ์
package blackjack.domain.participant;
import blackjack.exception.NonAlphabeticNameException;
public class Name {
private static final String NAME_FORMAT = "^[a-zA-Z๊ฐ-ํฃ]*$";
private final String value;
public Name(String value) {
validateIsAlphabetic(value);
this.value = value;
}
private void validateIsAlphabetic(String name) {
if (!name.matches(NAME_FORMAT)) {
throw new NonAlphabeticNameException();
}
}
}
๋๋ ๋ธ๋์ญ ๋ฏธ์ ์ ๊ตฌํํ๋ฉด์ ์์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ, String ํด๋์ค์ ๊ตฌํ์ ๋ฐ๋ผ validateIsAlphabetic()์ด๋ผ๋ ๋ฉ์๋๊ฐ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋์ ๊ฐ์ด ๋์ํ๋ ๊ฒ์ ์ ์ ์๋ค.
private void validateIsAlphabetic(String name) {
Pattern p = Pattern.compile(NAME_FORMAT);
Matcher m = p.matcher(name);
if (!m.matches()) {
throw new NonAlphabeticNameException();
}
}
๋ฌธ์ ๊ฐ ์์ด ๋ณด์ด์ง๋ง, ๋ถํ์ํ Pattern ์ธ์คํด์ค๊ฐ ๊ณ์ ์์ฑ๋๊ณ ์๋ค. name์ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ๋ฐ๋๋ ๊ฐ์ด๋ผ Matcher ์ธ์คํด์ค์ ์์ฑ์ ํผํ ์ ์์ง๋ง, Pattern์ ๊ฒฝ์ฐ์๋ NAME_FORMAT์ด๋ผ๋ ์์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ฒ ์์ฑํ ํ์๊ฐ ์๋ค.
๐ ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ์ค์ด๋ ๋ฐฉ๋ฒ
String.matches()์ ๋ฌธ์ ์ ์ ํ์ ํ์ผ๋, ์ด๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์. ๊ฑฐ์ฐฝํ๊ฒ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ์ ๋งคํ์ง๋ง, ์๋์ ๊ฐ์ด ๋ฌธ์์ด ์ ๊ท์ ๋์ Pattern์ ์์๋ก ๊ฐ์ง๊ณ ์๋๋ก ์ฝ๋๋ฅผ ์์ ํ๋ฉด ๋๋ค.
package blackjack.domain.participant;
import blackjack.exception.NonAlphabeticNameException;
import java.util.regex.Pattern;
public class Name {
private static final Pattern NAME_PATTERN = Pattern.compile("^[a-zA-Z๊ฐ-ํฃ]*$");
private final String value;
public Name(String value) {
validateIsAlphabetic(value);
this.value = value;
}
private void validateIsAlphabetic(String name) {
if (!NAME_PATTERN.matcher(name).matches()) {
throw new NonAlphabeticNameException(name);
}
}
}
๐ง String.matches()๊ณผ Pattern ์ฌ์ฉ ์์ ์ฑ๋ฅ ์ฐจ์ด
๋ ์ฝ๋์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ์์๋ณด๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ค.
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.regex.Pattern;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class StringTest {
private static final String NAME_FORMAT = "^[a-zA-Z๊ฐ-ํฃ]*$";
private static final Pattern NAME_PATTERN = Pattern.compile(NAME_FORMAT);
@DisplayName("String.matches()๋ก ๋ฌธ์์ด์ ๋น๊ตํ๋ค.")
@Test
void stringMatchesTest() {
assertTrue(() -> "hello".matches(NAME_FORMAT));
}
@DisplayName("Pattern.matcher()๋ก ๋ฌธ์์ด์ ๋น๊ตํ๋ค.")
@Test
void patternMatcherTest() {
assertTrue(() -> NAME_PATTERN.matcher("hello").matches());
}
}
๋น์ฐํ๊ฒ๋ ๋ด๋ถ์ ์ผ๋ก Pattern ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ์ถ๊ฐ์ ์ผ๋ก ๊ฑฐ์น๋ ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ๊ฐ ์คํ ์๊ฐ์ด ์กฐ๊ธ ๋ ๊ธด ๊ฒ์ ํ์ธํ ์ ์๋ค. ์์ฃผ ์คํ๋์ง ์๋ ๊ฒฝ์ฐ๋ผ๋ฉด ๊ฐ๋ ์ฑ์ ํํด์ String.matches()๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ๋์์ง ์๋ค๊ณ ์๊ฐํ๋ค.
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.regex.Pattern;
public class StringTest {
private static final int loop = 100_000_000;
private static final String NAME_FORMAT = "^[a-zA-Z๊ฐ-ํฃ]*$";
private static final Pattern NAME_PATTERN = Pattern.compile(NAME_FORMAT);
@DisplayName("String.matches()๋ก ๋ฌธ์์ด์ ๋น๊ตํ๋ค.")
@Test
void stringMatchesTest() {
for (int i = 0; i < loop; i++) {
"hello".matches(NAME_FORMAT);
}
}
@DisplayName("Pattern.matcher()๋ก ๋ฌธ์์ด์ ๋น๊ตํ๋ค.")
@Test
void patternMatcherTest() {
for (int i = 0; i < loop; i++) {
NAME_PATTERN.matcher("hello").matches();
}
}
}
๊ทธ๋ฌ๋ ์์ ๊ฐ์ด ์คํ ํ์๊ฐ ๋ง์ด ๋์ด๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ฒ ๋๋ค.
๐ ๊ฒฐ๋ก
Java์์ ์ ๊ท ํํ์์ ์ฌ์ฉํ๋ ์ํฉ์ด ์จ๋ค๋ฉด ๋๋๋ก Pattern์ ์์ํํ์. ์ด๊ฑด ๋จ์ํ ํ๋์ ์์์ผ๋ฟ์ด๊ณ ์ค์ ๋ก๋ ๊ต์ฅํ ๋ค์ํ ์ผ์ด์ค๋ก ์ด๋ฐ ์ฌ์ํ ๋ถ๋ถ๋ค์ ๋์น ์ ์์ผ๋, Java์ ์ฝ๋ ๋ด๋ถ ๊ตฌํ์ ๋ํ ๊ณต๋ถ๊ฐ ๋ง์ด ํ์ํ ๊ฒ ๊ฐ๋ค.
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋์์ฑ ํ์ฅํ๊ธฐ ๊ป์ด๋ค (๋ถ์ - Runtime Data Area) (2) | 2024.09.22 |
---|---|
[Java] Enum์ ๋น๊ตํด ๋ณด์ (56) | 2024.04.15 |