java.lang패키지
- 자바프로그래밍에서 가장 기본이 되는 클래스들을 포함
- import문 없이도 사용할 수 있게 되어있음
object클래스

- 멤버변수는 없고, 11개의 메서드만 가지고있음
equals(Object obj)
- 매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean값으로 알려주는 역할을 함(두 참조변수에 저장된 주소값이 같은지를 판단하는 기능밖에 할 수 없음)
- 주소가 아닌 객체에 저장된 내용을 비교하도록 변경하는 방법? (equals메서드를 오버라이딩)
주소값이 아닌, 멤버변수 id의 값을 비교하도록 만들기
public boolean equals(Object obj) {
if (obj!=null && obj instanceof Person) {
return id == ((Person)obj).id;
} else {
return false;
}
}
hashCode()
- 해싱 기법에 사용되는 해시함수를 구현한 것
- 해싱: 데이터 관리기법 중 하나, 다량의 데이터를 저장하고 검색하는데 유용
- 서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없음
toString()
- 인스턴스에 대한 정보를 문자열로 제공할 목적으로 정의한 것(인스턴스 변수에 저장된 값들을 문자열로 표현한다는 의미)
- String인스턴스가 갖고있는 문자열을 반환하도록 오버라이딩 되어있음(+Date클래스도 마찬가지)
clone()
- 자신을 복제하여 새로운 인스턴스를 생성하는 일을 함
- 얕은 복사(원본을 변경하면 복사본도 영향을 받음)
- clonable인터페이스를 구현한 클래스에서만 clone()을 호출할 수 있음
- clone()을 오버라이딩하면서 접근 제어자를 protected에서 public으로 변경해야 함. 그래야만 상속관계가 없는 다른 클래스에서 clone()을 호출할 수 있음.
- try-catch내에서 조상클래스의 clone()을 호출
class Point implements Cloneable {
//...
public Object clone() {
Object obj=null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {}
return obj;
}
}
공변 반환타입
- 오버라이딩할 때 조상 메서드의 반환타입을 자손 클래스의 타입으로 변경을 허용하는 것
- ex. clone()의 반환타입을 Object에서 Point로 변경(=조상의 타입에서 자손의 타입으로 변경)
public Point clone() { //반환타입을 Object에서 Point로 변경
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {}
return (Point)obj; //point타입으로 형변환
getClass()
- 자신이 속한 클래스의 Class객체(이름이 'Class'인 클래스의 객체)를 반환하는 메서드
String클래스
- 문자열을 저장하고 이를 다루는데 필요한 메서드 제공
변경 불가능한 클래스
- String클래스는 앞에 final이 붙어 있으므로 다른 클래스의 조상이 될 수 없다.
- 한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경할 수는 없다.
ex. 문자열을 결합(+ 연산자 사용)하는 경우, 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String인슨터스가 생성됨
String a = "a"; //0x100주소
String b = "b"; //0x200주소
String a = a + b; //0x300주소로 바뀜
- 문자열 간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 String클래스 대신 StringBuffer클래스를 사용하는 것이 좋다. (StringBuffer인스턴스에 저장된 문자열은 변경이 가능함)
문자열의 비교
- 문자열 리터럴을 지정하는 방법
- String클래스의 생성자를 사용해서 만드는 방법
문자열 리터럴
- 자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장됨(같은 내용의 문자열 리터럴은 한번만 저장됨)
빈 문자열
char[] chArr = new char[0];
int[] iArr = {};
//초기화 방법
String s = "";
char c = ' ';
String클래스의 생성자와 메서드



join()과 StringJoiner
- join()은 여러 문자열 사이에 구분자를 넣어서 결합
- ex.
String animals = "dog,cat,bear";
String[] arr = animals.split(",");
String str = String.join("-", arr);
System.out.println(str);
StringBuffer클래스와 StringBuilder클래스
- 내부적으로 문자열 편집을 위한 버퍼를 가지고 있으며, StringBuffer인스턴스를 생성할 때 그 크기를 지정할 수 있다. 이 때, 편집할 문자열 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다.
- StringBuffer클래스는 String클래스와 같이 문자열을 저장하기 위한 char형 배열의 참조변수를 인스턴스변수로 선언해 놓고 있다. StirngBuffer인스턴스가 생성될 때, char형 배열이 생성되며 이 때 생성된 char형 배열을 인스턴스변수 value가 참조하게 된다.
public final class StringBuffer implements java.io.Serializable {
private char[] value;
...
}
StringBuffer의 생성자
- StringBuffer클래스의 인스턴스를 생성할 때, 적절한 길이의 char형 배열이 생성되고, 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용된다.
public StringBuffer(int length) {
value = new char[length];
shared = false;
}
public StringBuffer() {
this(16); //버퍼의 크기를 지정하지 않으면 자동적으로 버퍼의 크기는 16으로 된다.
}
public StringBuffer (String str) {
this(str.length() + 16);
append(str);
}
StringBuffer의 비교
- StringBuffer클래스는 equals메서드를 오버라이딩하지 않아서 StringBuffer클래스의 equals메서드를 사용해도 등가비교연산자(==)로 비교한 것과 같은 결과를 얻음
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb==sb2); //false
System.out.println(sb.equals(sb2)); //false
- StringBuffer인스턴스에 담긴 문자열을 비교하기 위해서는 StringBuffer인스턴스에 toString()을 호출해서 String인스턴스를 얻은 다음, 여기에 equals메서드를 사용해서 비교해야 한다.
StringBuffer클래스의 생성자와 메서드




StringBuilder
- StringBuilder는 멀티쓰레드에 안전하도록 동기화되어있음 ([참고]동기화는 StringBuffer의 성능을 떨어트림. 따라서 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 새로 추가되었음.)
- 소스코드에서 StringBuffer대신 StringBuilder를 사용하도록 바꾸기만 하면 됨.
StringBuilder sb;
sb = new StringBuilder();
sb.append("abc");
//StringBuffer로 바꾸기
StringBuffer sb;
sb = new StringBuffer();
sb.append("abc");
Math클래스
- Math클래스는 기본적인 수학계산에 유용한 메서드로 구성되어있음.
- Math클래스의 생성자는 접근 제어자가 private이기 때문에 다른 클래스에서 Math인스턴스를 생성할 수 없도록 되어있음.(클래스 내에 인스턴스변수가 하나도 없어서 인스턴스를 생성할 필요가 없기 때문)
import static java.lang.Math.*;
import static java.lang.System.*;
- 반올림: round(), 올림: ceil(), 버림: floor()
래퍼(wrapper) 클래스
- 객체지향 개념에서는 모든 것은 객체로 다루어져야 하지만, 자바에서는 8개의 기본형을 객체로 다루지 않음.
- 8개의 기본형을 대표하는 8개의 래퍼클래스가 있는데, 이 클래스를 이용하면 기본형 값을 객체로 다룰 수 있음

Number클래스

- BigInteger: long으로도 다룰 수 없는 큰 범위의 정수
- BigDecimal: double로도 다룰 수 없는 큰 범우의 부동 소수점수를 처리하기 위한 것