※ 정규 표현식(Regular Expression)
특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.
? 물음표는 0번 또는 1차례까지의 발생을 의미한다. 이를테면 colou?r는 "color"와 "colour"를 둘 다 일치시킨다.
* 별표는 0번 이상의 발생을 의미한다. 이를테면 ab*c는 "ac", "abc", "abbc", "abbbc" 등을 일치시킨다.
+ 덧셈 기호는 반드시 1번 이상의 발생을 의미한다. 이를테면 ab+c는 "abc", "abbc", "abbbc" 등을 일치시키지만 "ac"는 일치시키지 않는다.
{n} 정확히 n 번만큼 일치시킨다.
{min,} "min"번 이상만큼 일치시킨다.
{min,max} 적어도 "min"번만큼 일치시키지만 "max"번을 초과하여 일치시키지는 않는다.
[ ] 문자 클래스 "["과 "]" 사이의 문자 중 하나를 선택한다. "¦"를 여러 개 쓴 것과 같은 의미이다. 예를 들면 [abc]d는 ad, bd, cd를 뜻한다. 또한, "-" 기호와 함께 쓰면 범위를 지정할 수 있다.
"[a-z]"는 a부터 z까지 중 하나, "[1-9]"는 1부터 9까지 중의 하나를 의미한다.
[^ ] 부정 문자 클래스 안의 문자를 제외한 나머지를 선택한다. 예를 들면 [^abc]d는 ad, bd, cd는 포함하지 않고 ed, fd 등을 포함한다. [^a-z]는 알파벳 소문자로 시작하지 않는 모든 문자를 의미한다.
( ) 하위식 여러 식을 하나로 묶을 수 있다. "abc¦adc"와 "a(b¦d)c"는 같은 의미를 가진다.
\d d는 digit. 한개의 숫자, [0-9]와 동일
※ Pattern 클래스
java.util.regex 패키지의 Pattern 클래스는 정규 표현식으로 문자열을 검증하는 matches() 메서드를 제공.
boolean result = Pattern.matches("정규식", "검증할 문자열");
※ 리플렉션(reflection)
자바는 클래스와 인터페이스의 메타 정보를 Class 객체로 관리한다. 메타 정보란 패키지 정보, 타입 정보, 멤버(생성자, 필드, 메소드) 정보 등을 말한다. 이러한 메타 정보를 프로그램에서 읽고 수정하는 행위를 리플렉션이라고 한다.
// 프로그램에서 Class 객체를 얻으려면 3가지 방법 중 하나를 이용
① Class clazz = 클래스이름.class; // 클래스로부터 얻는 방법
② Class clazz = Class.forName("패키지···클래스 이름"); // 클래스로부터 얻는 방법
③ Class clazz = 객체참조변수.getClass; // 객체로부터 얻는 방법
타입(클래스, 인터페이스)가 가지고 있는 멤버 정보는 다음 메소드를 통해 얻을 수 있다.
Constructor[] getDeclaredConstructors() : 생성자 정보 읽기
Field[] getDeclaredFields() : 필드 정보 읽기
Method[] getDeclaredMethods() : 메소드 정보 읽기
각각 Constructor 배열,Field 배열, Method 배열을 리턴한다.
Constructor, Field, Method 클래스는 모두 java.lang.reflect 패키지에 있는데, 각각 생성자, 필드, 메소드에 대한 선언부 정보를 제공한다.
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Scanner;
public class ReflectionTest {
public static void test(String className) throws ClassNotFoundException {
Class c = Class.forName(className);
Field[] fields = c.getDeclaredFields(); // Run time Dynamic Load된 필드 변수들 찾기
for(Field f : fields) {
System.out.println(f.getName());
}
System.out.println("--------------");
Method[] methods = c.getDeclaredMethods(); // Run time Dynamic Load된 class의 메서드 찾기
for(Method m: methods) {
System.out.println(m.getName());
}
try {
// c.newInstance(); //객체 생성이 되는 것
Object obj = c.getDeclaredConstructor().newInstance();
System.out.println(obj); //obj.toString() 자동호출됨
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException |
InvocationTargetException | NoSuchMethodException | SecurityException e) {
e.printStackTrace();
//Exception의 내용을 스택형태로 차곡차곡 추적해서 출력한다. 디버깅할 때 쓸 것
}
}
public static void main(String[] args) throws ClassNotFoundException {
Scanner sc = new Scanner(System.in); //ctrl+shift+O = import 쉽게
System.out.print("클래스이름을 입력하세요 ex)java.util.Date:");
String className = sc.nextLine();
test(className);
}
}
※ 리소스 경로 얻기
Class 객체는 클래스 파일(~.class)의 경로 정보를 가지고 있기 때문에 이 경로를 기준으로 상대 경로에 있는 다른 리소스 파일(이미지, XML, Property 파일)의 정보를 얻을 수 있다. 다음 메소드를 통해 얻을 수 있다.
URL getResource(String name) : 리소스 파일의 URL 리턴
InputStream getResourceAsStream(String name) : 리소스 파일의 InputStream 리턴
'언어 > Java' 카테고리의 다른 글
날짜와 시간 클래스 (0) | 2023.08.08 |
---|---|
포장 클래스(Wrapper class) (0) | 2023.08.08 |
문자열 클래스 (0) | 2023.08.08 |
롬복(Lombok) (0) | 2023.08.08 |
java.base 모듈 (0) | 2023.08.08 |