String 클래스
- 문자열값을 변경하지 못하는 불면
- 수정시 수정된 문자열이 새로 할당되어 새주소를 발생시킨다.
- 같은 문자열이 있으면 동일한 주소를 가진다.
String str1 = "java";
String str2 = "java";
str1 == str2;
String str3 = new String("java");
str1 != str3;
//수정시 새 주소로 할당되어 참조하게 된다. -> 불변
str1 += "oracle";
String [ [ 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을 기본 자료형으로 바꾸기(파싱)
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);
}
'JAVA > 이론 정리 및 예제' 카테고리의 다른 글
[JAVA/자바] #7_2 날짜/시간 처리 실습문제 (0) | 2021.09.17 |
---|---|
[JAVA/자바] #9_1 다형성 / 예제 (0) | 2021.09.17 |
[JAVA/자바] #8_1 상속 / 예제 (0) | 2021.09.17 |
[JAVA/자바] #6_5 메소드(method)/ 예제 (0) | 2021.09.14 |
[JAVA/자바] #6_4 생성자(constructor) / 예제 (0) | 2021.09.14 |