Java 기본(4) - Object / String 클래스

김정욱·2021년 6월 18일
1

Java

목록 보기
4/13
post-thumbnail

ref :
https://www.youtube.com/watch?v=NI6QZy6juc8&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=104
https://www.youtube.com/watch?v=GfYg3imRZsc&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=103

Object 클래스

[ 설명 ]

  • 모든 클래스최고 조상
  • 11개의 메서드를 가지고 있음
    • clone() : 객체의 복사본반환 / protected 라서 public 으로 오버라이딩필수
    • equals() : 같은 객체인지 비교
    • finalize() : 거의 사용할 일 X
    • getClass() : 클래스 정보를 담고있는 class 인스턴스반환
    • hashCode() : 객체 자신의 해시코드 반환
    • toString() : 객체 자신의 정보문자열반환
    • notfy() / notifyAll() / wait() : 쓰레드 관련 메서드
  • 주 사용
    • clone() / equals() / hashCode() / toString()override 해서 자주 사용함

[ 메서드 ]

equlas(Object obj)

  • 원형
    • 객체 자신(this)주어진 객체(obj)주소비교
      --> == 를 사용한 비교와 결과가 동일
    • 같으면 true / 다르면 false
  • 주 사용
    • 객체의 값을 비교하기 위해 override해서 사용 --> 논리적 동등을 비교하는 것목적으로 둠
    • 미리 정의된 객체이미 오버라이딩 되어 있으므로 논리적 값을 비교할 수 있음
    • 직접 만든 객체직접 오버라이딩을 해줘야 함
      (오버라이딩 할 때 반환값, 매개변수반드시 같아야 함)

hashCode()

  • 객체의 주소해시코드(hash code)반환하는 메서드
  • Object 클래스의 hashCode()객체의 주소int로 변환해서 반환
  • equals()오버라이딩 하면, hashCode()반드시 오버라이딩 해야함
    --> equals()의 결과true인 두 객체해시코드값이 같아야 하기 때문

  • 원형
    • native method : C언어로 이미 작성된 함수, java에서는 기능을 사용만 가능
public class Object{
  ...
  /* 네이티브 메서드 : C언어로 작성된 OS의 메서드 */
  public native int hashCode(); // 32bit JVM에서는 주소가 4byte라서 반환값이 int
                               // 64bit JVM이라서 long이 되지는 않음 --> 이미 널리 사용
                               // 대신 값의 중복이 발생할 수 있다는 것을 알아두자
}

  • 오버라이딩
@Override
public int hashCode() {
  // 매개변수가 가변인자 라서 호출시 다수를 넘길 수 있음
  return Objects.hash(kind, number); // king, number은 객체의 iv
}

  • System.identityHashCode()
    • 객체마다 다른 해시코드반환
    • 오버라이딩 하지 않은 Object.hashCode() 처럼 동작

toString()

  • 객체문자열(String)변환하기 위한 메서드
  • 원형
    • 딱히 유용하게 사용될 수 없는 반환값임 --> 오버라이딩 해서 사용해야 함
public String toString() {
  return getClass().getName()+"@" + Integer.toHexString(hashCode());
}

  • 오버라이딩
    • iv(인스턴스 변수)문자열로 보여주는 방식으로 보통 오버라이딩 수행
public String toString() {
  /* iv(인스턴스 변수)들을 문자열로 표현해주는 방식으로 보통 오버라이딩 함 */
  return "kind : " + kind + ", number : " + number;
}

String 클래스

[ 설명 ]

  • 개념
    • 문자열을 다루기 위한 클래스
  • 구성
    • 데이터(char[])
    • 메서드(문자열 관련)
  • 특징
    • 불변(immutable) 객체 : 내용을 변경할 수 없음, 새로운 값을 가진 객체를 반환할 뿐
    • 덧셈 연산자(+)를 이용한 문자열 결합 성능이 떨어짐
      : 문자열의 결합이나 변경이 잦으면, 변경이 가능한(mutable) StringBuffer 사용 권장

[ 문자열 비교 ]

  • String 사용 2가지 방법
    • 문자열 리터럴 사용
      • String str = "abc"
      • 문자열 리터럴메모리에 할당하고 해당 주소값String이 가리키게 됨
      • 같은 문자열 리터럴 값을 가진다면, 같은 문자열 리터럴에 대한 주소값을 가지고 있는 것
    • 객체 생성
      • String str = new String("abc")
      • 새로운 인스턴스생성하고 인스턴스의 값할당
      • 값이 같아도 실제 인스턴스다르다
  • 동등 연산자를 통한 비교(==)
    • 문자열 리터럴 : 같은 주소값이기 때문에 true
    • 객체 생성 : 주소값은 다르기 때문false
  • 정리
    • 문자열 리터럴은 어차피 내용 변경이 불가능
      --> 굳이 String을 객체로 생성하지 않아도 됨
      --> 문자열 리터럴 방식으로 String 사용해도 충분함
    • 어떤 경우의 생성이든, 문자열에 대한 값을 비교하려면 equals()를 통한 비교 필요

[ 빈 문자열 ]

  • "" 처럼 아무것도 없는 문자열을 빈 문자열 이라고 한다
  • 크기가 0char형 배열저장하는 문자열 로 해석 가능
  • 초기값
    • String의 초기 값기본 값인 null로 하는 것 보다, ""빈 문자열로 하는 것이 좋음
    • char의 초기 값기본 값\u0000 보다, ' ' 공백으로 하는 것이 좋음

[ 생성자 ]

String(char[] value)

  • char[] ---> String 으로 변환할 때 사용
  • String ---> char[] 으로 변환할 때에는 toCharArray()를 사용하면 됨
char[] c = {'H', 'e', 'l', 'l', 'o'};
String str = new String(c); // str = "Hello"

String(StringBuffer buf)

  • StringBuffer ----> String 으로 변환할 때 사용
StringBuffer sb = new StringBuffer("Hello");
String str = new String(sb); // str = "Hello";

[ 메서드 ]

char charAt(int index)

  • String에서 index에 해당하는 부분char로 반환
String s = "Hello";
char c = s.charAt(1); // c = 'e';

int compareTo(String str)

  • ComparablecompareTo오버라이딩 한 것
  • 문자열사전 순서로 비교하는 데 사용
  • 정렬을 할 때 함께 사용됨
  • 결과
    • 같으면 : 0 반환
    • 이전이면 : -1 반환
    • 다음이면 : 1 반환
int i1 = "aaa".compareTo("aaa"); // i1 = 0
int i2 = "aaa".compareTo("bbb"); // i2 = -1
int i3 = "bbb".compareTo("aaa"); // i3 = 1

String concat(String str)

  • 문자열(str)뒤에 덧붙이는 기능
String s = "Hello";
String str = s.concat(" World"); // str = "Hello World";

boolean contains(charSequence s)

  • 지정된 문자열(s)포함되어있는지 검사
  • charSequence문자열 관련 인터페이스라서 다음 목록들을 받을 수 있음
    • charBuffer
    • Segment
    • String
    • StringBuffer
    • StringBuilder
  • 결과 : true / false
String s = "abcdef";
boolean r = s.contains("bc"); // r = true

boolean endsWith(String suffix)

  • 지정된 문자열(suffix)끝나는지 검사
String file = "Hello.txt";
boolean r = file.endsWith(txt); // r = true

boolean startsWith(String prefix)

  • 지정된 문자열(prefix)시작하는지 검사
String file = "Hello.txt";
boolean r = file.startsWith(Hello); // r = true

boolean equals(Object obj)

  • Objectequals()오버라이딩 한 것
  • 인스턴스 자체가 아니라 값을 비교하는 기능
String s = "Hello";
boolean b = s.equals("Hello"); // b = true
boolean b2 = s.equals("hello"); // b2 = false

boolean equalsIgnoreCase(String str)

  • 문자열String 인스턴스문자열을 대소문자 구분 없이 비교
String s = "Hello";
boolean b = s.equalsIgnoreCase("HELLO"); // b = true
boolean b2 = s.equalsIgnoreCase("heLLO");  // b2 = true

int indexOf()

  • 다양한 매개변수 타입
    • int indexOf(int ch)
    • int indexOf(int ch, int pos)
    • int indexOf(String str)
  • 주어진 문자(ch)문자열존재하는지 확인하여 위치(index)를 반환
  • 없으면 -1을 반환, 있으면 인덱스값을 반환
  • 두번째 매개변수를 사용해서 시작 위치를 지정할 수도 있음
  • 문자열(str)을 검색할 수도 있음
/* 특정 문자(ch)를 탐색해서 인덱스 반환 */
String s = "Hello";
int idx1 = s.indexOf('o'); // idx1 = 4
int idx2 = s.indexOf('k'); // idx2 = -1


/* 두번째 매개변수로 검색 시작 위치를 인덱스로 지정할 수 있음 */
int idx3 = s.indexOf('e', 0); // idx3 = 1
int idx4 = s.indexOf('e', 2) // idx4 = -1 


/* 특정 문자열(str)을 탐색해서 인덱스 반환 */
String s2 = "Spring";
int idx5 = s2.indexOf("ing"); // idx5 = 3

int lastIndexOf()

  • 다양한 매개변수 타입
    • int lastIndexOf(int ch) : ch뒤에부터 탐색
    • int lastIndexOf(String str) : str뒤에부터 탐색
  • 인덱스 번호앞과 동일하게 취급 (뒤에서 검색한다고 뒤부터 세지 X)

int length()

  • 문자열의 길이 반환
String s = "java";
int len = s.length(); // len = 4

String[] split()

  • 다양한 매개변수 타입
    • String[] split(String regex)
      : 지정된 분리자(regex)나누어 문자열 배열에 담아 반환
    • String[] split(String regex, int limit)
      : 지정된 분리자(regex)나누어 문자열 배열에 담아 반환 / 전체 길이limit 로 제한
  • regex : 정규식(Regular Expression) 을 의미
String animals = "dog, cat, bear";
String[] arr = animals.split(",");
// arr[0] = dog
// arr[1] = cat
// arr[2] = bear

String[] arr2 = animals.split(",", 2); // 2개 배열 요소로 나눔
// arr[0] = dob
// arr[1] = cat,bear

String substring()

  • 다양한 매개변수 타입
    • String substring(int begin)
    • String substring(int begin, int end)
      : begin부터 end 전까지 문자열을 자름
String s = "java.lang.Object";
String c = s.substring(10); // c = "Object"
String p = s.substring(5, 9) // p = "lang"

String toLowerCase() / String toUpperCase()

  • String toLowerCase() : 모든 문자열을 소문자로 변환
  • Stirng toUpperCase() : 모든 문자열을 대문자로 변환
String s = "Hello";
String s2 = s.toLowerCase(); // s1 = "hello"
String s3 = s.toUpperCase(); // s2 = "HELLO"

String trim()

  • 문자열왼쪽 끝오른쪽 끝에 있는 공백을 없앤 결과를 반환
    (문자열 중간에 있는 공백제거되지 않음)
String s = " Hello World ";
String s1 = s.trim(); // s1 = "Hello World"

static String valueOf()

  • 매개변수 타입String으로 바꿔 반환
  • 다양한 매개변수 타입
    • static String valueOf(boolean b)
    • static String valueOf(char c)
    • static String valueOf(int i)
    • static String valueOf(long l)
    • static String valueOf(float f)
    • static String valueOf(double d)
    • static String valueOf(Object o)
      : 참조변수의 경우 toString() 을 호출한 결과를 반환
String b = String.valueOf(true); // "true" 
String c = String.valueOf('a'); // "a"
String i = String.valueOf(100); // "100"
String l = String.valueOf(100L); // "100"
String f = String.valueOf(10f); // "10.0"
String d = String.valueOf(10.0); // "10.0"

static String join()

  • 특정 delimiter배열의 문자열결합하는 기능
  • 원형
    • static String join(CharSequence delimiter, CharSequence... elements)
String naimals = "dog,cat,bear";
String[] arr = animals.split(",");
String str = String.join("-", arr); // arr = "dog-cat-bear"

[ 문자열과 기본형 변환 ]

  • 기본형 --> 문자열
    • String.valueOf()로 변환 가능
  • 문자열 --> 기본형
    • 각 래퍼클래스parse___() 메서드기존에 존재했다
    • 최근에는 valueOf()모두 통일되었다
    • 즉, 문자열 <--> 기본형 모두 각 래퍼클래스.valueOf()변환 가능
  • valueOf()사실 반환형래퍼 클래스이다
    --> 오토박싱으로 기본형으로 알아서 변환
  • 오토박싱
    • 래퍼클래스 <---> 기본형 간에 변환을 알아서 해줌
/* 숫자 --> 문자열
  성능은 방법 2가 더 빠름!, 그러나 1번이 더 편리함 */
int i = 100;
String str1 = i + ""; // 방법 1
String str2 = String.valueOf(i); // 방법 2


/* 문자열 --> 숫자 
   valueOf()가 더 최신 방법 */
int i = Integer.pareInt("100"); // 방법 1
int i2 = Integer.valueOf("100"); // 방법 2
profile
Developer & PhotoGrapher

0개의 댓글