
import 없이 사용할 수 있다.
Object 클래스는 자바 클래스의 최상위 클래스로 사용



객체의 문자 정보란 객체를 문자열로 표현한 값을 말한다.
근데 객체를 문자열로 표현한건 실제에서 별 필요가 없어서 보통 재정의해서 사용한다.
Object obj1 = new Object();
Date obj2 = new Date();
System.out.println(obj1.toString());
System.out.println(obj2.toString());
= 얕은 복제

public class Member implements Cloneable {
private String id;
private String name;
private String password;
private int age;
private boolean adult;
public Member(String id, String name, String password, int age, boolean adult) {
this.id = id;
this.name = name;
this.password = password;
this.age = age;
this.adult = adult;
}
public Member getMember() {
Member cloned = null;
try {
cloned = (Member) this.clone(); //clone()으로는 Object 타입이 리턴됨
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return cloned;
}
}

public class Member {
public String name;
public int age;
public int[] scores; //배열이나 클래스타입 변수는 얕은 복제 할 경우 번지만 복사됨.
public Car car;
public Member(String name, int age, int[] scores, Car car) {
this.name = name;
this.age = age;
this.scores = scores;
this.car = car;
}
protected Object clone() throws CloneNotSupportedException {
Member cloned = (Member) clone();
cloned.scores = Arrays.copyOf(this.scores, this.scores.length);
cloned.car = new Car(this.car.model);
return cloned;
}
public Member getMember() {
Member cloned = null;
try {
cloned = (Member) clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return cloned;
}
}

`Objects.compare(T a,T b, Comparator c)) {
public intergace Comparetor<T> {
int compare(T a, T b)
}

두 객체의 동등을 비교한다.

Objects.equals(o1, o2);
Objects.deep nequals(o1, o2);
equals가 true면 hash코드도 true로 하는게 규칙! 둘 중 하나를 오버라이딩하면 다른 하나도 오버라이딩 해야한다는 뜻✅
Objects.hash(Object...values)
객체의 지문이라고도 함@Override
public int hashCode() {
return Objects.hash(field1, field2, field3);
}
public class hashCodeExample {
public static void main(String[] args) {
}
static class Student {
int sno;
String name;
Student(int sno, String name) {
this.sno = sno;
this.name = name;
}
@Override
public int hashCode() {
return Objects.hash(sno, name);
}
//동등객체인지 검사
public boolean equals(Object obj) {
if(obj intstanceof Student) {
Student s = (Student) obj;
if(s.sno==this.sno) {
if(s.name.equals(this.name)) {
return true;
}
}
}
return false;
} } }

obj가 null이 아니면 그 값을 리턴한다 ▲
객체의 문자 정보를 리턴한다.
return getClass().getName()+"@"+Integer.toHexString(hashCode());
근데 보통 이런 의미 없는 정보보다는, 오버라이딩(재정의)해서 변수들을 return하게 하는 등으로 사용.

여기서 두 번째 꺼가 중요한데, 저거는 Object가 널이면 nullDefault를 리턴한다.
String 클래스 = 데이터(char[]) + 메서드(문자열 관련)
불변 클래스String a = "a";
String b = "b";
a = a + b;
a가 바뀐게 아니라, ab라는 아예 새로운 객체가 만들어짐(불변 즉 못 바꾸니까 아예 새로운걸 만드는거)
문자열의 결합이나 변경이 잦다면, 내용을 변경 가능한 stringBuffer를 사용. ex)반복문
String str = "abc"와 String str = new String("abc")의 비교
String str1 = "abc";
String str2 = "abc";
string str 3 = new String("abc");
string str 4 = new String("abc");


String str = "";
char[] chArr = new char[0]; //길이가 0인 char배열
int[] iArr = {}; //길이가0인 int배열
String s = ::;
char c = ' ';

오른쪽 처럼 하면 새로운 객체가 계속 만들어지니까 실무에서는 왼쪽처럼 쓰세요.

1) 안 써요, 실무에서.
2) char 배열을 스트링으로 바꿀 떄
3) StringBuffer를 String으로 바꿀 때 쓰는 생성자
4)
5) 첫번째꺼부터 비교. 첫번쨰꺼가 같으면 두번째꺼를 비교. 두번째꺼가 같으면 세번째꺼를 비교. 보통 정렬할 때 사용함

1)
2)
3) 반대는 startswith(String ____)
4)
5)



string animals = "dog,cat,bear";
String [] arr = animals.split(",");
String str = String.join("-",arr);
System.out.println(str); //dog-cat-bear
보통 문자열 결합할 때 string( + + + + ...) 이렇게 계속 결합하면 계속 새로운 객체가 만들어지니까...
만약 결합할 일이 많으면 그냥 join()으로 하는 것도 생각해보기 바랍니다.
평소에는 별 상관 없어요.
int i = 100;
String str1 = i + "";
String str = String.valuOf(i);
2번이 더 빠르지만 여러분들은 웬만하면 간결하게 1번으로 하세요.
Integer.parasInt()
Integer.valueOf()
둘 중 편한거 쓰세요. 보통 2를 쓰긴 함(왜? 문자->숫자, 숫자->문자 똑같이 다 되니까)
"100"을 숫자 100으로 변환하는 방법1
int i = Integer.paraseInt("100");
"100"을 100으로 변환하는 방법2
int i2 = Integer.valueOf("100");
원래는 반환 타입이 Integer
integer i2 = Integer.valueOf("100");

append 하는 등 문자열 수정 가능
StringBuffer sb = new StringBuffer("abc");
sb.append("123");
abc123
공간이 부족하면 새로운 배열 생성해야✅


sb.append("123").append("zz");가 가능하다는 것.




동기화 되어있다란? : 멀티 스레드에 안전StringBuffer 대신 StringBuilder를 사용하면 성능 향상




intValue() longValue() floatValue() doubleValue() : 각 객체를 int long float double로 변환시켜줌.
BigInteger : 아주 큰 정수 / BigDecimal 아주 큰 실수

toString() 쓰면 돼요.
오토박싱 : int를 Integer로 자동으로 바꿔주는 것언박싱 : Integer를 int로 바꿔주는 것int i =5;
Integer iObj = new Integer(7);
int sum = i + iObj;
컴파일 후 코드(참조형->기본int형으로 자동으로 언박싱해줌)
nt i =5;
Integer iObj = new Integer(7);
int sum = i + iObj.intValue();
예) 오토박싱
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(100)); //원래는 이렇게 해야함. list에는 객체만 추가가능
list.add(100); //근데 이렇게 자동으로 형변환 가능
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(100);
int i = list.get(0).intValue(); //intValue()로 형변환. 원래라면 이렇게 해야함.
int i = list.get(0); //자동 타입 변환

원래는 Integer.valueOf() 해야되는데 그냥 (Integer)i로 해도 됨. 컴파일러가 자동으로 오토박싱 언박싱 해줌.

date -> Calenger -> time 패키지로 옮겨가는 중. 여러분은 time패키지 쓰세요. 자바의 정석 3판 보세요.
getInstance()를 통해 구현된 객체를 얻어야한다.Calendar cal = new Calendar(); //에러! 추상클래스는 인스턴스를 구현할 수 없다.
Calendar cal = Calendar.getInstance(); >>Ok

▲이렇게는 하지 마시고요. 서양력 불교력 일본력 중 하나로 바꿀 때 다시 바꿔야하니까.
//현재 날짜와 시간으로 셋팅
Calendat cal = Calendar.getInstance();
//몇년도인지 알아냄
int thisYear = cal.get(Calendar.YEAR();
이 달의 마지막 날(getAcualMaximum 메서드 안에 () 넣기.
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE);
그 해 시작부터 지금까지 몇번째 주인지

getTimeInMillis()를 사용하면 됨.
time.getTimeInMillis() - time1.getTimeInMillis()
후
Math.abs(time.getTimeInMillis() - time1.getTimeInMillis())
절대값으로 바꾼다.
Calendar dt = Calendar.getInstance();
System.out.println(new Date(dt.getTimeInMillis()));
dt.clear(); //모든 필드를 초기화
System.out.println(new Date(dt.getTimeInMillis()));
초기화하면 1970년 1월 1일 00:00:00
Calendar dt = Calendar.getInstance(); 하고 나서
set 메서드 쓰기 전에 clear를 해서 초기화해야 함! 안 그러면 부정확함!
dt.clear(Calendar.SECOND);
dt.clear(Calendar.MINUTE);
dt.clear(Calendar.HOUR_OF_DAY);
dt.clear(Calendar.HOUR);
get():읽기
clear():초기화
set():값 세팅
add(): 특정 필드의 값을 증가 또는 감소(다른 필드에 영향⭕)
Calendar date = Calendar.getInstance();
date.clear(); //모든 필드 초기화
date.set(2020, 7, 31); //2020년 8월 31일로 설정
date.add(Calender.DATE,1); //날짜(DATE)에서 1을 더한다
date.add(Calender.MONTH,-8); //월에서 8을 뺀다
roll()은 특정필드의 값을 증가 또는 감소(다른 필드에 영향❌)
date.set(2020, 7, 31);
date.roll(Calender.DATE, 1);
date.roll(Calender.MONTH, -8);
double number = 1234567.89;
DecimalFormat df = new DecimalFormat("3.#Eo");
String result = df.format(number);
DecimalFormat df = new DecimalFormat("3,###.##");
Number num = df.parse("1,234,567.89");
double d = num.doubleValue(); //1234567.89
double number = 1234567.89;
DecimalFormat df = new DecimalFormat("3.#Eo");
String result = df.format(number);


DecimalFormat df = new DecimalFormat("3,###.##");
Number num = df.parse("1,234,567.89");
double d = num.doubleValue(); //1234567.89
외울 필요 없고 이 코드 가져다 쓰면 돼요. '패턴' 부분만 수정해서 쓰세요.
✅[참고] Integer.parseint()는 콤마(,)가 포함된 문자열을 숫자로 변환 못함


