기본 API 클래스

Java

목록 보기
14/26
post-thumbnail

java 8 API Document

1. java.lang java.util 패키지

1-1. java.lang

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

2. Object 클래스

  • 자바의 최상위 부모 클래스
  • 예외 없이 모든 클래스는 Object 클래스를 상속

2-1. 객체 비교(equals())

  • 기본적으로 == 연산자와 동일한 결과를 리턴(번지 비교)

    ▲ 둘다 false가 나옴
    but❗ String 클래스는 equals()를 재정의해서 String 객체간에 물자열을 비교한다

2-2. 객체 해시코드(hashCode())

  • 객체의 해시코드 : 객체를 식별할 하나의 정수값
  • Object의 hashCode()메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴 -> 따라서 개별 객체는 해시코드가 모두 다르다

2-3. 객체 문자정보(toString())

객체의 문자 정보란 객체를 문자열로 표현한 값을 말한다.
근데 객체를 문자열로 표현한건 실제에서 별 필요가 없어서 보통 재정의해서 사용한다.

  • Data클래스는 toString()메소드를 재정의하여 현재 시스템의 날짜와 시간 정보를 리턴
  • String 클래스는 toString()메소드를 재정의해서 저장하고 있는 문자열을 리턴
  • System.out.println(Object) 메소드는 Object의 toString()의 리턴값을 출력한다.
Object obj1 = new Object();
Date obj2 = new Date();
System.out.println(obj1.toString());
System.out.println(obj2.toString());

2-4. 객체 복제 (clone())

= 얕은 복제

2-4-1. 얕은 복제(thin.clone)

  • 단순히 필드 값만 복제(참조 타입 필드는 번지 공유)
  • 복제 객체에서 수정하면 원본 객체도 수정됨✅
  • Object의 clone()메소드는 동일한 필드값을 가진 얕은 복제된 객체를 리턴한다.
    - ja va.lang.Cloneable 인터페이스를 구현한 객체만 복제 가능하다.
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;
	}	
}

2-4-1. 깊은 복제(deep.clone)

  • 참조하고 있는 객체도 복제
  • 깊은 복제 할 경우 예외처리 해야함
  • 복제한 객체에서 수정하면 원본 객체는 수정되지 않음✅
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;
	}
}

2-5. 객체 소멸자(finalize()) ❌

  • 되도록이면 소멸자를 사용하지 않는 것이 좋다.

3. Objects 클래스

3-1. 객체 비교

`Objects.compare(T a,T b, Comparator c)) {

public intergace Comparetor<T> {
int compare(T a, T b)
}

3-2. 동등비교(equals()와 deepEquals())

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

  • 배열일 경우 deepEquals()를 이용✅
Objects.equals(o1, o2);
Objects.deep nequals(o1, o2);

equals가 true면 hash코드도 true로 하는게 규칙! 둘 중 하나를 오버라이딩하면 다른 하나도 오버라이딩 해야한다는 뜻✅

3-3. 해시코드 생성(hash(), hashCode())

Objects.hash(Object...values)

  • 객체의 주소를 int로 변환해서 반환
  • 해시코드 == 객체의 지문이라고도 함
  • equals()를 오버라이딩 하면, hashCode()도 오버라이딩 해야한다✅
    왜? equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문.
  • hashCode()는 단순히 해시코드를 리턴하는 역할만 함. 중요한건 hash()메소드. 이것을 어떻게 이용하는지를 잘 알아야합니다.
  • hash()는 매개값으로 여러 값을 가질 수 있다. 이 여러 값들을 배열로 만들어서 하나의 해시코드로 리턴한다.
  • 매개값으로 주어진 값들을 이용해서 해시코드를 생성하는 역할을 한다.
  • Arrays.hashCode(Object[])를 호출해서 해시코드를 얻어 리턴한다.
@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;
  } } }

3-4. 널 여부 조사(inNull(), nonNull(),requireNonNull())


obj가 null이 아니면 그 값을 리턴한다 ▲

3-5. 객체 문자정보(toString())

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

여기서 두 번째 꺼가 중요한데, 저거는 Object가 널이면 nullDefault를 리턴한다.

4.String 클래스

String 클래스 = 데이터(char[]) + 메서드(문자열 관련)

  • 내용을 변경할 수 없는 불변 클래스
String a = "a";
String b = "b";
a = a + b;

a가 바뀐게 아니라, ab라는 아예 새로운 객체가 만들어짐(불변 즉 못 바꾸니까 아예 새로운걸 만드는거)
문자열의 결합이나 변경이 잦다면, 내용을 변경 가능한 stringBuffer를 사용. ex)반복문

4-1. 문자열 비교

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");

  • 같은 내용의 문자열 리터럴은 하나만 만들어진다.

4-2. 빈 문자열("")

String str = "";

  • 크기가 0인 char형 배열을 저장하는 문자열
char[] chArr = new char[0];		//길이가 0인 char배열
int[] iArr = {};				//길이가0인 int배열
  • 문자(char)와 문자열(String)의 초기화
String s = ::;
char c = '  ';

4-3. string 관련 메소드들 정리


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

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

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


4-4. join()과 StringJoiner

  • join()은 여러 문자열 사이에 구분자를 넣어서 결합한다.
 string animals = "dog,cat,bear";
 String [] arr = animals.split(",");
 String str = String.join("-",arr);
 System.out.println(str);		//dog-cat-bear

보통 문자열 결합할 때 string( + + + + ...) 이렇게 계속 결합하면 계속 새로운 객체가 만들어지니까...
만약 결합할 일이 많으면 그냥 join()으로 하는 것도 생각해보기 바랍니다.
평소에는 별 상관 없어요.

4-5. 숫자를 문자열로 바꾸는 방법 두 가지

int i = 100;
String str1 = i + "";
String str = String.valuOf(i);

2번이 더 빠르지만 여러분들은 웬만하면 간결하게 1번으로 하세요.

4-6. 문자열을 숫자로 바꾸는 방법

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");

5.StringBuffer클래스

append 하는 등 문자열 수정 가능

StringBuffer sb = new StringBuffer("abc");
sb.append("123");
abc123
  • 베열은 길이 변경 불가, 공간이 부족하면 새로운 배열 생성해야

    StringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야


    sb2나 원래 객체 sb 똑같이 append됨
    sb.append("123").append("zz");가 가능하다는 것.
  • StringBuffer는 equals()가 오버라이딩 되어 있지 않다(내용비교❌주소비교⭕)✅ 주의하세요.
    내용이 같아도 false
  • StringBuffer의 생성자와 메서드

    2) 길이가 n인 배열이 만들어진다


6.StringBuilder 클래스

  • StringBuffer와 똑같다. 다른점은 동기화가 안 돼있다는 점.
  • 동기화 되어있다란? : 멀티 스레드에 안전
  • 멀티스레드 프로그램이 아닌 경우, 동기화는 불필요한 성능저하를 일으키므로 StringBuffer 대신 StringBuilder를 사용하면 성능 향상

7. Math클래스

  • 수학관련 static메서드의 집합
    ▼round()로 원하는 소수점 아래 세 번쨰 자리에서 반올림하기
  • Math 클래스의 메서드

8. wrapper(래퍼) 클래스

  • 8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스
  • 그래서 각 기본형과 1:1로 매칭. 8개 존재.
  • 객체 지향 언어에서는 원래 모든 것이 객체여야 하는데...객체형이 아니라 기본형이 있으니까..그거 때문에 생긴 것...?


    intValue() longValue() floatValue() doubleValue() : 각 객체를 int long float double로 변환시켜줌.

8-1. Number클래스

  • 모든 숫자 래퍼클래스의 조상

BigInteger : 아주 큰 정수 / BigDecimal 아주 큰 실수

  • 문자를 숫자로 변환하는 세가지
  • 래퍼 클래스를 문자열로 바꾸려면? toString() 쓰면 돼요.

8-2. 오토박싱, 언박싱

  • 오토박싱 : 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로 해도 됨. 컴파일러가 자동으로 오토박싱 언박싱 해줌.

9.date 클래스와 calender 클래스


date -> Calenger -> time 패키지로 옮겨가는 중. 여러분은 time패키지 쓰세요. 자바의 정석 3판 보세요.

9-1. Calender 클래스

  • 추상클래스여서 객체 생성 불가
  • 추상클래스이므로 getInstance()를 통해 구현된 객체를 얻어야한다.
Calendar cal = new Calendar();		//에러! 추상클래스는 인스턴스를 구현할 수 없다.
Calendar cal = Calendar.getInstance();	>>Ok


▲이렇게는 하지 마시고요. 서양력 불교력 일본력 중 하나로 바꿀 때 다시 바꿔야하니까.

  • 예제1) get으로 날짜와 시간 필드 가져오기 - int get(int field)
//현재 날짜와 시간으로 셋팅
Calendat cal = Calendar.getInstance();
//몇년도인지 알아냄
int thisYear = cal.get(Calendar.YEAR();
이 달의 마지막 날(getAcualMaximum 메서드 안에 () 넣기.
int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE);
  • YEAR 처럼 쓸 수 있는 필드들(세번째 행에 '일' 아니고 그 해 시작부터 지금까지 몇번째 주인지

    ▲🍓조심! 월은 0월부터 시작이니 +1해서 생각할 것

9-1-1. set()으로 날짜와 시간지정하기

9-1-2. 두 날짜의 차이 구하기

getTimeInMillis()를 사용하면 됨.

time.getTimeInMillis() - time1.getTimeInMillis()Math.abs(time.getTimeInMillis() - time1.getTimeInMillis())
절대값으로 바꾼다.

9-1-3. clear()는 Calendar객체의 모든 필드를 초기화

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를 해서 초기화해야 함! 안 그러면 부정확함!

  • clear(int field)는 Calender객체의 특정 필드를 초기화
dt.clear(Calendar.SECOND);
dt.clear(Calendar.MINUTE);
dt.clear(Calendar.HOUR_OF_DAY);
dt.clear(Calendar.HOUR);

9-1-4 add(), roll() 필드값을 증가 또는 감소

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);

9-2. date 클래스

  • Date의 메서드는 대부분 deprecated되었지만 여전히 사용되긴 함

10. 형식화 클래스

  • java.text패키지의 DecimalFormat, SimpleDateFormat
  • 숫자와 날짜를 원하는 형식으로 쉽게 출력 가능(숫자,날짜 -> 형식 문자열)
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

10-1. DecimalFormat

  • 숫자를 형식화할 떄 사용(숫자->형식 문자열)
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()는 콤마(,)가 포함된 문자열을 숫자로 변환 못함

11. SimpleDateFormat

  • 날짜와 시간을 다양한 형식으로 출력할 수 있게 해준다.
  • 특정 형식으로 되어 있는 문자열에서 날짜와 시간을 뽑아낼 수도 있다.

0개의 댓글