728x90
Object 클래스
모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있음
notify(), wait()는 쓰레드와 관련된 메서드
- protected Object clone()
객체 자신의 복사본을 반환 - public boolean equals(Object obj)
객체 자신과 객체 obj가 같은 객체인지 확인. 같다면 true 객체 비교 - protected void finalize() ↔ 생성자(객체 초기화)
객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출. 이 때 수행되어야하는 코드가 있을 때 오버라이딩
(거의 사용 ㄴ. 사용권장 ㄴ) - public Class getClass()
객체 자신의 클래스 정보(설계 정보)를 담고 있는 Class 인스턴스를 반환
객체 생성, 객체 정보를 얻을 수 있음
ReffectionAPI - public int hashCode()
객체 자신의 해시코드를 반환 - public String toString()
객체 자신의 정보를 문자열로 반환 - public void notify()
객체 자신이 사용하려고 기다리는 쓰레드를 하나만 깨움 - public void notifyAll()
객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨움 - public void wait(), public void wait(long timeout), public void wait(long timeout, int nanos)
다른 쓰레드가 notify()나 notifyAll()을 호출할 때 까지 현재 쓰레드를 무한히 또는 지정된 시간동안 기다리게 함.
equals(Object obj)
객체 자신(this)과 주어진 객체(obj)를 비교 같으면 true, 다르면 false
Object클래스의 equals()는 객체의 주소를 비교(참조변수값 비교)
public boolean equals(Object obj){
return (this==obj); //주소가 같아야 true
}
package chapter09;
class Value{
int num;
public Value() {}
public Value(int num) {
this.num = num;
}
}
public class Study02Ex1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
//서로 다른 두 객체는 항상 주소가 다름
System.out.println(v1.equals(v2));
}
}
package chapter09;
class Value{
int value;
public Value() {}
public Value(int value) {
this.value = value;
}
//Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교
public boolean equals(Object obj) {
//return this == obj; //주소 비교. 서로 다른 객체는 항상 거짓
//참조변수의 형변환 전에는 반드시 instanceof로 확인
if(obj instanceof Value)
return false;
Value v = (Value)obj; //obj를 value로 형 변환
return this.value == v.value;
}
}
public class Study02Ex1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
//서로 다른 두 객체는 항상 주소가 다름
System.out.println(v1.equals(v2));
}
}
equals(Object obj)의 오버라이딩
인스턴스 변수(iv) 값을 비교하도록 equals()를 오버라이딩해야함
※cv : 객체마다 공통(공유), iv : 객체마다 다름(개별)
package chapter09;
class Person{
long id;
public boolean equals(Object obj) {
if (obj instanceof Person)
return id == ((Person)obj).id; //obj가 Object 타입이므로 id값을 참조하기 위해서는 Person 타입으로 형변환이 필요
else
return false; //타입이 Person이 아니면 값을 비교할 필요 없음
}
Person(long id){
this.id = id;
}
}
public class Study02Ex2 {
public static void main(String[] args) {
Person p1 = new Person(0001013000000L);
Person p2 = new Person(0001013000000L);
if(p1.equals(p2)) {
System.out.println("p1과 p2는 같은 사람");
} else {
System.out.println("p1과 p2는 다른 사람");
}
}
}
==
package chapter09;
class Person{
long id;
public boolean equals(Object obj) {
if (!(obj instanceof Person))
return false;
return this.id == ((Person)obj).id;//obj가 Object 타입이므로 id값을 참조하기 위해서는 Person 타입으로 형변환이 필요
// else
// return false; //타입이 Person이 아니면 값을 비교할 필요 없음
}
Person(long id){
this.id = id;
}
}
public class Study02Ex2 {
public static void main(String[] args) {
Person p1 = new Person(0001013000000L);
Person p2 = new Person(0001013000000L);
if(p1.equals(p2)) {
System.out.println("p1과 p2는 같은 사람");
} else {
System.out.println("p1과 p2는 다른 사람");
}
}
}
String 클래스
데이터(char[]) + 메서드(문자열 관련)
내용을 변경할 수 없는 불변(immutable) 클래스
String a = "a";
String b = "b";
a = a + b;
덧셈 연산자를 이용한 문자열 결합은 성능이 떨어짐, 문자열의 결합이나 변경이 많다면, 내용 변경이 가능한 StringBuffer를 사용
문자열 비교
String str = "abc";와 String str = new String("abc");의 비교
String str1 = "abc"; //문자열 리터럴 "abc"의 주소가 str1에 저장
String str2 = "abc"; //문자열 리터럴 "abc"의 주소가 str2에 저장
//내용 공유
//new를 이용하면 내용이 같아도 항상 새로운 문자열이 만들어짐
String str3 = new String("abc"); //새로운 String 인스턴스를 생성
String str4 = new String("abc"); //새로운 String 인스턴스를 생성
System.out.println(str1 == str2);
System.out.println(str3 == str4);
문자열 리터럴
문자열 리터럴은 프로그램 실행시 자동으로 생성(상수저장소(constant pool에 저장))
String s1 = "AAA";
String s2 = "AAA";
String s3 = "AAA";
String s4 = "BBB";
같은 내용의 문자열 리터럴은 하나만 만들어짐
빈 문자열("", empty string)
내용이 없는 문자열. 크기가 0인 char형 배열을 저장하는 문자열
char[] chArr = new char[0]; //길이가 0dls char 배열
int[] i iArr = {}; //길이가 0인 int 배열
크기가 0인 배열을 생성하는 것은 어느 타입이나 가능
char[] chArr = new char[0]; //길이가 0인 char 배열
int[] iArr = {}; //길이가 0인 int 배열
문자(char)와 문자열(String) 초기화
String s = null;
s = ""; //빈문자로 초기화
char c = '\u0000';
c = ' '; //공백으로 초기화
String 생성자
- String(String s)
주어진 문자열(s)을 갖는 String 인스턴스를 생성
잘 사용하지 않음
String string = new String("Hello");
- String(char[] value)
주어진 문자열(value)을 갖는 String 인스턴스를 생성
char[] c = {'H','e','l','l','o'};
String string2 = new String(c);
- String(StringBuffer buf)
StringBuffer 인스턴스가 갖고 있는 문자열과 같은 내용의 String 인스턴스를 생성
StringBuffer sb = new StringBuffer("Hello");
String string3 = new String(sb);
- char charAt(int index)
지정된 위치(index)에 있는 문자열을 알려줌. index는 0부터 시작. 문자 1개 반환
String string4 = "Hello";
String n = "0123456";
char c1 = sb.charAt(1);
char c2 = n.charAt(1);
- int compareTo(String str)
문자열(str)과 사전순서로 비교. 같으면 0, 사전순으로 이전이면 음수, 이후면 양수로 반환
정렬할 때 사용
int i1 = "aaa".compareTo("aaa"); //0
int i2 = "aaa".compareTo("bbb"); //음수
int i3 = "bbb".compareTo("aaa"); //양수
- String concat(String str)
문자열(Str)을 뒤에 덧붙임
String string5 = "Hello";
String string6 = string5.concat(" World");
- boolean contains(CharSequence s)
지정된 문자열(s)이 포함되어 있는지 검사
String string7 = "asdfjklzxcvnriw";
boolean b = string7.contains("sd"); //연속된 문자열 ad는 string7에는 포함되었지만 떨어져있어서 결과가 false로 반환
- boolean endsWith(String suffix)
지정된 문자열(suffix)로 끝나는지를 검사
String file = "Hello.txt";
boolean b1 = file.endsWith("txt");
- boolean equals(Object obj)
매개변수로 받은 문자열(obj)과 String 인스턴스의 문자열을 비교.
obj가 String이 아니거나 문자열이 다르면 false로 반환
String string8 = "Hello";
boolean b2 = string8.equals("Hello"); //true
boolean b3 = string8.equals("hello"); //false
- boolean equalsIgnoreCase(String str)
문자열과 String 인스턴스의 문자열을 대소문자 구분없이 비교
String string8 = "Hello";
boolean b4 = string8.equalsIgnoreCase("HELLO"); //true
boolean b5 = string8.equalsIgnoreCase("hello"); //true
- int indexOf(int ch)
주어진 문자(ch)가 문자열에 존재하는지 확인하여 위치(index)를 알려줌. 못찾으면 -1을 반환(index 시작 번호는 0).
대소문자 구분
String string8 = "Hello";
int idx1 = string8.indexOf("o"); //4
int idx2 = string8.indexOf("a"); //-1
int idx3 = string8.indexOf("h"); //-1
- int indexOf(int ch, int pos)
주어진 문자(ch)가 문자열에 존재하는지 지정된 위치(pos)부터 확인하여 위치(index)를 알려줌. 못찾으면 -1을 반환(index 시작 번호는 0)
string8 = "Hello";
int idx4 = string8.indexOf('e', 0);
int idx5 = string8.indexOf('e', 2);
- int indexOf(String str)
주어진 문자열이 존재하는지 확인하여 그 위치(index)를 알려줌. 없으면 -1을 반환(index 시작 번호는 0)
String string9 = "ABCDFEG";
int idx6 = string9.indexOf("DF"); //3
- int lastIndexOf(int ch)
지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터 찾아서 위치(index)를 알려줌. 못찾으면 -1을 반환
String string10 = "java.lang.Object";
int idx7 = string10.lastIndexOf("."); //9
int idx8 = string10.indexOf("."); //4
- int lastIndexOf(String str)
지정된 문자열을 인스턴스의 문자열 끝에서부터 찾아 위치(index)를 알려줌. 못 찾으면 -1을 반환
string10 = "java.lang.Object";
int idx9 = string10.lastIndexOf("java"); //10
int idx10 = string10.indexOf("java"); //0
- int length() 문자열의 길이
String string11 = "Hello";
int length = string11.length(); //5
- String[] split(String regex)
문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환
String animal = "dog,cat,pig";
String[] arr = animal.split(",");
for(String a : arr) {
System.out.println(a);
}
- String[] split(String regex, int limit)
문자열을 지정된 분리자(regex)로 나누어 문자열배열에 담아 반환. 단, 문자열 전체를 지정된 수(limit)로 자름
String [] arr1 = animal.split(",", 2);
for(String x : arr1) {
System.out.println(x);
}
- boolean startsWith(String prefix)
주어진 문자열(prefix)로 시작하는지 검사
String string12 = "java.lang.Object";
boolean b6 = string12.startsWith("java"); //ture
boolean b7 = string12.startsWith("Object"); //false
- String substring(int begin), String substring(int begin, int end)
주어진 시작위치(begin)부터 끝 위치(end) 범위에 포함된 문자열을 얻음.
이때 시작위치의 문자는 범위에 포함되지만 끝 위치의 문자는 포함되지 않음(begin <= x < end)
String string13 = "java.lang.Object";
String s1 = string13.substring(10); //Object
String s2 = string13.substring(5, 9); //lang
- String toLowerCase()
String 인스턴스에 저장되어 있는 모든 문자열을 소문자로 변환하여 반환
String a = "Hello";
String a1 = a.toLowerCase(); //hello
- String toUpperCase()
String 인스턴스에 저장되어 있는 모든 문자열을 대문자로 변환하여 반환
a = "Hello";
String a2 = a.toUpperCase(); //HELLO
- String trim()
문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환. 단, 문자열 중간에 있는 공백은 제거되지 않음
String a3 = " Hello World ";
String a4 = a3.trim(); //Hello World
- static String valueOf(Object obj)
지정된 값을 문자열로 변환하여 반환. 참조 변수의 경우 toString()을 호출한 결과를 반환
728x90