API 모든 함수를 외우지는 말고 필요한 함수를 그 때 그 때 찾아서 사용하면 된다.
- String 관련 클래스
- Wrapper 클래스
- 날짜 관련 클래스
- Format 관련 클래스
- equals ( )
- hashCode ( )
- join ( )
- split ( )
API 란 Application Programming Interface 의 약어로 프로그래밍 언어가 이미 가지고있는 클래스와 기능 및 기술을 사용자가 쉽게 사용할 수 있도록 제공하는 것이다.
String 은 사용 빈도가 높기 때문에 new 뿐만 아니라 바로 값을 할당할 수도 있는데 이를 문자열 리터럴이라고 한다. 즉 별도의 리터럴 표기법을 부여하여 쉽게 Heap 영역에 객체를 생성한다.
s2 와 s3 는 같은 abc 문자열을 저장하고 같은 공간을 가리키고 있다가 s3 의 내용을 abcdef 로 변경하면 새로운 공간이 할당되고 그 곳을 가리킨다.
new 를 통해 문자열 객체를 생성하면 메모리의 Heap 영역에 할당되며 리터럴을 이용해 생성하면 힙 영역 중 String Constant Pool 영역에 할당된다.
리터럴을 사용해 동일한 문자열을 생성하면 동일한 객체를 바라보게 되지만 new 를 통해 생성할 경우 서로 다른 객체를 만들고 바라본다.
String 은 한 번 저장된 값은 변할 수 없다는 불변성 특징 때문에
String 값을 변경할 경우 기존 객체가 변경되는 것이 아닌 새 객체를 생성해서 참조하게 된다.
String s1 = new String("abc"); // new 연산자를 이용한 객체 생성
String s2 = "abc"; // 문자열 리터럴 생성
문자열 값을 수정 불가능하다는 불변성의 특징을 가지고 있다.
수정 시 수정된 문자열이 새로 할당되어 새 주소를 넘긴다.
문자열 값을 수정 가능하며 가변성의 특징을 가지고 있다. 새로운 문자열이 수정이나 삭제되어도 객체의 주소는 변하지 않고 기존 문자열에 수정되어 적용되므로 메모리 절약 특징을 가진다. 기본적으로 16 문자 크기로 지정된 버퍼를 이용하며 크기 증가가 가능하고 쓰레드 safe 기능이 제공되며 멀티 쓰레드 환경에 적합하다.
일꾼이라고 생각할 수 있다. 단일 쓰레드는 통로가 한 개이고 멀티 쓰레드는 여러 요청을 받아들여서 작업을 나눠 동시에 처리할 수 있게 해준다. 멀티 쓰레드에서 작업 처리 시 프로그램이 꼬이는 상황을 억제하기 위해 사용하는 것이 쓰레드 safe 이다.
StringBuffer sb = new StringBuffer();
// StringBuffer.capacity() : 현재 버퍼의 크기
sb.capacity();
// identityHashCode() : 실제 주소
identityHashCode(sb);
// StringBuffer.append(문자열) : StringBuffer 객체에 문자열을 기존 데이터 뒤에 붙임
sb.append("abc");
// StringBuffer.toString() : 저장된 문자열을 String 형태로 반환
sb.toString();
// insert(인덱스, 문자열) : 중간 삽입
sb.insert(2, "@");
// delete(int start, int end) : 삭제 (start 이상 end 미만)
sb.delete(3, 5);
// replace(int start, int end, String str) : 변경 (start 이상 end 미만을 str 로 변경)
sb.replace(0, 2, "AB");
StringBuffer 와 동일하지만 쓰레드 safe 기능을 제공하지 않고 단일 쓰레드 환경에 적합하다.
String 클래스에서 제공하는 split ( ) 메소드와 같은 기능을 하는 클래스로 생성 시 전달받은 문자열을 구분자로 나누어 각 토큰에 저장한다. 웹 개발 시 자주 사용하지는 않는다.
String str = "AA|BB|CC";
StringTokenizer st = new StringTokenizer(str, "|");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
기본 자료형을 객체로 다룰 수 있도록 포장한 클래스로 기본 자료형을 객체화해주는 클래스이다. 포장이 필요한 이유는 기본 자료형이 제공하지 않는 최댓값이나 최소값 등의 추가 필드나 메서드를 제공하기 때문이다.
또한 객체만 다룰 수 있는 컬렉션 등에서 사용하기 위해 기본 자료형을 객체로 다뤄야 하는 경우가 있기 때문에 사용한다.
Primitive Data Type | Wrapper Class |
---|---|
boolean | Boolean |
byte | Byte |
char | Character |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
proxy 는 대신 또는 대체라는 뜻이다.
// parse
byte b = Byte.parserByte("1");
short s = Short.parseShort("2");
int i = Integer.parseInt("3");
long l = Long.parseLong("4");
float f = Float.parseFloat("0.1");
double d = Double.parseDouble("0.2");
boolean bool = Boolean.parseBoolean("true");
char c = "abc".charAt(0);
// Integer 제공 상수 필드
System.out.println(Integer.BYTES); // byte 단위 크기 (4)
System.out.println(Integer.SIZE); // bit 단위 크기 (32)
System.out.println(Integer.MAX_VALUE); // 자료형 최대값 (2147483647)
System.out.println(Integer.MIN_VALUE); // 자료형 최소값 (-2147483648)
System.out.println(Integer.TYPE); // Wrapper 클래스 대상 타입 (int)
// 방법 1
String b = Byte.valueOf((byte)1).toString();
String s = Short.valueOf((short)2).toString();
String i = Integer.valueOf(3).toString();
String l = Long.valueOf(4L).toString();
String f = Float.valueOf(0.1f).toString();
String d = Double.valueOf(0.2).toString();
String bool = Boolean.valueOf(true).toString();
String ch = Character.valueOf('a').toString();
// 방법 2
String str2 = 999 + "";
Boxing 은 기본 자료형에서 Wrapper Class 객체로 변환하는 것이고 Unboxing 은 Wrapper Class 에서 기본 자료형으로 변환하는 것이다.
AutoBoxing 과 AutoUnboxing 은 사용자가 신경쓰지 않아도 상황에 따라 기본 자료형과 Wrapper Class 객체끼리 자동으로 변하는 기술이다.
시스템으로부터 현재 날짜 및 시간 정보를 가져와 다룰 수 있게 만들어진 클래스이다.
생성자 두 개와 몇 개의 메소드만 사용 가능하고 나머지는 모두 deprecated Calendar 클래스 혹은 GregorianCalendar 클래스 사용을 권장한다.
// 시스템으로부터 현재 날짜와 시간 정보를 가져와 객체 생성 시점의 시간 저장
Date today = new Date();
// Date 기준 시간으로부터 지난 시간 (ms)
Date when = new Date(0L); // long 타입
// 현재 시간이 기준 시간으로부터 지난 시간 (ms)
System.currentTimeMillis();
// 현재 시간으로부터 1시간 후를 저장
long temp = 60 * 60 * 1000; // 1시간 (시 * 분 * ms)
Date d4 = new Date(System.currentTimeMillis() + temp);
Calendar 클래스는 생성자가 protected 이기 때문에 new 연산자를 통해 객체 생성이 불가능하므로 getInstance ( ) 메소드를 통해서 객체를 생성한다.
GregorianCalendar 클래스는 Calendar 클래스의 후손 클래스이며 년월일시분초 정보를 필드를 이용하여 다룰 수 있다.
Date 의 날짜와 시간 정보를 원하는 format 으로 출력하는 기능을 제공하며 java.text 패키지에 속해있다.
long temp = 60 * 60 * 1000; // 1시간 (시 * 분 * ms)
Date d4 = new Date(System.currentTimeMillis() + temp);
SimpleDateFormat ft1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat ft2 = new SimpleDateFormat("yyyy년 MM월 dd일 E요일 a hh시 mm분 ss초");
// d4 객체에 포맷을 적용한 결과를 문자열로 리턴
String ftToday = ft1.format(d4);
String ftToday = ft2.format(d4);
Object 클래스의 equals()
를 오버라이딩해서 현재 객체와 다른 객체가 필드 값이 같아 동등한지 비교한다.
필드를 가지고 있는 자식 클래스가 알맞은 형태로 오버라이딩 재정의를 할 필요가 있다.
if(s.equals(temp)) return false;
@Override
public boolean equals(Object obj)
// 같은 객체를 참조할 경우
// Student s1 = new Student(); Student s2 = s1; s1.eqauls(s2);
if(this == obj) return true;
// null 이면 비교 자체 불필요
if(obj == null) return false;
// 비교를 위해 전달 받은 객체가 Student 인지
if (!(obj instanceof Student)) return false;
// 필드 비교
Student other = (Student)obj; // obj 다운 캐스팅
if(this.grade != other.grade) return false;
if(this.classRoom != other.classRoom) return false;
if(this.number != other.number) return false;
if(!this.name.equals(other.name)) return false;
return true; // 모든 필드가 같을 경우
}
hash 함수
: 입력 받은 문자열이나 숫자를 특정한 길이의 문자열이나 숫자로 최대한 중복되지 않게 변환하는 것
hashCode()
: 객체의 필드 값을 이용해서 일정한 길이의 숫자를 만드는 함수이다.
두 객체의 필드 값이 같다면 hashCode 역시 똑같은 정수 값을 반환해야한다.
Object 클래스의 hashCode 가 필요한 이유는 자바 실행 시 내부에서 객체를 검색하는 속도가 증가하기 때문이다.
작성 방법은 필드 값이 같으면 항상 같은 값이 나올 수 있도록 구현하고 equals ( ) 오버라이딩 시 필수적으로 같이 오버라이딩한다.
if(s.hashCode() == temp.hashCode()) return false;
@Override
public int hashCode() {
int result = 1;
final int PRIME = 31; // 곱 연산 시 속도가 빠른 소수
result = result * PRIME + grade;
result = result * PRIME + classRoom;
result = result * PRIME + number;
result = result * PRIME + (name == null ? 0 : name.hashCode());
return result;
}
String 클래스의 join()
은 String 배열의 요소를 요소 사이사이에 구분자를 추가하여 하나의 문자열로 합친다.
return String.join("|", names);
String 클래스의 split()
은 문자열을 구분자를 기준으로 나누어 String 배열 형태로 반환한다.
String[] names = input.split(". | @"); // . 또는 @ 기준으로 구분