java.lang
패키지 : 자바에 가장 기본적인 클래스들을 포함
import
하지 않아도 자동으로 포함됨extends java.lang.Object
하지 않아도 자동으로 상속hashCode();
✅getClass().getName();
toString();
== getclass().getName() + "@" + Integer.toHexString(hashCode())
equals();
default : public boolean equals(Object obj) { return (this == obj); }
finalize();
notify();, notifyAll();
wait();
// 자바 최상위 클래스는 Object
public class Point {
private int x , y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
// 객체 문자열 포맷을 반환
return String.format("Point(%d, %d)", x, y);
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Point) {
Point other = (Point) obj;
return x == other.x && y == other.y;
}
return super.equals(obj);
}
}
객체의 복제
얕은 복제 vs. 깊은 복제(객체 복제)
- 얕은 복제 : 단순히 내부 필드의 값을 복제
clone()
이라는 메소드를 사용하기 위해Cloneable
이라는 Interface 생성 필요
❗ 참조형 얕은 복제 시 같은 메모리를 참조하여 값 변경이 발생하면 함께 변경 되는 문제 발생- 깊은 복제 : 참조하고 있는 객체도 복제하여 새로 할당하는 것 ✅
Cloneable
구현 후clone
메서드를 override하여 내부 참조 객체도 복제
char letter;
문자 할당 : letter = 'A';
""
로 둘러싸인 문자열 ➡ 한번 만들어진 String 객체는 변경 불가 ❕immutable❕String greeting;
문자열 할당 : greeting = "Hello Java!";
\;, \", \\, \n, \r, \t
등+
연산자 : 문자열의 연결 (문자열과 다른 타입의 연결은 문자열로 변환되어 연결)+
연산자로 합쳐진 문자열은 새로운 메모리 공간에 할당되고 그 메모리를 변수가 다시 참조 ✅ ➡ 변경되는 것이 아니라 새 문자열 생성 후 참조 (변경 불가 원칙 - immutable).charAt(position)
: 해당 위치의 문자 반환.subString(start, end)
: start 부터 end까지의 문자들을 새로운 문자열로 반환.concat(string)
: 문자열 뒤에 붙여 새로 생성 // 유용한 메서드들
String str = "Java Programming JavaScript Programming";
System.out.println("str : " + str); // str : Java Programming JavaScript Programming
System.out.println("LENGTH : " + str.length()); // LENGTH : 39
// 변환 메서드
System.out.println("UPPER : " + str.toUpperCase()); // UPPER : JAVA PROGRAMMING JAVASCRIPT PROGRAMMING
System.out.println("LOWER : " + str.toLowerCase()); // LOWER : java programming javascript programming
// 검색 메서드
System.out.println("인덱스 5의 글자 : " + str.charAt(5)); // 인덱스 5의 글자 : P
int index = str.indexOf("Java"); // "Java"의 인덱스
System.out.println("1번째 Java 인덱스 : " + index); // 1번째 Java 인덱스 : 0
index = str.indexOf("Java", 5); // 5번 인덱스 이후의 "Java"
System.out.println("2번째 Java 인덱스 : " + index); // 2번째 Java 인덱스 : 17
index = str.indexOf("Java", 21); // 21번 인덱스 이후의 "Java"
System.out.println("3번째 Java 인덱스 : " + index); // 3번째 Java 인덱스 : -1 // -1 : 찾을 수 없음
System.out.println("마지막 Java 인덱스 : " + str.lastIndexOf("Java")); // 마지막 Java 인덱스 : 17
// 문자열 추출
System.out.println("substring(5) : " + str.substring(5)); // substring(5) : Programming JavaScript Programming // 5부터 전체
System.out.println("substring(5, 16) : " + str.substring(5, 16)); // substring(5, 16) : Programming // 5 ~ 16 앞까지
// 문자열 변경
System.out.println("replace : " + str.replace("Programming", "Coding"));// replace : Java Coding JavaScript Coding
// 문자열은 변경되지 않음 (새로운 문자열이 생성되는 것)
System.out.println("str : " + str); // str : Java Programming JavaScript Programming
// 화이트 스페이스 (공백문자, 개행문자, 탭문자 등) 제거 .trim()
String s2 = " Hello ";
String s3 = " Java ";
System.out.println(s2.trim() + " " + s3.trim()); // Hello Java
// 문자열 분리 .split(구분자) -> 구분자로 잘라서 배열로 반환
String[] words = str.split(" ");
System.out.println(Arrays.toString(words)); // [Java, Programming, JavaScript, Programming]
for (String word : words) {
System.out.println("WORD : " + word);
}
// 문자열 비교 : Unicode 비교
// 0 : 순서가 같다 음수 : 전자가 후자보다 순서가 빠르다 양수 : 순서가 늦다
System.out.println("ABC".compareTo("ABD")); // -1
가변 크기의 문자 버퍼를 가짐
String
이 immutable인 것에 비해, StringBuffer 객체는 수정 가능 // 버퍼의 생성
StringBuffer sb = new StringBuffer("Tbis");
System.out.println(sb); // This
// 문자열 추가 : append
sb.append(" is pencil");
System.out.println(sb); // This is pencil
// 문자열 삽입 : insert
sb.insert(7, " my"); // 7번 인덱스에 " my"를 추가
System.out.println(sb); // This my is pencil
// 문자열 치환 : replace
sb.replace(7, 10, " your"); // 7번부터 10번 앞까지를 " your"로 변경
System.out.println(sb); // This your is pencil
// 버퍼사이즈 조정 : setLength
sb.setLength(6);
System.out.println(sb); // This i
// 위와 동일하지만 체이닝한 방법
StringBuffer sb2 = new StringBuffer("This").append(" is pencil").insert(7, " my").replace(7, 10, " your");
String s = sb2.toString(); // 문자열 생성
System.out.println(s);
기본 데이터형을 객체로 다루기 위한 포장 클래스
.valueOf()
메서드를 이용하여 생성==
연산자로 비교시 그래도 객체 이므로 권장하지 않음 (같은 값(참조값)이 아닐 가능성이 높음)