JAVA/이론 정리 및 예제

[JAVA/자바] #10_1 기본API / 예제

chaewon 2021. 9. 17. 18:55

String 클래스

  • 문자열값을 변경하지 못하는 불면
  • 수정시 수정된 문자열이 새로 할당되어 새주소를 발생시킨다.
    • 같은 문자열이 있으면 동일한 주소를 가진다.
String str1 = "java";
String str2 = "java";

str1 == str2;
String str3 = new String("java");
str1 != str3;

//수정시 새 주소로 할당되어 참조하게 된다. -> 불변
str1 += "oracle";
 String 
 [ 0x1234 0x0001 ] str1
 [ 0x1234] str2
 [ 0x5678 ] str3
                            String pool
        0x1234       |     “java”
        0x0001       |     “java oracle”
        0x5678
        [  |  |  |  ]
public void stringTest() {
    String s1 = "java";
    String s2 = "java";
    String s3 = new String("java");

    System.out.println("s1과 s2의 주소가 같은지 비교 : " + (s1 == s2));   //true
    System.out.println("s1과 s3의 주소가 같은지 비교 : " + (s1 == s3));   //false

    //값을 비교하기 위해 String 클래스는 Object클래스의 equals()메소드를
    //오버라이딩 해 놓았다.
    System.out.println("s1과 s2의 값이 같은지 비교 : " + (s1.equals(s2)));   //true
    System.out.println("s1과 s3의 값이 같은지 비교 : " + (s1.equals(s3)));   //true

    //String클래스에서는 Object클래스의 hashCode를 오버라이딩 해놓았다.
    //문자열이 같으면 동일한 해쉬코드를 리턴하게 작성하였음
    //동등객체를 동일객체 취급을 하기 위함
    System.out.println("s1의 hashCode : " + (s1.hashCode()));    //3254818
    System.out.println("s2의 hashCode : " + (s2.hashCode()));    //3254818
    /*System.out.println("s3의 hashCode : " + (s3.hashCode()));*///3254818

    s2 += "oracle";

    System.out.println("s1의 해쉬코드 : " + s1.hashCode());      //3254818
    System.out.println("s2의 해쉬코드 : " + s2.hashCode());      //87819808

    //불변 -> 값을 변경하면 새로운 주소 할당
    System.out.println("s1의 주소값과 s2의 비교값이 변경 후에도 같은지 비교 : " + (s1 == s2));

}

 

split

public void splitTest() {
    String str = "java,oracle,JDBC,HTML5,CSS3";

    String[] split = str.split(",");

    System.out.println("분리된 문자열 갯수 split : " + split.length);

    /*for(int i = 0; i < split.length; i++) {
        System.out.println(split[i]);
    }*/

    //배열 또는 컬렉션 사용시 향상된 for문을 사용할 수 있다.
    for(String s : split) {
        System.out.println(s);
    }

    //분리된 문자열을 String배열로 처리하고 싶을 때는 split을 사용하면 되고,
    //분리된 문자열을 객체로 취급하기 위해서는 StringTokenizer 클래스를
    //사용하여 분리한다.
    StringTokenizer stn = new StringTokenizer(str, ",");

    System.out.println("분리된 문자열의 갯수 stn : " + stn.countTokens());

    while(stn.hasMoreTokens()) {
        System.out.println(stn.nextToken()); 
    }

    System.out.println("값을 꺼낸 후 문자열의 갯수 stn : " + stn.countTokens());

}

 

StringBuffer

  • 문자를 자주 바꾸는 경우 사용
  • 쓰레드 safe 기능을 제공한다.(성능저하요인)
String str1 = "java";
StringBuffer sb = new String Bulider("java");

 

StringBuilder

  • 문자를 자주 바꾸는 경우 사용
  • 쓰레드 safe기능을 제공하지 않음
String str1 = "java";
StringBuilder sb = new StringBuilder("java");

sb.oppend("oracle");  //문자를 추가할 수 있다. -> 가변
 String 
 [ 0x1234 ] str1
 [ 0x5678 ] ob

                            String pool
        0x1234       |     “java”
        0x5678
        [  java + oracle  ]
public void stringBuilderTest() {
		//StringBuilder는 문자열을 저장하기 위한 객체이다.
		//문자열 저장소에 저장하는 것이 아닌 객체를 통해 저장을 한다.
		StringBuilder sb = new StringBuilder("java");
		
		System.out.println("sb의 값 : " + sb);
		System.out.println("sb의 hashCode : " + sb.hashCode());
		
		//기존 문자열에 문자열을 추가하는 메소드
		sb.append("oracle");
		System.out.println("sb의 값 : " + sb);
		
		//자주 변경되는 문자열의 경우 String보다 StringBuilder가 더 효율적이다.
		System.out.println("sb의 hashCode : " + sb.hashCode());
		
}

 

StringTokenizer

  • String 클래스에서 제공하는 split()메소드와 같은 기능을 하는 클래스이다.
  • 생성시 전달받은 문자열을 구분자로 나누어 각 토큰에 저장한다
    • 목록객체로 만들어 사용
import java.util.*; 
public class TestStringTokenizer{ 
  public static void main(String[] args){ 
      String str = “AA|BB|CC” 
      //구분자 [AA|BB|CC] 하나당 토큰이라함
      //      ^ 시작위치 
      //nextToken^커서위치
      StringTokenizer st = new StringTokenizer(str, “|”); 
      while(st.hasMoreToken()){
         System.out.println(st.nextToken()); 
      }
  } 
}

 

Wrapper 클래스

오토박싱(AutoBoxing)

  • 기본자료형 → Wrapper클래스 변환
    • heap에 가져다 놓는다
    • Integer클래스의 메소드들을 사용할 수 있다는 장점

오토언박싱(Auto Unboxing)

  • Wrapper클래스 → 기본자료형변환
  • 자동으로 풀어서 기본자료형에 넣어준다

public void boxingTest() {
		//기본 자료형을 객체로 변환하는 것을 boxing한다고 하며
		//객체를 기본 자료형으로 반환하는 것을 unboxing이라고 한다.
		Integer num1 = new Integer(3);        //toString이 오버라이딩 되어 있기때문에 num1 = 3
		Integer num2 = 3;                //오토박싱(autoboxing)처리됨
		
		int num3 = num1;                //오토언박싱(auto unboxing)처리됨        
}

 

String을 기본 자료형으로 바꾸기(파싱)

char 주의

public void parsingTest() {
		//문자열 (String)자료형을 기본자료형으로 변환하는 것을 parsing한다고 함
		byte b = Byte.parseByte("1");
		short s = Short.parseShort("2");
		int i = Integer.parseInt("4");
		long l = Long.parseLong("8");
		float f = Float.parseFloat("0.1");
		double d = Double.parseDouble("9.0");
		boolean b1 = Boolean.parseBoolean("true");
		
		//Character는 parsing 기능을 제공하지 않는다.
		char c = "abc".charAt(0);
}

 

기본자료형을 String으로 바꾸기

public void valueOfTest() {
		//기본 자료형을 문자열 객체로 변환하는 기능을 제공한다.
		//valueOf는 기본 자료형 값을 레퍼클래스 객체 타입으로 변경하는 것이고
		//해당 레퍼 클래스별 toString이라는 메소드로 스트링으로 변환해준다.
		String b = Byte.valueOf((byte)1).toString();        //1을 객체 취급을 하여 사용
		String s = Short.valueOf((short)2).toString();
		String i = Integer.valueOf(4).toString();
		String l = Long.valueOf(8L).toString();
		String f = Float.valueOf(4.0f).toString();
		String d = Double.valueOf(8.0).toString();
		String b1 = Boolean.valueOf(true).toString();
		String c = Character.valueOf('a').toString();
		
		//String클래스의 valuOf를 사용할 수 있다.
		String str = String.valueOf(10);
		
		//문자열 합치기를 이용해 String으로 변환할 수도 있다.
		String str2 = 123 + "";
		
}

 

Date

  • 시스템으로부터 현재 날짜, 시간 정보를 가져와서 다룰 수 있게 만들어진 클래스
  • 생성자 2개만 사용 가능하고 나머지는 deprecated이다.
public class Date
extends java.util.Object
implements Serializable, Cloneable, Comparable<Date>
public void testDate() {
		//Date클래스 기본 생성자와 long형 값을 받는
		//두 개의 생성자 외에는 Deprecated 되어 있다.
		
		//default constructor는 현재 시간에 대한 정보를 가지고 객체를 생성한다.
		Date today = new Date();
		
		System.out.println(today);        //toString 오버라이딩
		
		//1970년 1월 1일 00시 00분 00초 이후로 흐른 시간을 ms단위로 리턴
		System.out.println(today.getTime()); //1555290188670
		
		//Date(long date) 사용하는 방법
		Date time = new Date(1555290188670L);
		
		System.out.println(time/*.getYear() deprecated되어 있는 메소드*/); //아까 출력했던 고정된 시간 값
}

 

Calender

  • Calendar 클래스는 생성자가 protected이기 때문에 new를 통해 객체 생성을 하지 못하고, getInstance()메소드를 통해 객체를 생성한다.
  • GregorianCalendar는 Calendar클래스의 후손 클래스이며, 년, 월, 일, 시, 분, 초 정보를 필드를 이용하여 다룰 수 있다.
  • 상속받아 객체를 구현 또는 후손클래스(GregorianCalendar)를 이용해서 구현
public abstract class Calendar
extends Object
implements Serializable, Cloneable, Comparable<Calendar>
public void testCalendar() {
		//api를 확인해 보면 Calendar클래스는 추상클래스이다.
		//=>객체를 생성하지 못한다.
		//객체를 생성하려면 후손클래스인 GregorianCalender로 객체를 생성하던
		//혹은 getInstance()메소드를 호출해서 객체를 생성해야 한다.
		Calendar c = Calendar.getInstance();
		
		System.out.println(c);
		
		//다형성 적용하여 후손 클래스로 객체 생성
		Calendar gc = new GregorianCalendar();
		
		System.out.println(gc);
		
		//년, 월, 일, 시, 분, 초 등의 정보를 Calendar클래스의 상수로 제공한다.
		//날짜 값을 구하기 위해서는 get이라는 메소드에 상수값을 전달하여
		//날짜를 리턴받아 사용한다.
		//static int형 필드이다.
		System.out.println(Calendar.YEAR);
		System.out.println(Calendar.MONTH);
		System.out.println(Calendar.DATE);
		
		/*System.out.println(c.get(Calendar.YEAR));*/
		
		int year = c.get(Calendar.YEAR);
		//월은 0부터 시작하기 때문에 반드시 +1을 해줘야 한다.
		int month = c.get(Calendar.MONTH) + 1;
		int date = c.get(Calendar.DATE);
		int amPm = c.get(Calendar.AM_PM);
		int hour = c.get(Calendar.HOUR);
		int min = c.get(Calendar.MINUTE);
		int sec = c.get(Calendar.SECOND);
		
		//오전 오후의 경우 0은 오전, 1은 오후를 나타낸다.
		String sAmPm = (amPm == Calendar.AM)?"오전":"오후";
		
		System.out.println(year + "년 "
										+ month + "월 "
										+ date + "일 "
										+ sAmPm + " "
										+ hour + "시 "
										+ min + "분 "
										+ sec + "초 ");
}

 

SimpleDateFormat

  • Date의 날짜, 시간 정보를 원하는 format으로 출력하도록 기능 제공을 하는 클래스이다. Java.text 패키지에 속해 있다.
public void testDateFormat() {
		//특정 날짜값으로 그레고리안캘린더 객체 생성
		//종강일에 대한 Date 객체 생성하여 포맷 출력하기
		int year = 2019;
		int month = 9;
		int day = 1;
		int hour = 15;
		int min = 20;
		int sec = 0;
		
		/*Calendar c 
				= new GregorianCalendar(year, month, day, hour, min, sec);
		long time = c.getTimeInMillis(); //특정날짜기준으로 지난 ms단위
		Date endDay = new Date(time);*/
		
		Date endDay = new Date(new GregorianCalendar(year, month, hour, min, sec).getTimeInMillis());
		
		System.out.println(endDay);
		
		SimpleDateFormat sdf = 
				  new SimpleDateFormat("yyyy-MM-dd E요일 hh시 mm분 ss초");
		
		String fmtToday = sdf.format(endDay);
		
		System.out.println(fmtToday);
}

SimpleDateFormat 패턴