Java
[Java] Object, String 클래스
삶_
2022. 6. 21. 12:04
Object클래스
- 모든 클래스의 최고 조상
- 11개의 메서드만을 가짐
- a.equals(Object obj)
- Object클래스의 equals()는 객체의 주소를 비교
- 같으면 true, 다르면 false
매개값이 다를수있으니 instaneof를 통해 거친후 해주는 것이 좋다
String 클래스의 equals()는 Object의 equals()를 재정의 했기 때문에
문자열의 값을 비교해준다
그 안의 인스턴스 변수를 서로 비교하고싶다면 오버라이딩 해야함
형변환을 하지 않으면 iv 값이 같아도 주소값이 달라 false로 나오기 때문에
a.equals(b)
Object.equals(a,b)
a와 b가 모두 null이면 true를 반환 - deepEquals() 랑 기능은 같다. <<다만 배열에서의 동의어 메서드는 기능이 달라짐.
- 문자열1.equalsIgnoreCase(문자열2)
- 대소문자 구분없이 비교한다
- equals 는 대소문자를 비교
- 같으면 true, 다르면 false
- Object클래스의 equals()는 객체의 주소를 비교
- a.finalize()
- 참조하지 않는 객체 등은 가비지 컬렉터의 힙 영역에서 제거됨
- 객체를 소멸하기 직전에 가비지 컬렉터에 의해 자동적으로 호출된다 (거의 사용 안함)
- a.clone()
- 객체의 동일한 필드값을 가진 새로운 객체 생성(반환)
- 깊은 복사의 clone()을 쓰고 싶다면 java.lang.Cloneable 인터페이스를 구현해야 함
클래스 뒤에 implements Clonable 을 쓰면 됨
재정의 하지 않았을때 (얕은 복사)
대입연산자를 통해 값을 복사하는 것과 같음 (주소값만 복사됨)
복제된 객체는 결국 원래 객체와 동일해짐.(원본에 영향줌)
재정의 했을때 (깊은 복사)
같은 값을 가지면서도 완전히 다른 객체로 생성하기
- 단점: 예외처리를 해줘야함
- try-catch문을 활용해 try {clone() 호출문장} catch (CloneNotSupportedException e){}
- 깊은 복사의 clone()을 쓰고 싶다면 java.lang.Cloneable 인터페이스를 구현해야 함
- 객체의 동일한 필드값을 가진 새로운 객체 생성(반환)
- a.hashCode()
- 객체 자신의 해시코드를 반환한다
- Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
같은 객체에 있으면 같은 해시코드가 나옴 - 따라서 메서드를 오버라이딩 하는편
- Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
- 객체 자신의 해시코드를 반환한다
- s.toString()
- 객체 자신의 정보를 문자열로 반환한다
- 클래스명@16진수해시코드
- System.out.println(s.toString()) 이랑
- System.out.println(s) 은 결과가 같다
- 자바 내부적으로 약속이 되어있음
- 객체 자신의 정보를 문자열로 반환한다
- isNull(Object obj), nonNull(Object obj), requireNonNull(Object obj)
- isNull() : 객체가 null일 경우 true를 리턴
notNull(): 위와 반대임
requireNonNull(Object obj) : 예외 메시지를 제공함
- isNull() : 객체가 null일 경우 true를 리턴
- a.equals(Object obj)
public void notify() | 객체 자신을 사용하려고 기다리고 있는 쓰레드를 하나만 깨운다 |
public void notifyAll() | 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다 |
public void wait() | 다른 쓰레드가 notify(), notifuAll()을 호출할 때 까지 현재 쓰레드를 무한히, 또는 지정된 시간동안 기다리게 한다 |
compare(T a, T n, Comparator<T>) | 두 객체(a와 n)를 Comparator로 비교해서 int 값을 리턴함 |
isNull(Object obj), nonNull(Object obj), requireNonNull(Object obj) | isNull() : 객체가 null일 경우 true를 리턴 notNull(): 위와 반대임 requireNonNull(Object obj) : 예외 메시지를 제공함 |
class Person {
long id;
//equals() 오버라이딩
public boolean equals(Object obj) {
if(obj instanceof Person) //형변환 체크
return obj.id ==((Person)obj).id; //형변환
else
return false;
}
Person(long id) {
this.id = id;
}
}
public String toString() {
return getClass().getName()+"@"+Integer.toHexString(hashCode());
//클래스객체.클래스이름+위치+16진수로(객체주소)
}
System 클래스
- System.exit() : 현재 프로세스를 강제 종료시킴
- System.exit(0) : 정상종료
- System.exit(5) : 종료 상태값이 5이면 프로세스를 종료시킴
- System.gc() : 쓰레기 수집기 (JVM에게 쓰레기를 버려달라 (사용하지 않는 객체))
- System.getProperty() : JVM이 시작할때 자동 설정되는 시스템의 속성값을 찾아줌
- 프로그램 실행 소요 시간 구하기
- System.currentTimeMillis() : 현재 시각 읽기 (1/1000초)
- System.nanoTime() : 현재 시각 읽기 (1/10^9)
String클래스
- 데이터(char[]) + 메서드(문자관련)
- 내용을 변경할 수 없는 불변 클래스
- 새로운 문자열이 될경우 새로 생성된 String 객체를 참조하게 된다
- 덧셈연산자를 이용한 문자열 결합은 성능이 떨어짐
- StringBuffer : 문자열 변경이 잦을 때 내용변경이 가능함
String a = "a";
String b = "b";
a = a + b;
이면,
a = ab가 되지만, 기존의 a 주소에 저장되는것이 아니라
새로운 ab 주소에 저장되게 됨
빈 문자열
- 내용이 없는 문자열
- 크기가 0인 char형 배열을 저장하는 문자열
- String str = “”;
- 길이가 0인 배열을 생성하는 것은 어느 타입이나 가능
- char[] chArr = new char[0];
- int[] iArr = {};
- 쓰임새
- 숫자 → 문자 : “”+5=”5”
- 문자, 문자열의 초기화
- String s = “”;
- char c = ‘’;
String 클래스의 생성자와 메서드
- String s = "ABCDE" 일때
- s.charAt(4) : 4 위치의 문자 리턴
- s.equals(a) : 문자열 a가 s랑 값이 같은지
- s == a : 문자열 a랑 s가 주소가 같은지
- 만약 new String(a) 으로 새 객체를 만들었다면 주소가 같지 않다(같은 String 객체를 참조하지 않음)
- s.getByte() : 문자열 s를 byte 배열로 변환
- s.indexOf(a) : a를 문자열 s 내에서 찾아 문자열 첫단어 위치 반환 //주어진 문자열이 없으면 -1 반환
- s.length() : 문자열 길이
- s.replace(a, b) : s 내의 a문자열을 b로 바꿈
- s.substring(2) : 2부터 끝까지 문자열 잘라내기 // s.substring(1,5) : 1부터 4까지
- String.join("-", arr) : 배열 arr의 요소마다 "-"를 붙여서 반환
- 그 외
- s.toLowerCase(), s.toUpperCase() : 소문자, 대문자로 변경
- s.trim() : 문자열 앞뒤 공백 잘라내기
- s.split(a,b) : 문자열 s 내에서 a와 b를 모두 지운다
- StringTokenizer st = new StringTokenizer(s,b)
- st 객체를 만들어서 문자열 s 내에서 b (하나의 문자로 구분되어 연결되어 있을경우)를 빼서 반환
- st.countTokens() : 꺼내지않고 남아있는 토큰의 수
- st.hasMoreTokens() : 남아있는 토큰이 있는지 여부
- st.nextToken() : 토큰을 하나씩 꺼내옴
- Stringjoiner
- import java.util.StringJoiner; 생성 후 작업
- 여러 문자열 사이에 문자를 삽입할때 사용하는 객체
- Stringjoiner sj = new Stringjoiner(",","[","]");
- sj.add(arr);
- 문자열 마다 add 함수로 문자 삽입해주면 됨
join()
- split()과 구별되는 개념 (결합!)
- String 클래스의 메서드
String animals = "dog,cat,bear";
String[] arr = animals.split(",");
String str = String.join("-", arr); //배열의 문자열을 '-'로 구분해서 결합
System.out.println(str);
//결과
dog-cat-bear
문자열 ↔ 기본형 변환
- 숫자 → 문자열
- int i = 100; String str1 = i + ""; //"100" 문자열로 변환
- String str2 = String.valueOf(i) //난해하나 처리속도가 빠름
- 문자열 → 숫자
- int i = Integer.parseInt("100"); //"100"을 100으로 변환하는 법1
- int i = Integer.valueOf("100"); //"100"을 100으로 변환하는 법2. 반환 타입이 Interger
StringBuffer 클래스
- String 클래스 처럼 문자열 배열을 내부적으로 가지고 있다
- String 과 달리 내용을 변경할 수 있다
- st.capacity() : 버퍼크기
- st.length() : 버퍼 내 문자열의 크기
- 배열은 길이 변경 불가하다 (공간이 부족하면 새로운 배열 생성하기)
- 새로운 배열 생성
- 내용 복사
- 참조 변경
- 가능하면 적절한 문자열의 길이를 고려해 설정
- append()는 지정된 내용을 StringBuffer에 추가 후, StringBuffrer의 참조를 반환
- str.append("2")
public StringBuffer(int length) {
value = new char[length]; //새 배열생성
shared = false;
}
public StringBuffer() {
this(16); //길이를 설정하지 않으면 자동으로 16이 됨
}
public StringBuffer(String str) {
this(str.length() + 16); //지정한 문자열길이보다 16 더 크게 설정
append(str); //문자열 끝에 str 문자열을 추가
}
- StringBuffer은 equals()가(주소값 비교) 오버라이딩 되어있지 않다
- StringBuffer을 String으로 변환 후에 equals()로 비교해야 함
StringBuffer sb = new StringBuffer("abc");
StringBuffer sb5 = new StringBuffer("abc");
System.out.println(sb==sb2); //false
System.out.println(sb.equals(sb2)); //false
//변환해야 함
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2)); //true
StringBuffer의 생성자와 메서드
StringBuilder sb = new StringBuilder();
sb.append("java"); //문자열 추가
sb.insert(4,"2"); //4위치에 "2"추가
sb.setCharAt(4, "2"); //4위치에 문자를 "2"로 변경
sb.replace(6,13, '2'); //6에서 12 위치까지의 문자열을 '2'로 변경
sb.delete(6,13); //6부터 12위치까지의 문자열 삭제
StringBuilder
- StringBuffer와 비슷한 기능. 하지만 StringBuilder은 동기화가 안되어 있음.
- 길이 등등 많이 수정해야할때 선호됨
- StringBuilder() : 16개의 문자들을 저장할 수 있는 초기 버퍼 만들기
- StringBuilder(s) : 문자열 s만큼의 길이를 버퍼크기로 저장
- StringBuilder(15) : 15개의 문자들을 저장할 수 있는 초기 버퍼 만들기
- 멀티 쓰레드(동시에 여러작업) 프로그램이 아닌 경우, 동기화는 불필요한 성능저하.
- 이럴 때 StringBuilder 을 사용하면 성능 향상
Arrays 클래스
- 단순 복사
- System.arraycopy(num,0,num2,0,num.length) //num 0부터 끝을 num2 0부터 끝까지 순서대로 볼때 num.length만큼 복사한다
- num[0]에서 num2[0]으로 num.length개의 데이터를 복사
- 주요 메서드
- String[] arr = Arrays.copyOf(num, num.length) //num배열을 num.length길이까지만큼 arr로 저장
- String[] arr = Arrays.copyOfRange(num, 2, 4) //num배열을 인덱스2~3까지 arr로 저장
- Arrays.equals(num,num2) //num과 num2의 비교 (1차원배열) (1차배열까지만 검사한다)
- Arrays.deepEquals(num,num2) //num과 num2의 비교 (2차원배열)
- 배열 정렬과 검색
- Arrays.sort(num) //num을 오름차순으로 정렬함
- Arrays.binarySearch(num, 99) //num에서 인덱스 99 속 데이터를 반환
- 배열의 출력
- Arrays.toString(int[] a)
- Arrays.deepToString(int[][] a) : 다차원 배열의 출력
- 배열 채우기
- Arrays.fill(arr, 9) : arr 속 모든 데이터를 9로 채운다
- Arrays.setAll(arr, () -> (int)(Math.random()*5)+1) : arr 속 모든 데이터를 각각 람다식이 반환한 값으로 채움
- 배열을 List로 변환
- Arrays.asList(1,2,3,4,5) : List로 변환해줌 // = [1,2,3,4,5]
- asList()가 반환한 List는 크기를 변경할 수 없음
- 크기를 변경할 수 있는 List가 필요할 시
- List list = new ArrayList(Arrays.asList(1,2,3,4,5));
Math 클래스
- 수학관련 static메서드의 집합
- round()로 원하는 소수점 아래 세번째 자리에서 반올림하기
- 원래 값에 100을 곱한다
- 90.7552 * 100 → 9075.52
- 위의 결과에 Math.round()를 곱한다
- Math.round(9075.52) → 9076
- 위의 결과를 다시 100.0으로 나눈다
- 9076 / 100.0 → 90.76
- 원래 값에 100을 곱한다
Math클래스의 메서드
- Math.abs(-5) // 5 절대값 반환
- Math.round(5.3) // 5 반올림값
- Math.ceil(-5.3) // -5.0 올림값 반환
- Math.floor(-5.3) // -6.0 내림값 반환
- Math.max(5,9) // 둘중 최대값
- Math.min(5,9) // 둘중 최소값
- Math.random() // 랜덤값 실수 0<= <1
- Math.rint(5.3) // 5 가까운 정수의 실수값(.0붙은거)