gc : garbage collecter
Circle class{}
와 같은 특정 클래스에 대한 정보를 갖고 있는 class
class명
, package명
, field명
, constructor명
, method명
등의 이름 정보를 갖고 있음. Object class에 getClass()
메소드 사용하기
new
로 인스턴스를 만든 후 사용하는 방법forName()
을 사용함Class.forName("특정 패키지명 + 클래스명");
형식Action action;
String sendName = "p06.class_class_practice.SendAction";
String recvName = "p06.class_class_practice.ReceiveAction";
String name;
try {
// name = sendName;
name = recvName;
Class cls = Class.forName(name);
action = (Action) cls.newInstance(); // 예외 모두 처리
action.excecute();
} catch (ClassNotFoundException e) {
System.out.println("해당 클래스명을 찾을 수 없음");
} catch (InstantiationException e) {
System.out.println("new로 인스턴스 생성 실패");
} catch (IllegalAccessException e) {
System.out.println("new로 인스턴스 생성 불가");
}
new
를 사용해야함. newInstance()
매소드를 사용해도 힙메모리에 인스턴스 생성 가능함.new SendAction();
new
를 사용한 것과 newInstance()
메소드를 사용한 것의 차이점
new를 사용한 것
은 소스 코드에서 인스턴스를 만들 클래스가 이미 결졍됨.newInstance() 메소드를 사용
하면, 프로그램 내부에서 가변적으로 인스턴스를 만들어 클래스 변경 가능함.newInstance()
메소드를 사용하명서 처리해야하는 예외(exception)
InstantiationException
: 클래스가 abstract 이거나 interface인 경우 발생IllegalAccessException
: 클래스 modifier가 인스턴스를 만들수 없는 경우(private) 접근제한자인 경우 예외 발생byte[] bytes = new byte[100];
System.out.print("입력 : ");
int readByteNo = System.in.read(bytes);
System.out.println("readByteNo : " + readByteNo);
String str = new String(bytes, 0, readByteNo-2);
// readByteNo-2 --> 엔터키(\r,\n)제외한 값
System.out.println(str);
read()
메소드의 return 값은 키보드로 읽어진 총 바이트 갯수
\r
\n
)도 포함됨.new String(bytes, 0, readByteNo-2)
에서 readByteNo-2
는 엔터키(\r
\n
)를 제외한 갯수로 -2를 함.
인코딩이란,
: 특정 문자 set으로 코드 변환한 것.
ex) UTF-8, MS949, EUC-KR
- '가'를 유니코드(2byte)에서 utf-8(3byte)로 변환
str.getBytes();
str.getBytes("EUC-KR");
str.getBytes("UTF-8");
디코딩이란,
: 특정문자 set으로 변환된 바이트 배열을 원래 문자로 복구하는 것.
new String(b1);
new String(b2, "EUC-KR");
new String(b3, "UTF-8");
!!! : 자바는 내부적으로 모든 문자를 유니코드(2byte)로 변환해 관리하고 있음.
ex) '가'의 유니코드 값은 '\uAC00'
한글 한 글자는 utf-8은 3byte, euc-kr은 2byte임.
결론, 현재 가장 보편적인 인코딩 방식은 UTF-8을 사용함
(web programing에서도 de facto standard로 인정)
String str = "안녕하세요";
byte[] b1 = str.getBytes();
System.out.println("b1 length :" + b1.length);
String s1 = new String(b1);
System.out.println("s2 : " + s1);
try {
byte[] b2 = str.getBytes("EUC-KR"); // EUC-KR 인코딩(encoding)
System.out.println("b2 length - EUC-KR로 인코딩 :" + b2.length);
String s2 = new String(b2, "UTF-8"); // UTF-8 디코딩(decoding)
System.out.println("s2 - UTF-8로 디코딩 : " + s2);
byte[] b3 = str.getBytes("UTF-8"); // UTF-8 인코딩(encoding)
System.out.println("b3 length - UTF-8로 인코딩 :" + b3.length);
String s3 = new String(b3, "EUC-KR"); // EUC-KR 디코딩(decoding)
System.out.println("s3 - EUC-KR로 디코딩 : " + s3);
} catch (UnsupportedEncodingException e) {
System.out.println("Java에서 지원하지 않는 encoding 방식 Exception 발생");
}
trim()
은 문자열 앞 뒤의 공백을 제거하는 메소드String tel1 = " 02 ";
String tel2 = "123 ";
String tel3 = " 2134 ";
String tel = tel1 + tel2 + tel3;
System.out.println(tel);
System.out.println();
tel = tel1.trim() + tel2.trim() + tel2.trim();
System.out.println(tel);
valueOf()
method는 primitive data type을 문자열로 변환String str1 = String.valueOf(10);
String str2 = String.valueOf(10.5);
String str3 = String.valueOf(false);
System.out.println(str1); // "10"
System.out.println(str2); // "10.5"
System.out.println(str3); // "false"
System.out.println(str1.length()); // 2
System.out.println(str2.length()); // 4
System.out.println(str3.length()); // 5
split()
은 String 클래스의 메소드임.split("&|,|-");
설명&
or ,
or -
로 분할하라는 의미임.String text = "홍길동&이수용,박연수,김자바-최명호";
String[] names = text.split("&|,|-");
for (String name : names) {
System.out.println(name);
}
StringTokenizer(읽어올 문자열, 나눌 문자열);
형식nextToken()
은 메모리에서 해당 데이터를 제거 후 읽어옴.String text = "홍길동/이수홍/박연수";
StringTokenizer st = new StringTokenizer(text, "/");
int countTokens = st.countTokens(); // token으로 나눠진 전체 갯수
for (int i = 0; i < countTokens; i++) {
String token = st.nextToken(); // nextToken()
System.out.println(token);
}
System.out.println();
// 현재 st는 비어있음.
st = new StringTokenizer(text, "/");
// 같은 st를 만드는 이유는
// nextToken()이 힙메모리에 "홍길동/이수홍/박연수"문자열을 모두 버렸기 때문
while (st.hasMoreElements()) {
String token = st.nextToken();
System.out.println(token);
}
!!! : 결과를 가져오고 하나씩 읽어내고 읽어낸 결과는 제거해 메모리를 바로 비우는 형식
-> 오라클(Oracle) 등 table에서 데이터를 읽어오거나, java collection 등 framework에서도 사용함.
!!! : String 문제점 : 새로운 문자열이 생길 때마다, 기존 문자열과 함께 힙메모리에 새로 만들어짐.(사라지지 않음, 프로그램 무거워짐.)
-> StringBuilder
class는 String 클래스의 문제점 해결함.
StringBuilder
클래스가 byte[] 배열을 초기에 넉넉한 크기로 만듦.// new byte[1000];
// --> 내부적으로 StringBuilder 클래스가 byte[] 배열을 초기에 넉넉한 크기로 만듦.
StringBuilder sb = new StringBuilder();
// sb = ""; --> sb는 빈 문자열
sb.append("Java_");
sb.append("Programming study");
//.append()는 문자열 끝부터 입력받은 문자열 넣기.
System.out.println(sb);
sb.insert(4, "2");
// 문자열길이 4번째 "2" 넣기
System.out.println(sb);
sb.setCharAt(4, '6');
// 문자열길이 4번째 '6' char type 넣기
System.out.println(sb);
sb.replace(6, 13, "Book");
// 문자열길이 6번째에서 13번째를 "Book"으로 바꾸기.
System.out.println(sb);
sb.delete(4, 5);
// 문자열길이 4번째에서 5번째를 지우기.
System.out.println(sb);
System.out.println("총문장수 : " + sb.length());
System.out.println(sb.toString());
: 위 예제는 해당하는 pattern이 맞는지 검색하는 프로그램
String regExp = "(02|010)-\\d{3,4}-\\d{4}";
// 전화번호에 관한 regular expression
String data = "010-123-5678";
boolean result = Pattern.matches(regExp, data);
if (result) {
System.out.println("정규식이 일치함");
} else {
System.out.println("정규식이 일치하지 않음");
}
regExp = "\\w+@\\w+\\.\\w+(\\.\\w+)?";
// 이메일 주소에 관한 regular expression
data = "angel@naver.co.kr";
result = Pattern.matches(regExp, data);
if (result) {
System.out.println("정규식이 일치함");
} else {
System.out.println("정규식이 일치하지 않음");
}
100page 문서(문자열)에서 전화번호에 해당하는 모든 것을 추출
정규표현식 "(02|010) - \\d{3,4}-\\d{4}"
설명
(02|010)
-> 02 or 010
-
-> '-'문자열 나옴
\d
-> d는 digit(숫자 0~9)을 의미함(MS windows에서는 \를 \로 표현함.)
{3,4}
-> 연속하는 3자리 문자열이나 4자리 문자열 들어옴, \d{3,4}는 3자리나 4자리 숫자 있음
{4}
-> 연속하는 4자리 문자열 들어옴, \d{4}
는 4자리 숫자 있음
100page 문서(문자열)에서 이메일에 해당하는 모든 것을 추출
"\\w+ @ \\w+ \\. \\w+ (\\. \\w+)?";
설명\w
-> 영어 알파벳 대소문자 들어옴+
-> 1개 이상 있음@
-> '@' 이 있음\.
-> '.'이 있음?
-> 0번 또는 1번있음,(\\.\\w+)
있을 수도 있고 없을 수도 있다는 의미