이지은님의 블로그
250105 - Java 제네릭과 정규 표현식의 활용 본문
▷ 오늘 배운 것
오늘은 java종합반 4주차 제네릭내용을 정리하려고 한다.
1. 제네릭
2. 정규표현식
1) Pattern 클래스
2) 주요 Regex 문법
3) Regex 문법 예제
1. 제네릭
제네릭은 클래스를 지정할때 타입을 유연하게 지정가능하고
클래스를 호출하면서 어떤 타입을 사용할 것인지 지정할 수 있다.
효율1: 타입 언어에서 중복되거나 필요없는 코드를 줄여주는 것
효율2: 타입 안정성을 해치지않음(Object를 대신 사용할 경우 타입안정성 침해)
제한1: 객체의 static 맴버에 사용할 수 없음
—> 타입변수는 인스턴스 변수로 간주, 모든 객체에 동일하게 동작해야하는 static필드 특성상 사용할 수 없음
제한2: 제네릭 배열 생성 불가
public class Generic<T> {
private T t;
public T get() { return this.t; }
public void set(T t) { this.t = t; }
public static void main(String[] args) {
Generic<String> stringGeneric = new Generic<>();
stringGeneric.set("Hello World");
String tValueTurnOutWithString = stringGeneric.get();
System.out.println(tValueTurnOutWithString);
}
}
제네릭의 기능
- 다수의 타입변수 지정가능
- 상속과 타입의 관계가 그대로 적용됨
- 제네릭의 제한을 정할 수 있음
- <? extends T> : T와 그 자식들만 사용가능
- <? super T> : T와 그 부모들만 사용가능
- <?> : 제한 없음
- 메서드를 스코프로 제네릭을 별도 선언가능
// 스코프로 제네릭을 사용할 수 있음
public static <T extends Comparable<? super T>> void sort(List<T> list)
static <T> void sort(List<T> list, Comparator<? super T> c) {}
- 반환 타입앞에 제네릭사용
- 해당 메서드에서만 적용되는 제네릭 타입 변수를 선언가능
- Static: 제네릭 메소드의 제네릭 타입 변수는 해당 메소드에만 적용되기 때문에 메소드 하나를 기준으로 선언하고 사용가능
public class Generic<T, U, E> {
// Generic<T,U,E> 의 T와 아래의 T는 이름만 같을뿐 다른 변수
static <T> void sort(List<T> list, Comparator<? super T> c) { ... }
}
2. 정규 표현식
정규 표현식이란, 특정한 규칙을 가진 문자열의 집합을 표현하는데 쓰이는 형식 언어
1) Pattern 클래스
Pattern p = Pattern.compile("a...b");
Matcher m = p.matcher("aaaab");
boolean b = m.matches(); // true
Pattern.compile() : 정규 표현식의 패턴을 컴파일 하여 Pattern형태로 저장한다.
matcher() : 비교하고 싶은 문자열과 비교할 수 있다.
matches(): 참거짓을 출력할 수 있다.
이를 한줄로 표현할 수 있는데...
boolean b = Pattern.matches("a...b", "aaaab"); // true
특정 문자를 포함하는지 검사하는 또 다른 메서드로 .contains()가 있다.
.contains()와 .matches()의 차이점은
.contains()는 인자로 전달 받은 특정 문자의 포함 여부를 확인하는 메서드인 반면에,
.matches()는 정규 표현식으로 인자를 받아 동일한 패턴의 문자열인지를 확인하는 메서드이다.
2) 주요 Regex 문법
Regex Syntax | 의미 | 예제 | 일치 | 불일치 |
. | 임의의 단일 문자(1번 나타남) | go.gle | google, goggle | gogle |
? | 0 또는 1번 나타남 | demos?123 | demo123, demos123 | demoA123 |
[abc] | 해당 문자 중 하나 | analy[z]se | analyse, analyze | analyxe |
[a-z] | 알파벳 소문자 중 하나 | demo[2-4] | demo2, demo3 | demo5 |
[^abc] | 해당 문자 외 모든 문자 | analy[^z]se [^A-C]D |
analyxe DD |
analyse, analyze AD, D, DDD |
() | 문자를 하나로 묶음 | (ab)+ |
abababab |
ba |
^ | 특정 문자열로 시작 | ^demo | demos, demonstration | my demo |
$ | 특정 문자열로 끝남 | demo$ | my demo | demonstration |
* | 0회 이상 나타남 (탐욕적 매칭) | goo*gle (o이 0회 이상) | gogle(o 0회) gooogle(o 2회) |
gggle |
+ | 1회 이상 나타남 (탐욕적 매칭) | goo+gle (o이 1회 이상) | google(o 1회) goooogle(o 3회) |
gogle(o 0회) |
{n,m} | 최소 n번, 최대 m번 | a{4,7} | aaaa, aaaaa, aaaaaa | aaa, aaaaaaa |
\ | 이스케이프 | AU\$10 | AU$10 | AU10, 10 |
\s | 공백 문자 | \s | 공백, 탭, 개행 | 공백이 아닌 문자 |
\S | 공백 문자가 아닌 것 | \S | ||
\d | 숫자(0-9) | \d | 0, 1, 9 | 알파벳, 공백 |
\D | 숫자가 아닌 것 | \D | ||
\d | 단어문자 | \d | ||
\W | 비-단어 문자(문장 부호 등) | \W | !, @, # | 알파벳, 숫자 |
3) Regex 문법 예제
1. ^[a-zA-Z]$
: 문자만 존재하는지 확인할 때(^:특정문자열로 시작, $:특정문자열로 끝남)
2. [+\\-*/]
- []: 대괄호는 문자셋을 의미. 해당 문자들 중 하나를 매칭.
- + : 더하기 연산자.
- \\- :빼기 연산자. -가 문자셋 안에서 특별한 의미(범위 지정)를 가지므로 \로 이스케이프 처리.
- 정규식에서 - 자체를 사용하려면 이스케이프 처리(\-)
- 자바 문자열에서는 \자체를 이스케이프해야하므로 \\-
- 하지만 맨끝 또는 맨앞에서 사용되거나 특수 문자로 인식되는 경우, 단순히 -라는 문자로 사용가능(([a-z0-9._%+-])
- * : 곱하기 연산자
- / : 나누기 연산자
3. ^[0-9]*$
- ^ : 문자열 시작
- [0-9] : 숫자 0부터 9까지의 범위
- * : 0개 이상의 숫자를 매칭(0개여도 매칭가능)
- + : 1개 이상의 숫자를 허용
- $ : 문자열 종료
4. 메일 주소 검사: [a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}
5. 특정 시작 문자 탐색:
(예) ^hello : hello로 시작하는 모든 문자열 매칭.
6. 숫자만 포함된 문자열 검사: ^\d+$
▷ 앞으로
이렇게 4주차 내용정리는 마무리 했다. 정규식과 제네릭 모두 계산기 도전과제에 사용할 것이기 때문에 예제문제를 많이 살펴보면서 기능을 익혀야 될 것 같다고 느꼈다.
▷ 참고블로그
[Java] 정규 표현식과 Pattern클래스 및 .matches() 메서드
정규 표현식이란, 특정한 규칙을 가진 문자열의 집합을 표현하는데 쓰이는 형식 언어이다. 정규 표현식을 사용하면 수많은 문자들 사이 전화번호 형식의 문자를 찾을 수도 있고, 찾은 문자열을
velog.io
https://girawhale.tistory.com/77
[Java] Pattern, Matcher Class 사용법과 메소드 정리
자바에서는 정규식을 활용해 문자열을 검증, 탐색을 돕는 Pattern, Matcher 클래스를 제공해준다. 다음에도 쉽게 활용할 수 있도록 정리하려고 한다. 👨🏫 클래스 분석 Pattern 정규 표현식이 컴파
girawhale.tistory.com
https://hijuworld.tistory.com/58
JAVA 정규식을 사용하여 패턴 매칭(Regex, Pattern, Matcher)
정규 표현식이라는 표현식을 이용하여 패턴이 매칭하는지 검사 할 수 있다. 예를들어 어떤 문자열이 A부터 C사이에 글자로 시작하면서 5글자이내의 글자인지를 검사하거나 해당 문자열이 숫자
hijuworld.tistory.com
Class pattern 공식 문서
https://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
Pattern (Java Platform SE 6)
In Perl, \1 through \9 are always interpreted as back references; a backslash-escaped number greater than 9 is treated as a back reference if at least that many subexpressions exist, otherwise it is interpreted, if possible, as an octal escape. In this cla
docs.oracle.com
'TIL' 카테고리의 다른 글
250107 - Java 람다와 스트림, null 처리, Enum, StringBuilder 활용 및 데이터 변환 메소드 비교(valueOf(), parseInt()) (1) | 2025.01.07 |
---|---|
250106 - Java 다중 작업 처리 : 프로세스와 스레드의 개념 및 활용 (0) | 2025.01.06 |
250103 - Java 예외 처리 개념 및 과제 코드분석(오류와 예외, throws, throw, try-catch) (1) | 2025.01.03 |
250102 - Java 객체, 상속, 추상 클래스, 인터페이스의 이해 (0) | 2025.01.02 |
250101 - Java 배열, 컬렉션, 데이터 구조의 핵심 개념 정리 (0) | 2025.01.01 |