코딩과 결혼합니다

230924 - 자바의 정석 chapter 09 본문

2세/Java

230924 - 자바의 정석 chapter 09

코딩러버 2023. 9. 25. 09:34
728x90

⭐Object 클래스

  • equals(Object obj)
    • 주소값으로 비교
    • 두 개의 참조변수가 같은 객체를 참조하고 있는지, 즉 두 참조변수에 저장된 값(주소값)이 같은지를 판단
  • hashCode()
    • 해싱기법에 사용되는 '해시함수'를 구현
    • 해싱 : 데이터관리기법 중의 하나, 다량의 데이터를 저장하고 검색하는데 유용
    • 해시함수 : 찾고자 하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시코드를 반환
    • 해싱기법을 사용하는 HashMap이나 HashSet과 같은 클래스에 저장할 객체라면 반드시 hashCode메서드를 오버라이딩해야 한다.
    • System.identityHashCode(Object x) : 객체의 주소값으로 해시코드를 생성하기 때문에 모든 객체에 대해 항상 다른 해시코드값을 반환할 것을 보장한다.
  • toString()
    • 인스턴스에 대한 정보를 문자열로 제공할 목적
    • toString()을 오버라이딩 하지 않는다면 ➡️ 16진수의 해시코드를 얻음
    • 오버라이딩 할 때, Object클래스에 정의된 toString접근 제어자가 public이므로 이를 오버라이딩하는 클래스의 toString()의 접근제어자도 public으로 한다. - 조상에 정의된 접근범위보다 같거나 더 넓어야 하기 때문
  • clone()
    • 자신을 복제하여 새로운 인스턴스를 생성
    • 단순히 인스턴스의 변수 값만 복사한다.
    • clone메서드를 오버라이딩해서 새로운 배열을 생성하고 배열의 내용을 복사하도록 함
      • 복제할 클래스가 Cloneable인터페이스를 구현 (이게 구현되어 있다는 것은 작성자가 복제를 허용한다는 뜻)
      • clone()을 오버라이딩하면서 접근제어자를 protected에서 public으로 변경
    • 공변 반환타입 : JDK1.5부터 추가. 오버라이딩할 때 조상 메서드의 반환타입을 자손 클래스의 타입으로 변경 허용
                                실제 반환되는 자손 객체의 타입으로 반환할 수 있어 번거로운 형변환이 줄어든다.
    • 얕은 복사 / 깊은 복사
      • 얕은 복사 : clone()으로 복제하는 경우 원본과 복제본이 같은 객체를 공유하므로 완전한 복제로 보기 어려움
      • 깊은 복사 : 원본이 참조하고 있는 객체까지 복제
  • getClass()
    • 자신이 속한 클래스의 Class객체를 반환하는 메서드
    • 클래스 객체  : 클래스 파일을 읽어서 사용하기 편한 형태로 저장해 놓은 것
    • 클래스 객체를 이용하면 클래스에 정의된 멤버의 이름이나 개수 등, 클래스에 대한 모든 정보를 얻을 수 있기 때문에 클래스 객체를 통해서 객체를 생성하고 메서드를 호출하는 등 보다 동적인 코드를 작성할 수 있다.

 

 

 

⭐String클래스

  • 문자열을 저장하고 이를 다루는데 필요한 메서드를 제공
  • 변경불가능한 클래스 : 문자열은 읽어 올 수만 있고, 변경할 수 없다.
    • 문자열을 결합하는 경우 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String인스턴스가 생성되는 것
    • 메모리공간을 차지하게 되므로 가능한 한 결합횟수를 줄이는 것이 좋음
    • 문자열간의 결합이나 추출 등 문자열들을 다루는 작업이 많이 필요할 경우 ➡️ StringBuffer클래스 사용 추천
  • 문자열의 비교
    • String클래스의 생성자를 이용한 경우 new연산자에 의해서 메모리할당이 이루어지기 때문에 항상 새로운 String인스턴스가 생성
    • 문자열 리터럴은 이미 존재하는 것을 재사용
    • equals()를 사용 = 두 문자열의 내용을 비교 (오버라이딩 된 클래스)
    • '=='로 비교했을 때는 주소값을 비교하므로 결과가 다름
  • 빈 문자열
    • 길이가 0인 배열이 존재할 수 있다.
    • 그러나 char형 변수에는 반드시 하나의 문자를 지정해야 한다.
  • join()과 StringJoiner
    • join() 여러 문자열 사이에 구분자를 넣어 결합 <ㅡ> split()
    • JDK1.8부터 추가됨
  • 문자 인코딩 변환
    • getBytes 사용
    • 서로 다른 문자 인코딩을 사용하는 컴퓨터 간에 데이터를 주고받을 때는 적절한 문자 인코딩 필요.
  • 기본형 값을 String으로 변환
    • 빈 문자열을 더하는 방법이 간단하고 편하다. 성능향상이 필요한 경우에는 valueOf()사용
  • String을 기본형 값으로 변환
    • patseInt()
    • 메서드의 이름을 통일하기 위해 valsuOf()가 추가 됨. 내부에서 그저 parseInt(String s)를 호출할 뿐이므로, 반환타입만 다르지 같은 메서드이다.

 

 

 

 

⭐StringBuffer클래스와 StringBuilder클래스

  • StringBuffer클래스 생성자
    • 인스턴스에 저장될 문자열의 길이를 고려하여 충분히 여유있는 크기로 지정하는 것이 좋다.
    • 배열의 길이는 변경될 수 없으므로 새로운 길이의 배열을 생성한 후에 이전 배열의 값을 복사하는 버퍼의 크기를 증가시키는 작업이 수행된다.
  • StringBuffer의 변경
    • append() : 반환타입이 StringBuffer일 때. 연속적으로 호출 가능
  • StringBuffer의 비교
    • equls메서드를 오버라이딩하지 않아서 등가비교연산자(==)로 비교한 것과 같은 결과를 얻는다.
    • toString()은 오버라이딩되어 있어 담고있는 문자열을 String으로 반환한다.
    • StringBuffer인스턴스에 담긴 문자열을 비교 : toString()을 호출해서 String인스턴스를 얻는다. ➡️ 여기에 equals메서드를 사용해서 비교
  • StringBuilder
    • StringBuffer는 멀티쓰레드에 안전하도록 동기화 되어있다. 동기화는 StringBuffer의 성능을 떨어뜨린다.
    • StringBuilder는 StringBuffer에서 쓰레드의 동기화만 뺀 것이다.

 

 

 

 

⭐Math클래스

  • 기본적인 수학계산에 유용한 메서드로 구성
  • 접근제어자가 private으로 다른 클래스에서 Math인스턴스를 생성할 수 없도록 되어있다.
  • 클래스 내에 인스턴스변수가 하나도 없어서 인스턴스를 생성할 필요가 없기 때문
  • 올림, 버림, 반올림
    • round() : 반올림한 값을 얻을 때 사용 - 소수점 첫째자리에서 반올림 해서 정수값을 결과로 돌려줌
    • rint()
      • 반환값이 double로 round와 차이가 있다.
      • 두 정수의 정가운데 있는 값은 가장 가까운 짝수 정수를 반환
  • 메서드 이름에 'Exact'가 포함된 메서드들 - 오버플로우 감지를 위함
  • 삼각함수와 지수, 로그
    • sqrt() : 제곱근 계산
    • pow() : n제곱을 계산

 

 

 

 

⭐래퍼 클래스

  • 자바에서는 8개의 기본형을 객체로 다루지 않는다. 객체로 다뤄야 하는 경우 래퍼클래스를 사용.
  • 래퍼클래들은 모두 equls()가 오버라이딩되어 있다.
  • toString()도 오버라이딩 되어 있음.
  • MAX_VALUE, MIN_VALUE, SIZE, BYTESTYPE 등의 static 상수를 공통적으로 가지고 있다.

 

 

 

 

⭐Number클래스

  • 추상크래스로 내부적으로 숫자를 멤버변수로 갖는 래퍼 클래스들의 조상
  • 객체가 가지고 있는 값을 숫자와 관련된 기본형으로 변환하여 반환하는 메서드들을 정의하고 있다.
  • 문자열을 숫자로 변환하기
    • JDK1.5부터 도입된 '오토박싱' 기능 때문에 반환값이 기본형일 때와 래퍼클래스일 때의 차이가 없어졌다. 그냥 구별없이 valueOf()를 쓰는 것도 괜찮은 방법니다. 단, 성능은 valueOf()가 조금 더 느리다. 

  • 오토박싱 & 언박싱 - 컴파일러가 자동으로 변환하는 코드를 넣어준다.
    • 오토박싱 : 기본형 값을 래퍼클래스의 객체로 자동 변환해주는 것
    • 언박싱 : 반대로 변환

 

 


유용한 클래스


⭐java.util.Objects클래스

  • Object클래스의 보조클래스로 모든 메서드가 'static'이다. 널 체크에 유용함
    • isNull() : 해당 객체가 널인지 확인
    • nonNull() : isNull()과 반대의 일을 함.
    • compare() : 두 비교대상이 같으면 0, 크면 양수, 작으면 음수 반환
    • Objects의 equals() :  + 내부적으로 null검사
    • deepEquals() : 문자열 배열을 비교
    • Objects의 toString() : + 내부적으로 null검사
    • Objects의 hashCode :  + 내부적으로 null검사

 

 

 

 

⭐java.util.Random클래스

  • 난수를 얻는 방법
  • 종자값을 System.currentTimeMillis()로 하기 때문에 실행할 때마다 얻는 난수가 달라진다.
  • 같은 종자값을 갖는 Random인스턴스는 시스템이나 실행시간 등에 관계 없이 항상 같은 순서로 반환할 것을 보장

 

 

 

 

⭐정규식 - java.util.regex패키지

  • 미리 정의된 기호와 문자를 이용해서 작성한 문자열
  • 정규식의 일부를 괄호로 묶어서 그룹화

 

 

 

 

⭐java.util.Scanner클래스

  • 화면, 파일, 문자열과 같은 입력소스로부터 문자데이터를 읽어오는데 도움을 줌
Scanner in = new Scanner(System.in);	// Scanner 객체 생성

byte a = in.nextByte(); 		// byte 형 입력 및 리턴
short b = in.nextShort(); 		// short 형 입력 및 리턴
int c = in.nextInt(); 			// int 형 입력 및 리턴
long d = in.nextLong(); 		// long 형 입력 및 리턴

float e = in.nextFloat(); 		// float 형 입력 및 리턴
double f = in.nextDouble(); 	// double 형 입력 및 리턴

boolean g = in.nextBoolean(); 	// boolean 형 입력 및 리턴

String h = in.next(); 			// String 형 입력 및 리턴 (공백을 기준으로 한 단어를 읽음)
String i = in.nextLine(); 		// String 형 입력 및 리턴 (개행을 기준으로 한 줄을 읽음)

 

 

 

 

⭐java.util.StringTokenizer클래스

  • 긴 문자열을 지정된 구분자를 기준으로 토큰이라는 여러 개의 문자열로 잘라내는데 사용된다.
  • StringTokenizer는 구분자로 단 하나의 문자 밖에 사용하지 못하기 때문에 복잡한 형태의 구분자로 문자열을 나눠야 할때는 정규식을 사용하는 메서드를 사용해야 한다.
  • split()과 StringTokenizer
    • split()은 빈문자열도 토큰으로 인식하나 StringTokenizer는 그렇지 않음
    • split()은 데이터를 토큰으로 잘라낸 결과를 배열에 담아서 반환 /  데이터를 토큰으로 바로바로 잘라서 반환하는 StringTokenizer 보다 성능이 떨어진다.

 

 

 

 

⭐java.math.BigInteger클래스