Archive

Java Day 14 여러가지 클래스들

|

Java Day 14 여러가지 클래스들


  1. 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까지 반환
    


  2. 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' 출력
    


  3. 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”를 반환한다


  4. 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); //일
    


  5. 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 출력
    




참고 자료


이것이자바다

자바프로그래밍100% 실전가이드

KG아이티뱅크 자바 강의자료