우선 hashCode()가 리턴하는 정수값이 같은지를 확인하고, 그 다음 equals() 메소드가 true를 리턴하는지를 확인해서 동등 객체임을 판단한다.
StringBuilder -> thread-not safe 메모리가 가볍다, 수행시간 짧다.
StringBuffer -> thread-safe 메모리 무겁다, 수행시간 길다.
thread 상황이 아니면 StringBuilder / thread 상황이면 StringBuffer
1️⃣ new String("") x 메모리 낭비가 심함, literal로 써야 재사용 가능
2️⃣ String + String -> 합쳐진 String가 생성, 앞에 String들 garbage가 됨
StringBuilder.append() - 문자열을 끝에 추가
StringTokenizer.hasMoreTokens() - 남아 있는 문자열이 있는지 여부
StringTokenizer.nextToken() - 문자열을 하나씩 가져옴
박싱 - 기본 타입의 값을 포장 객체로 만드는 과정
언박싱 - 포장 객체에서 기본 타입의 값을 얻어내는 과정
Integer obj = 100; // 박싱
int value = obj; // 언박싱
포장 객체의 효율적 사용을 위해 다음 범위의 값을 갖는 포장 객체는 공유된다. 이 범위의 값을 갖는 포장 객체는 ==와 != 연산자로 비교할 수 있지만, 내부 값을 비교하는 것이 아니라 객체 번지를 비교한다는 것을 알아야 한다.
타입--------------------값의 범위
boolean----------------true, false
char-------------------/u0000~/u007f
byte, short, int------- -128 ~ 127
Math.
절대값 abs
올림값 ceil
버림값 floor
최대값 max
최소값 min
랜덤값 random
반올림값 round
LocalDateTime
제네릭이란 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타입으로 대체시키는 기능
사용 이유? 제네릭은 여러 종류의 데이터 유형을 지원하기 위해 프로그래밍 언어에서 사용됩니다. 이를 통해 코드를 재사용하고 일반화할 수 있으며, 타입 안전성을 유지할 수 있습니다. 제네릭을 사용하면 코드의 유연성과 확장성이 향상되고, 더 안정적인 소프트웨어를 개발할 수 있습니다.