Java Day 14 여러가지 클래스들
18 Dec 2020 | JavaJava Day 14 여러가지 클래스들
-
String 클래스
- ① 암묵적 객체 생성 : String s1 = “TEST”;
- ② 명시적 객체 생성 : String s2 = new String(“TEST”);
- 무엇이 다를까?
- 1번으로 같은 값을 가진 여러 객체를 생성했다고 하자. 값이 같기 때문에 각각의 객체들은 같은 주소값으로 registry & constant 영역의 값을 참조하고 있다.
- 동일하게 2번으로 여러 객체를 생성했을 경우, 값이 같아도 각각 다른 주소로 heap영역의 값이 담긴 번지수를 참조하고 있다.
- 코드로 확인을 해보자
String s1 = "foo"; String s2 = "foo"; String s3 = new String("foo"); String s4 = new String("foo"); System.out.println(s1==s2); //true System.out.println(s3==s4); //false //문자열 비교 메소드 System.out.println(s3.equals(s4)); //true
- 이처럼 값이 같다하더라도 다른 결과가 나올 수 있다.
- 문자열의 값을 비교하고 싶을때는 equals() 메소드를 활용하자.
- 그 밖의 String 클래스의 메소드들
String str = "java"; System.out.println(str.charAt(3)); //a 출력, 해당 인덱스의 문자 반환 System.out.println(str.length()); //4 출력 System.out.println(str.toUpperCase()); //str을 대문자로 변환, 반대는 toLowerCase() String num = String.valueOf(123); //숫자를 문자열로 변환 System.out.println(str.indexOf('a')); //1 출력, 해당 문자가 위치한 첫번째 인덱스값 System.out.println(str.lastIndexOf('a')); //3 출력, 해당 문자를 뒤에서부터 검색 System.out.println(str.substring(1,3)); //av 출력, 문자열의 시작점과 종료점-1까지 반환
-
StringBuffer, StringBulider 클래스
- String 객체의 문자열은 수정을 할 수 없다. 새로운 값을 더해도 기존의 객체를 수정하는 개념이 아니라 새로운 객체를 만들어 참조하는 것이다. 기존의 객체는 참조가 끊기고 JVM의 Garbage Collector에 의해 수거되어 메모리에서 삭제된다. 그럼 뭐가 문제인가?
- 하나의 문자열객체에 +로 계속 이어붙이게되면 heap영역에 참조할 객체를 계속해서 생성해야하기 때문에 성능면에서 떨어질 수 밖에 없다.
- StringBuffer, StringBulider 클래스는 내부 buffer에 임시로 문자열을 저장해두고 얼마든지 추가,수정,삭제가 가능하다. 주로 문자열의 변경이 잦을때 사용한다.
- 그렇다면 두 클래스의 차이는 무엇일까? 멀티쓰레드 환경에서 synchronized를 지원하느냐이다. 결론적으로 StringBuffer는 멀티쓰레드 환경에서 적합하고 StringBuilder는 싱글쓰레드 환경에서 적합하다. 아직 쓰레드는 배우지 않았으므로 이렇게만 알아두자.
- 두 클래스의 사용법은 동일하므로 여기선 StringBuffer를 사용한다.
/* * 초기값으로 16개의 문자를 저장 할 수 있다 * 숫자를 넣으면 숫자만큼 크기가 늘어난다 * 문자열을 넣으면 문자열을 초기값으로 갖고 +16개의 문자를 더 저장 할 수 있다 * 용량이 부족하면 자동으로 버퍼 크기가 늘어난다 */ StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer(30); StringBuffer sb = new StringBuffer("Hello");
/* * append( Stirng str ) : 문자열 끝에 문자를 붙여준다 * insert( int offset, String str ) : offset index에 문자열을 삽입한다 * delete( int start, int end ) : start부터 end-1의 문자열을 삭제한다 * deleteCharAt( int index ) : 문자열에서 index의 문자를 삭제 * replace( int start, in end, String str ) : start와 end-1의 문자열을 str로 치환 * reverse() : 문자열의 순서를 뒤집는다 * toString() : Buffer가 가지고 있는 문자열을 String형으로 반환 */ StringBuffer sb = new StringBuffer("Hello World!"); sb.append(" I'm foo"); //'Hello World! I'm foo' 출력 sb.delete(17,20); //'Hello World! I'm' 출력 sb.insert(17, "panda"); //'Hello World! I'm panda' 출력 sb.replace(17,22,"limu"); //'Hello World! I'm limu' 출력
-
StringTokenizer 클래스
- java.util 패키지에 포함
- 문자열이 한 종류의 구분자(delimiter)로 연결되어 있을 때, 문자열(token)을 분리
- ex) “2020/01/03” ——> “2020”, “01”, “03”으로 분리
/* * 1. 생성자 * StringTokenizer(String str) : 구분자 미표기시, white space, tab, new line으로 분할 * StringTokenizer(String str, String delimiter) : delimiter로 str을 분할 * StringTokenizer(String str, String delimiter, boolean isAsset) : 분할 할 때 isAsset으로 구분자를 토큰에 넣을지말지 결정 * * 2. 메소드 * hasMoreTokens() : 토큰이 있으면 true, 없으면 false 반환 * countTokens() : 전체 토큰 수 반환 * nextToken() : 토큰을 하나씩 꺼내옴 */ String text1 = "2020/12/18"; String text2 = "안녕 나는 리무야"; //countTokens()를 이용한 방법 StringTokenizer st1 = new StringTokenizer(text1, "/"); int count = st1.countTokens(); for(int i=0; i<count; i++){ String token1 = st1.nextToken(); System.out.println(token1); }//"2020", "12", "18" 출력 //hasMoreTokens()를 이용한 방법 StringTokenizer st2 = new StringTokenizer(text2); while(st2.hasMoreTokens()) { String token2 = st2.nextTokens(); System.out.println(token2); }//"안녕", "나는", "리무야" 출력
- spilt() 메소드와 StringTokenizer의 차이
- split() 메소드는 공백도 count를 하지만 StringTokenizer는 무시한다
- ex) “monkey,rabbit,,fox”의 문자열이 있다고 가정하자
- split을 사용하면 “monkey”, “rabbit”, “”, “fox” 를 반환한다
- 반면, StringTokenizer는 “monkey”, “rabbit”, “fox”를 반환한다
-
Date, Calendar 클래스
- java.util 패키지에 포함
- Date()는 현재 날짜를 영문으로 반환한다
- Calendar 클래스는 추상클래스이므로 new 연산자로 인스턴스를 생성 할 수 없다
/* * 1. Date 클래스 */ Date date = new Date(); String now = date.toString(); System.out.println(now); //영문 날짜 출력 /* * 2. Calendar 클래스 * Calendar.getInstance() 메소드로 Calendar 객체를 불러온다 * YEAR,MONTH,DATE,HOUR,MINUTE 등의 날짜정보를 get() 메소드로 가져온다 * 반대로 set() 메소드로 설정을 할 수도 있다 */ Calendar now = Calendar.getInstance(); int year = now.get(Calendar.YEAR); //년도 int month = now.get(Calendar.MONTH); //월 int date = now.get(Calendar.DATE); //일
-
Vector 클래스
- java.util 패키지에 포함
- Vector 클래스는 객체의 주소값을 저장하는 가변 길이의 배열이다
- 배열의 중간이 비면 뒤에서 땡겨오고 마찬가지로 추가되면 뒤로 한 칸씩 밀린다
class Num { int a; num(int a){ this.a = a; } } //main 함수 Vector vc = new Vector(); vc.add(new Num(1)); vc.add(new Num(2)); vc.add(new Num(3)); vc.add(new Num(4)); vc.add(new Num(5)); vc.add(1, new Num(10)); //index 1에 new Num(10) 저장 for(int i=0; i<vc.size(); i++){ Num number = (Num)vc.elementAt(i); System.out.print(number.a); }//1,10,2,3,4,5 출력
참고 자료
KG아이티뱅크 자바 강의자료