728x90
★ hashCode()
=> 객체의 해시코드를 반환하는 메서드
=> Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
=> equals() 를 오버라이딩 하면 hashCode() 도 오버라이딩 해야 한다.
equsls() 결과가 true인 두 객체의 해시코드는 같아야 한다.( 주소 때문 )
★ clone()
=> 객체 자신의 복사본을 반환한다.
★ getClass()
=> 객체 자신의 클래스 정보를 담고있는 class 인스턴스를 반환
★ equals( Object obj )
=> 문자열 비교는 항상 equals 이용한다.
=> 객체 자신과 객체 obj를 비교한다.
=> Object 클래스의 equals()는 객체의 주소를 비교한다.
★ toString()
=> 원형 :: getClass().getName() + '@' + Integer.toHexString(hashCode())
=> 객체를 문자열로 변환하는 메서드
=> 주로 오버라이딩 한뒤 사용한다.
class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if (v1.equals(v2))
System.out.println("v1과 v2는 같습니다.");
else
System.out.println("v1과 v2는 다릅니다.");
} // main
}
class Value {
int value;
Value(int value) {
this.value = value;
}
public boolean equals( Object obj ) {
//return this == obj :: 주소 비교 , 서로다른 객체는 항상 거짓
// 참조변수의 형변환 전에는 반드시 instanceof 로 확인 해야 한다.
if ( !(obj instanceof Value) ) { return false; }
Value v = (Value)obj; //obj를 Value로 형변환
return this.value == v.value;
//return value == ((Value)obj).value; 변경 가능.
}
}
import java.util.Objects;
class Card {
String kind;
int number;
Card() {
this("SPADE", 1);
}
Card(String kind, int number) {
this.kind = kind;
this.number = number;
}
// public String toString() {
// return "kind: " + kind + ", number: " + number;
// }
public boolean equals(Object obj) {
if(!(obj instanceof Card)) { return false; }
Card c = (Card)obj;
return this.kind.equals(c.kind) && this.number == c.number;
}
public int hashCode() {
return Objects.hash(kind , number);
}
}
class Ex9_4 {
public static void main(String[] args) {
Card c1 = new Card();
Card c2 = new Card();
System.out.println(c1.toString()); :: Card@92282b5d
System.out.println(c2.toString()); :: Card@92282b5d
System.out.println(c1.equals(c2)); :: true
}
}
★ 문자열 초기화
String s = "";
char c = ' ';
★ 문자열 결합
=> + 를 이용한 결합은 성능이 떨어짐
=> join 이용하기
String s = String.join("*" , str1 , "+" , str2) 결과 : str1 * + * str2
String s = String.join("" , str1 , "+" , str2) 결과 : str1 + str2
=> 잦은 변경 또는 결합이 있어야 하는경우 StringBuffer를 이용
★ StringBuilder
=> StringBuffer는 동기화 되어 있다. 멀티 쓰레드에 안전하다.
=> 멀티 쓰레드 프로그램이 아닌경우 불필요한 성능 => StringBuilder 사용
StringBuffer sb = new StringBuffer();
StringBuilder sb = new StringBuilder();
★ String 으로 형변환
=> String s = str + "" ;
=> String s = String.valueOf( str );
=> String s = str.toString();
★ String => int bool ... 등 으로 형변환
=> Integer i2 = Integer.valueOf( String s ); :: 문자열 => 래퍼클래스
=> int i2 = Integer.parseInt( String s ); :: 문자열 -> 기본형
=> boolean i2 = Boolean.parseBoolean( String s );
=> byte i2 = Byte.parseByte( String s );
★ n진법 문자열을 숫자로 변환
=> int i = Integer.praseInt("100" , 2 ); :: 2진수
=> int i = Integer.praseInt("100" , 8 ); :: 8진수
=> int i = Integer.praseInt("100" , 16 ); :: 16진수
=> int i = Integer.praseInt("FF" , 16 ); :: 16진수
★ 오토박싱 , 언박싱
* 기본형과 참조형의 형변환은 불가능 하지만 컴파일러가 형변환을 가능하게 한다.
int => Integer :: 오토박싱 (Integer)i
Integer => int :: 언박싱 valueOf(); intValue();
int i = 5; :: 기본형
Integer obj = new Integer(7); :: 참조형
int sum = i + obj.intValue(); :: 컴파일된 코드
int sum = i + obj ( ok )
★ 형식화 클래스
1. DecimalFormat 숫자 <=> 문자
double number = 1.11;
DecimalFormat df = new DecimalFormat("#.#E0");
a. String result = dr.format(number);
b. Number num = df.parse("1,234,567.89"); :: Number 타입은 모든 숫자의 조상
double d = num.doubleValue(); :: 콤마가 들어가 있어도 가능
2. SimpleDateFormat 날짜, 시간을 다양한 형식으로 표현
Date today = new Date();
SimpleDateFormat df = nes SimpleDateFormat("yyyy-MM-dd");
String result = df.format(today); :: yyyy-MM-dd 형태로 출력
DateFormat df = nes SimpleDateFormat("yyyy년 MM월 dd일");
DateFormat df2 = nes SimpleDateFormat("yyyy/MM/dd");
Date d = df.parse("2021년 11월 11일");
String result = df2.format(d); :: yyyy/MM/dd 로 변경됨
## ===================================================== ##
Date today = new Date();
SimpleDateFormat sdf1, sdf2, sdf3, sdf4;
SimpleDateFormat sdf5, sdf6, sdf7, sdf8, sdf9;
sdf1 = new SimpleDateFormat("yyyy-MM-dd");
sdf2 = new SimpleDateFormat("''yy년 MMM dd일 E요일");
sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
sdf4 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
sdf5 = new SimpleDateFormat("오늘은 올 해의 D번째 날입니다.");
sdf6 = new SimpleDateFormat("오늘은 이 달의 d번째 날입니다.");
sdf7 = new SimpleDateFormat("오늘은 올 해의 w번째 주입니다.");
sdf8 = new SimpleDateFormat("오늘은 이 달의 W번째 주입니다.");
sdf9 = new SimpleDateFormat("오늘은 이 달의 F번째 E요일입니다.");
System.out.println(sdf5.format(today)); // format(Date d)
String( char[] value )
|
char[] c = { 'H' , 'e' , 'l' };
char[] => String :: String s = new String(c); char[] <= String :: char[] c = s.toCharArray(); |
String( StringBuffer buf )
|
StringBuffer sb = new StringBuffer(sb);
String s = new String(sb); |
(동기화 되어있다) 쓰레드에 안전한다.
StringBuffer sb = new StringBuffer(); :: 16개문자를 담을 수 있는 StringBuffer 인스턴스 생성 StringBuffer sb = new StringBuffer(10); :: 10개문자를 담을 수 있는 인스턴스 생성 1.배열은 길이 변경 불가능하여 공간이 부족하면 새로운 배열 생성해야 한다. 따라서 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야 한다. StringBuffer sb = new StringBuffer("abc"); StringBuffer sb2 = sb.append("zz"); // ok 2. equals() 가 오버라이딩 되어 있지 않아서 주소를 비교한다. System.out.println( sb == sb2); :: false System.out.println( sb.equals( sb2) ); :: false String s = sb.toString(); :: String 으로 변환후 비교해야 한다. String s2 = sb2.toString(); System.out.println( sb.equals( sb2) ); :: true |
|
sb. append("qbc"); // 문자열 추가
sb.capacity(); // 버퍼크기를 알려준다. StringBuffer sb = new StringBuffer(10) => 버퍼크기 10 sb.length(); // 문자열 길이 알려준다. sb.charAt(2); // 지정된 위치 index 에 있는 문자 반환 sb.delete( start , end ); // 시작위치 ~ 끝위치 사이 문자 제거( begin ≤ X < end ) sb.deleteCharAt( index ); // 지정된 위치의 문자를 제거한다. sb.insert( position , 11 ); // 11 을 지정된 위치 position 에 추가한다.( int, boolean 등 모두 추가 가능 ) sb.replace( start , end , str ); // ( begin ≤ X < end )사이의 문자를 str 문자열로 변경한다. StringBuffer sb = new StringBuffer("0123456"); > sb.replace( 3, 6 , "AB" ); > 012AB6 sb.reverse(); // 저장된 문자열의 순서를 뒤집기 sb.setCharAt( index , char ); // 지정된 위치의 문자를 주어진 문자로 바꾼다. sb.setLength(10); // 지정된 길이로 문자열 길이를 변경한다, 나머지 공간은 null로 채워진다. "0123 " sb.toString(); // 인스턴스의 문자열을 String으로 반환 sb.substring( start , end ); // 문자열 자르기( begin ≤ X < end ) |
|
char charAt( int index )
|
String s = "Hello";
char c = s.charAt(1); :: e |
int compareTo( String str )
|
문자열str 과 사전순서로 비교하고
같으면0 이전이면 음수, 이후면 양수 반환 int i = "aaa".compareTo("aaa"); :: i = 0 int i2 = "aaa".compareTo("bbb"); :: i2 = -1 int i3 = "bbb".compareTo("aaa"); :: i3 = 1 |
String conat( String str )
|
문자열을 덧붙인다.
String s = str.concat(" world"); |
boolean contains( CharSequence s )
|
문자열 s 가 포함된지 검사
boolean b = s.contains("bc") |
boolean endsWith( String s )
|
지정된 문자열로 끝나는지 검사
boolean b = s.endsWith("txt"); |
boolean startWith( String prefix )
|
주어진 문자열을 prefix로 시작하는지 검사
boolean b = s.startWith(("txt"); |
boolean equalsIgnoreCase( String str )
|
대소문자 구분없이 비교
str.equalsIgnoreCase("hello"); |
int indexOf( str )
|
문자 str이 위치한 index 알려준다
못찾으면 -1 반환, inedx 는 0부터 시작 |
int indexOf( str , int position )
|
str이 위치한곳을 position 부터 확인하여 알려준다.
int idx = str.indexOf( 'e' , 2 ); |
int laseIndexOf( str )
|
str 을 문자열의 오른쪽 끝에서 부터 찾아서 index를 알려준다.
String s = "java.lang.test"; int idx = s.lastIndexOf("."); // 9 |
int length()
|
문자열의 길이 반환
str.length(); |
String replace( char old , char nw )
|
문자열중에 old를 nw로 변환하여 반환
정규표현식 사용이 불가능 String s = str.replace("하" , "호"); |
String replaceAll( String regex , String rep )
|
문자열중에 regex를 rep로 변환하여 반환
정규표현식 사용이 가능 String s = str.replace("[abc]" , "호"); |
String replaceFirst( String regex , String rep )
|
문자열중에 첫번째 것만 regex를 rep로
변환하여 반환 |
String[] split( String regex )
|
문자열을 지정된 분리자로 나누어 배열에 담아 반환
String[] arr = str.split(","); |
String[] split( String regex , int limit )
|
문자열을 지정된 분리자로 나누어 배열에 담아 반환
단, 문자열 전체를 지정된 수로 자른다. String[] arr = str.split("," , 2); |
join
|
배열의 문자열을 char 로 결합
+ 로 문자 결합하는것보다 속도가 빠르다. => String s = str.join( "-" , arr ); => String s = String.join("*" , str1 , "+" , str2) 결과 : str1 * + * str2 |
String substring( int begin )
String substring( int begin , int end) |
시작위치 부터 끝 위치 범위에 포함된 문자열을 얻는다. begin ≤ X < end
|
String toLowerCase()
|
소문자로 변환
String s = str.toLowerCase(); |
String toUpperCase()
|
대문자로 변환
String s = str.toUpperCase(); |
String trim()
|
String s = str.trim();
|
static String valueOf( ..... )
static String valueOf( Object obj ) |
지정된 값을 문자열로 변환하여 반환
String b = String.valueOf( true ); String b = String.valueOf( 100L ); String b = String.valueOf( 'a' ); |
★ Math 클래스
Math.abs( -10.0 );
|
절대값 반환
|
Math.ceil( 10.8 );
|
올림
|
Math.floor( 10.8 );
|
버림
|
Math.max( 9,5 , 9.50001 );
|
두 값중 큰값 반환
|
Math.min( 9,5 , 9.50001 );
|
두 값중 작은값 반환
|
Math.round(1.2);
Math.round( 90.7552 * 100 ) / 100.0 :: 90.76 System.out.printf( "%4.2f " , sum); |
반올림
|
Math.rint( 1.2 );
|
가장 가까운 정수를 double 형태로 반환
1.6 => 2 , 1.5 => 1 |
★ 날짜와 시간
=> java.util.Date
=> java.util.Calendar ( JDK 1.1 )
=> java.time ( JDK 1.8 / 8 )
* Calendar ( 추상클래스 )
Calendar cal = Calendar.getInstance();
int thisYear = cal.get( Calendar.YEAR ); //올해
int lastDayOfMonth = cal.getActualMaximum( Calendar.DATE ); //이달의 마지막날
Calendar date1 = Calendar.getInstance();
date1.set( 2021 , 7 , 15 ); :: 2021년 8월 15일
date1.set( Calendar.YEAR , 2021 );
date1.clear(); :: 모든 필드 초기화 1970년 1월 1일 00:00:00
date1.clear( Calendar.SECOND ); :: 특정필드(초) 를 초기화
date1.add( Calendar.DATE , 1); :: 날짜 +1 , 다른 필드에 영향을 줌(31->1 , month +1)
date1.roll( Calendar.DATE , 1); :: 날짜 +1 , 다른필드에 영향 없음(31->1 , month 유지)
* time
LocalDate currentDate = LocalDate.now();
// 컴퓨터의 현재 날짜 정보를 저장한 LocalDate 객체를 리턴한다. 결과 : 2016-04-01
LocalDate targetDate = LocalDate.of(int year, int month, int dayOfMonth);
// 파라미터로 주어진 날짜 정보를 저장한 LocalDate 객체를 리턴한다. 결과 : 1986-11-22
Calendar
public class CalTest {
:: 두 날짜 차이 비교
:: diff 함수를 쓰면 밀리초 때문에 정확한 계산 불가능
public static void main(String[] args) throws ParseException {
Calendar getToday = Calendar.getInstance();
getToday.setTime(new Date()); //금일 날짜
String s_date = "2020-03-01";
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(s_date);
Calendar cmpDate = Calendar.getInstance();
cmpDate.setTime(date); //특정 일자
long diffSec = (getToday.getTimeInMillis() - cmpDate.getTimeInMillis()) / 1000;
long diffDays = diffSec / (24*60*60); //일자수 차이
System.out.println(diffSec + "초 차이");
System.out.println(diffDays + "일 차이");
}
}
import java.util.*;
class Ex10_5 { // 달력 그리기
public static void main(String[] args) {
if(args.length !=2) {
System.out.println("Usage : java Ex10_5 2019 9");
return;
}
int year = Integer.parseInt(args[0]);
int month = Integer.parseInt(args[1]);
int START_DAY_OF_WEEK = 0;
int END_DAY = 0;
Calendar sDay = Calendar.getInstance(); // 시작일
Calendar eDay = Calendar.getInstance(); // 끝일
// 월의 경우 0부터 11까지의 값을 가지므로 1을 빼주어야 한다.
// 예를 들어, 2019년 11월 1일은 sDay.set(2019, 10, 1);과 같이 해줘야 한다.
sDay.set(year, month-1, 1);
eDay.set(year, month, 1);
// 다음달의 첫날(12월 1일)에서 하루를 빼면 현재달의 마지막 날(11월 30일)이 된다.
eDay.add(Calendar.DATE, -1);
// 첫 번째 요일이 무슨 요일인지 알아낸다.
START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
// eDay에 지정된 날짜를 얻어온다.
END_DAY = eDay.get(Calendar.DATE);
System.out.println(" " + args[0] +"년 " + args[1] +"월");
System.out.println(" SU MO TU WE TH FR SA");
// 해당 월의 1일이 어느 요일인지에 따라서 공백을 출력한다.
// 만일 1일이 수요일이라면 공백을 세 번 찍는다.(일요일부터 시작)
for(int i=1; i < START_DAY_OF_WEEK; i++)
System.out.print(" ");
for(int i=1, n=START_DAY_OF_WEEK ; i <= END_DAY; i++, n++) {
System.out.print((i < 10)? " "+i : " "+i );
if(n%7==0) System.out.println();
}
}
}
package com.fastB.ch2;
import java.util.Calendar;
// 년월일을 입력하면 요일을 알려주는 프로그램
public class YoilTeller {
public static void main(String[] args) {
String year = args[0];
String month = args[1];
String day = args[2];
int yyyy = Integer.parseInt(year);
int mm = Integer.parseInt(month);
int dd = Integer.parseInt(day);
// 작업
Calendar cal = Calendar.getInstance();
cal.set(yyyy, mm-1 , dd);
int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
char yoil = "일월화수목금토".charAt(dayOfWeek-1);
//출력
System.out.println(year + "년 " + month + "월 " + day + "일은");
System.out.println(yoil + "요일입니다.");
}
}
728x90