API란, Application Programming Interface를 의미한다.
String & StringBuilder
String : 불변성. immutable 한 특성. -,+ 연산시 해당 리터럴을 변경하는 것이 아닌 새로운 리터럴 생성
StringBuilder : mutable 한 특성. 멀티쓰레드 동기화 미지원. 속도 빠름
StringBuffer : mutable 한 특성. 멀티쓰레드 동기화 지원. 속도 느림
이 개념은 실제로 저번 테스트에서 나왔었다.
String s1="java";
String s2="java";
String s3=new String("java");
String s4=new String("java");
System.out.println(s1==s2);//true
System.out.println(s2==s3);//false
System.out.println(s3==s4);//false
System.out.println(s1.equals(s2));//true
System.out.println(s2.equals(s3));//true
System.out.println(s3.equals(s4));//true
일반 String형은 생성될 경우, String Literal Pool에 등록되어 관리된다. 값 변경 불가능
S1,S2는 다음과 같이 주소를 가르키고, S3와 S4는 new 선언으로 다른 곳의 주소를 참조한다.
문자로는 그대로 "java"이나, S3, S4는 new String("java")라는 방법으로 만들었기 때문에
== 는 false, equals와 hashCode에서는 true로 나온다.
*StringBuffer와 Builder는 동기화 차이와 속도차이만 존재하므로 Builder만 알아보자.
StringBuilder sb=new StringBuilder("java");
System.out.println(sb.hashCode());//1130478920
sb.append("oracle");
System.out.println(sb.hashCode());//1130478920 -> 바뀌지않았음.
System.out.println(sb);
StringBuilder의 경우, Heap영역에 저장이 되고 값이 변경 가능하다.
저장된 "java"에 .append()를 사용하여 "oracle"을 추가한 경우, 처음 만든 "java"에 oracle이 더해진다.
해시코드를 확인해보면 바뀌지 않아 그 값 자체가 바뀌었음을 알 수 있다.
=> 메모리 낭비를 막을 수 있다.
CSV(Comma Seperated Value) 데이터처리
1. String의 split 사용하기
2. StringTokenizer 사용하기
1. String split
data = "apple,banana cream,,,,desert egg";
String[] arr=data.split("[, ]");
for(int i=0;i<arr.length;i++){
System.out.println("["+arr[i]+"]");
}
Split은 " "큰 따옴표 안에 들어가는 문자열만 구분자로 사용한다.
[ ] 안에 쓸 경우, []는 하나의 문자를 의미해서 "[, ]"의 경우 쉼표 또는 공백을 구분자로 사용한다.
위와 같은 코드가 있을 경우, 다음과 같이 프린트 한다.
[apple]
[banana]
[cream]
[]
[]
[]
[]
[]
[desert]
[egg]
즉 , 하나하나를 다 구분자로 사용해서 빈칸인 문자열도 만들어낸다.
2. StringTokenizer
StringTokenizer st=new StringTokenizer(data, ", ");
System.out.println(st.countTokens());//토큰갯수 처음에는 5개
while(st.hasMoreTokens()) {//토큰이 더 있나체크
String token=st.nextToken();//다음토큰 명명
System.out.println("["+token+"]");
}
System.out.println(st.countTokens());//하나씩 읽으면서 토큰 제거함.
StringTokenizer는 import java.util.StringTokenizer; 를 사용한다.
delimiter구분자(두번째 인자)를 사용하여 문자단위로 처리한다.
StringTokenizer st = new StringTokenizer(처리할문자열, "처리방식");
처리 방식에는 split과 마찬가지로 ",."로 할 경우 쉼표와 마침표 모두 구분인자로 처리한다.
token이 빈문자열인 경우에는 버리고 반복문을 종료한다.
토큰은 읽으면서 하나씩 제거된다.
Wrapper class
기본형을 감싼 참조형 클래스
java.lang.*; 패키지
* byte : Byte
* short : Short
* int : Integer
* long : Long
* float : Float
* double : Double
* boolean : Boolean
* char : Character
- 기본형이 아닌 참조형으로만 처리가 가능한 경우.
- 기본형(값) 이외에 부가기능을 이용하려는 경우.
boxing / unboxing (둘다 자동)
- 기본형 -> wrapper (박싱)
- wrapper -> 기본형 (언박싱)
//box / unboxing
int n=10;
Integer nNum=n; //int -> Integer
// Integer _nNum=Integer.valueOf(n); //boxing처리 (자동)
int m=nNum;//Integer -> int
// int _m=nNum.intValue(); //unboxing처리(자동)
int x=10;
Integer y=20; //그냥 기본형처럼 쓰면됨.
System.out.println(x+y);//int + Integer -> x+y.intValue()
// <> Generics 타입제한 - 기본형을 사용할 수 없다.
ArrayList<Integer> list = new ArrayList<Integer>();
// ArrayList<int> list = new ArrayList<int>(); // 오류발생
int형과 Integer형의 자유자재로의 변환이 가능하고, < >에서만 기본형을 못쓴다고 기억하면 될 듯 하다.
Calender
지금 시각의 정보를 얻는 두가지 방법
1. Calender.getInstance()
2. new GregorianCalendar()
System.out.println(today);
System.out.println(today.get(Calendar.YEAR));
System.out.println(today.get(Calendar.MONTH)+1);//0월~11월 +1
System.out.println(today.get(Calendar.DAY_OF_MONTH));
System.out.println(today.get(Calendar.DAY_OF_WEEK));// 일(1) ~ 토(7)
System.out.println(DAY_OF_WEEK[today.get(Calendar.DAY_OF_WEEK)-1]);
System.out.println(today.get(Calendar.AM_PM)==0?"오전":"오후");
System.out.println(today.get(Calendar.HOUR));
System.out.println(today.get(Calendar.HOUR_OF_DAY));
System.out.println(today.get(Calendar.MINUTE));
System.out.println(today.get(Calendar.SECOND));
특정 시각 정보를 가진 객체 만드는 방법 두가지
1. setter -> 현재 만든 시간으로 세팅하지 않은 시간정보가 세팅됨
2. 생성자 -> 처리되지 않은 시간정보는 0으로 나옴
Calendar cal1=Calendar.getInstance();//현재시각 정보를 만든 객체이므로
cal1.set(2022, 3-1, 26);// 시분초를 세팅 안할경우 현재 만든 시간으로 만들어짐
System.out.println(cal1);
Calendar cal2 = new GregorianCalendar(2022,3-1,29);
System.out.println(cal2);
//처리되지않은 시,분,초 -> 0으로 나온다.
d-day구하기
//미래날짜의 밀리초 - 과거날짜의 밀리초 -> 일단위 환산
long ddayMillis = cal2.getTimeInMillis();
long nowMillis = Calendar.getInstance().getTimeInMillis();
long millis = ddayMillis-nowMillis;
double diff = (double)millis / 1000/60/60/24; //1000(초)/60분/60시간/24하루
System.out.printf("%s - %s = %s , %s일%n",ddayMillis,nowMillis,millis,diff);
System.out.printf("오늘은 D-%s일 입니다.",(int)Math.ceil(diff));
Calendar <----> Date 바꾸기
Date 에는 두가지 사용 가능한 메소드가 존재.
Date(), Date(millis:long)
//Calendar to Date
Calendar cal = new GregorianCalendar();
Date date = new Date(cal.getTimeInMillis());
System.out.println(date);
//Date to Calendar
Date ddate = new Date();
Calendar ccal=Calendar.getInstance();
ccal.setTime(ddate);
System.out.println(ccal);
포매팅 - 시간
1999년 8월 8일
1999/08/08
90-08-08 등 방법이 너무 많음.
-> 형식을 직접 지정한다.
private void test1() throws ParseException {
//2022-03-27 11:50
Calendar cal = new GregorianCalendar(2022, 3-1,27,11,50);
Date date=new Date(cal.getTimeInMillis());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd E요일 hh:mm:ss");
String formatStr = sdf.format(date);
System.out.println(formatStr);
String data="2022-03-27 (일) 오전 11:50:00";
date = sdf.parse(data);
System.out.println(date);
}
포매팅 - 숫자
-소수점이하처리
-세자리 콤마로 그룹화하기
# ) 해당 자리가 공란이면 생략 , 0 ) 해당 자리가 공란이면 0으로 채움
private void test2() throws ParseException {
double n =123.456;
DecimalFormat df = new DecimalFormat("0.##");
String result=df.format(n);
System.out.println(result);
//가격 등 세자리 콤마찍기
df.applyPattern("#,###");
System.out.println(df.format(1234567890));
String data="1,234,567,890";
Number num=df.parse(data);
long lnum=num.longValue();
System.out.println(lnum+123);
}
+) SimpleDateFormat 약어 M:월 m:분
개인적으로 StringTokenizer가 제일어려운듯 ㅠ
근데 백준에서 많이 쓰이는거같으니 적응해둬야겠다
갠적으로, 이 포스팅이 코테에 제일 중요하다고 생각한다 ㅋㅋㅋ
문자열은 꼭 나오는 문제이기때문에..!!숙지 또 숙지!