-
이것이 자바다 | 11장 기본 API 클래스 (2)JAVA/이것이 자바다 2022. 7. 15. 17:45
11.6 Class 클래스
자바는 클래스와 인터페이스의 메타 데이터를 java.lang 패키지에 소속된 Class 클래스로 관리함
*메타데이터: 클래스의 이름, 생성자 정보, 필드 정보, 메소드 정보
1. Class 객체 얻기(getClass(), forName())
Class 객체를 얻기 위해서는 Object 클래스의 getClass() 메소드이용
Class clazz = obj.getClass();
Class생성자를 감추고 있기 때문에 new연산자로 만들 수 없음
-> forName() 이용 (정적 메소드)
try { Class clazz = Class.forName(String className); } catch (ClassNotFoundException e) { }
2. 리플렉션(getDeclaredConstructors(), getDeclaredFields(), getDeclaredMethods())
리플렉션: Class 객체를 이용하여 클래스의 생성자, 필드, 메소드 정보를 알아내는 것
Constructor[] constructors = clazz.getDeclaredConstructors(); Field[] fields = clazz.getDeclaredFields(); Method[] methods = clazz.getDeclaredMethods();
getDeclaredFields(), getDeclaredMethods()는 클래스에 선언된 멤버만 가져오고, 상속된 멤버는 가져오지 않음
상속된 멤버도 얻는 방법: getFiedls(), getMethods() 이용 (단, public 멤버만 가져옴)
3. 동적 객체 생성(newInstance())
Class 객체를 이용하면 new연산자 없이도 동적 객체 생성 가능
Object 타입의 객체 얻는 방법
1. Class.forName() 메소드로 Class 객체를 얻기
2. newInstance() 메소드 호출
try { Class clazz = Class.forName("런타임 시 결정되는 클래스 이름"); Object obj = clazz.newInstance(); } catch (ClassNotFoundException e) { } catch (InstantiationEsception e) { } catch (IllegalAccessException e) { }
매개변수가 있는 생성자 호출 방법
:리플렉션으로 Constructor 객체를 얻어 newInstance() 메소드 호출
Object를 원래 클래스 타입으로 강제 타입 변환을 해야 함
*클래스 타입을 모르므로 변환 불가! -> 인터페이스 사용
- Action인터페이스(execute메소드)와 SendAction, ReceiveAction 구현 클래스(execute실체 메소드)가 있다고 가정
- Class.forName() 메소드의 매개값으로 SendAction이나 ReceiveAction을 주면 Class 객체가 만들어짐
- Class 객체의 newInstance() 메소드로 Object 객체를 얻을 수 있음
- 얻은 객체는 모두 Action 인터페이스를 구현하고 있으므로 Action 인터페이스 타입으로 변환
- Action 인터페이스의 execute() 메소드를 호출하면 개별 클래스의 실체 메소드인 execute() 메소드가 실행됨
Class clazz = Class.forName("SendAction" 또는 "ReceiveAction"); Action action = (Action) clazz.newInstance(); action.execute();
11.7 String 클래스
1. String 생성자
// 배열 전체를 String 객체로 생성 String str = new String(byte[] bytes); // 지정한 문자셋으로 코딩 String str = new String(byte[] bytes, String charsetName); // 배열의 offset 인덱스 위치부터 length만큼 String 객체로 생성 String str = new String(byte[] bytes, int offset, int length); // 지정한 문자셋으로 디코딩 String str = new String(byte[] bytes, int offset, int length, String charsetName)
2. String 메소드
문자 추출(charAt())
: 매개값으로 주어진 인덱스의 문자 리턴
문자열 비교(equals())
: String 클래스가 오버라이딩해서 문자열을 비교함
바이트 배열로 변환(getBytes())
: 네트워크로 문자열을 전송하거나, 문자열을 암호화할 때 사용
byte[] bytes = "문자열".getBytes(); byte[] bytes = "문자열".getBytes(Charset charset);
시스템 기본 문자셋과 다른 문자셋으로 인코딩된 바이트 배열의 경우 디코딩 방법:
String str = new String(byte[] bytes, String charsetName);
문자열 찾기(indexOf())
: 매개값으로 주어진 문자열이 시작되는 인덱스 리턴
-> 주어진 문자열이 포함되어 있지 않으면 -1 리턴
String subject = "자바 프로그래밍"; int index = subject.indexOf("프로그래밍");
문자열 길이(length())
: 문자열의 길이 리턴
String subject = "자바 프로그래밍";
문자열 대치(replace())
: 첫 번째 매개값인 문자열을 찾아 두 번째 매개값인 문자열로 대치한 새로운 문자열을 생성하고 리턴
String oldStr = "자바 프로그래밍"; String newStr = oldStr.replace("자바", "JAVA");
문자열 잘라내기(substring())
: 주어진 인덱스에서 문자열 추출
substring(int beginIndex, int endIndex): 주어진 시작과 끝 사이 문자열 추출
substring(int beginIndex): 주어진 인덱스부터 끝까지 문자열 추출
알파벳 소·대문자 변경(toLowerCase(), toUpperCase())
: 알파벳 소·대문자로 변경한 새로운 문자열을 생성하여 리턴
문자열 앞뒤 공백 잘라내기(trim())
: 문자열의 앞뒤 공백을 제거한 새로운 문자열을 생성하여 리턴
문자열 변환(valueOf())
: 기본 타입의 값을 문자열로 변환
String str = String.valueOf(10);
11.8 StringTokenizer 클래스
split() vs StringTokenizer: split은 정규 표현식으로 구분, StringTokenizer는 문자로 구분
1. split() 메소드
정규표현식을 구분자로해서 문자열을 분리한 후, 배열에 저장하고 리턴
+) 아래 문자열에서 이름만 따로 추출하고 싶을 때, &, 쉼표(,), -를 파이프( | ) 기호로 연결한 정규 표현식을 매개값으로 제공하면 됨
String text = "홍길동&이수홍,박연수,김자바-최명호; String[] names = text.split("&|,|-");
2. StringTokenizer 클래스
문자열이 한 종류의 구분자로 연결되어 있을 경우, StringTokenizer 클래스를 사용하면 쉽게 분리 가능
String text = "홍길동/이수홍/박연수"; StringTokenizer st = new StringTokenizer(text, "/");
int countTokens() 꺼내지 않고 남아 있는 토큰의 수 boolean hasMoreTokens() 남아 있는 토큰이 있는지 여부 String nextTokens() 토큰을 하나씩 꺼내옴 nextToken() 메소드로 토큰을 하나 꺼내오면 StringTokenizer 객체에는 해당 토큰이 없어짐
만약 더 가져올 토큰이 없다면, java.util.NoSuchElementException 예외 발생
=> hasMoreTokens() 메소드로 꺼내올 토크이 있는지 조사한 후, nextToken() 메소드를 호출
11.9 StringBuffer, StringBuilder 클래스
문자열을 저장하는 String은 내부의 문자열을 수정할 수 없음 -> 변환된 새로운 문자열 리턴
=>+ 연산자를 많이 사용할수록 String의 객체가 늘어남 => 프로그램 성능 저하 원인
∴ 문자열 변경 작업이 많을 경우, java.lang 패키지의 StringBuffer 또는 StringBuilder 클래스를 사용하는 것이 좋음
위 두 클래스는 내부 버퍼에 문자열을 저장해두기 때문에 그 안에서 추가, 수정, 삭제 작업 가능
두 클래스의 사용 방법은 동일함
(차이점)
StringBuffer는 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있음 => 스레드에 안전
StringBuilder는 단일 스레드 환경에서만 사용하도록 설계
StringBuilder sb = new StringBuilder(); // 초기 버퍼는 16개의 문자 저장 가능한 버퍼 만듦 StringBuilder sb = new StringBuilder(16); // 16개의 문자 저장 가능한 버퍼 만듦 StringBuilder sb = new StringBuilder("Java"); // 주어진 문자열을 버퍼의 초기값으로 만듦
* 버퍼가 부족할 경우 자동으로 버퍼 크기를 늘리기 때문에 초기 버퍼의 크기는 그다지 중요하지 않음
11.10 정규 표현식과 Pattern 클래스
2. Pattern 클래스
문자열을 정규 표현식으로 검증하는 기능 - matches() 메소드
boolean result = Patter.matches("정규식", "검증할 문자열");
11.12 Wrapper(포장) 클래스
1. 박싱과 언박싱
박싱: 기본 타입의 값을 포장 객체로 만드는 과정
언박싱: 포장 객체에서 기본 타입의 값을 얻어내는 과정
박싱하는 방법
기본 타입의 값을 줄 경우 문자열을 줄 경우 Byte obj = new Byte(10); Byte obj = new Byte("10"); Short obj = new Short(100); Short obj = new Short("100); ... ... +) 생성자를 이용하지 않아도 각 포장 클래스마다 가지고 있는 정적 valueOf() 메소드를 사용할 수 있음
Integer obj = Integer.valueOf(1000); Integer obj = Integer.valueOf("1000");
언박싱하는 방법
: "기본타입명 + Value()" 메소드 호출
기본 타입의 값을 이용 byte num = obj.byteValue(); char ch = obj.charValue(); ... ... 2. 자동 박싱과 언박싱
ex) int 타입의 값을 Integer 클래스 변수에 대입하면 자동 박싱이 일어나 힙 영역에 Integer 객체가 생성됨
Integer obj = 100;
자동 언박싱: 기본 타입에 포장 객체가 대입될 경우 발생
Integer obj = new Integer(200); int value1 = obj; // 자동 언박싱 int value2 = obj + 100; // 자동 언박싱
3. 문자열을 기본 타입 값으로 변환
대부분의 포장 클래스에는 "parse+기본타입" 명으로 되어 있는 정적(static) 메소드가 있음
int value1 = Integer.parseInt("10"); ...
'JAVA > 이것이 자바다' 카테고리의 다른 글
이것이 자바다 | 12장 멀티 스레드 (0) 2022.07.23 이것이 자바다 | 11장 기본 API 클래스 (3) (0) 2022.07.21 이것이 자바다 | 10장 예외처리 (0) 2022.07.12 이것이 자바다 | 9장 중첩 클래스와 중첩 인터페이스 (0) 2022.07.12 이것이 자바다 | 8장 인터페이스 (0) 2022.07.10