본문 바로가기
Study/Java Study

자바스터디 6주차 (2)

by hongchii 2021. 6. 19.
728x90
반응형

2021.06.15 - [Study/Java Study] - 자바스터디 6주차 (1)

 

자바스터디 6주차 (1)

2021.06.13 - [Study/Java Study] - 자바스터디 5주차 (2) - [스터디관리 프로그램 구현] 자바스터디 5주차 (2) - [스터디관리 프로그램 구현] 2021.06.11 - [Study/Java Study] - [자바스터디] 5주차 (1) [객체지..

hong-chii.tistory.com

 

1. java.lang패키지

 

1.1 Object클래스

Object클래스는 모든 클래스의 최고 조상이기 때문에 object클래스의 멤버들은 모든 클래스에서 바로 사용가능하다.

Object클래스는 멤버변수는 없고 11개의 메서드만 가지고 있다.

 

https://kookyungmin.github.io/language/2018/06/11/java_20/

equals(Object obj)

매개변수로 객체의 참조변수를 받아서 비교하여 그 결과를 boolean값으로 알려 주는 역할을 한다.

public boolean equals(Object obj) {
	return (this==obj);
}

/*
* 두 객체의 같고 다름을 참고졉ㄴ수의 값으로 판단한다. 
* 그렇기때문에 서로 다른 두 객체를 equals메서드로 비교하면 항상 false를 결과로 얻게 된다.
*/

hashCode()

이 메서드는 해싱(hashing)기법에 사용되는 '해시함수(hash function)'를 구현한 것이다. 해싱은 데이터관리기법 중의 하나인데 다량의 데이터를 저장하고 검색하는 데 유용하다.

해시함수는 찾고자하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시코드(hash code)를 반환한다.

 

package Ch9;

public class HashCodeEx1 {

	public static void main(String[] args) {
		String str1 = new String("abc");
		String str2 = new String("abc");
		
		System.out.println(str1.equals(str2));
		System.out.println(str1.hashCode());
		System.out.println(str2.hashCode());
		System.out.println(System.identityHashCode(str1));
		System.out.println(System.identityHashCode(str2));
	}

}

/*실행결과
* true
* 96354
* 96354
* 2018699554
* 1311053135
*/

System.identityHashCode(Object x)는 Object클래스의 hashCode메서드처럼 객체의 주소값으로 해시코드를 생성하기 때문에 모든 객체에 대해 항상 다른 해시코드값을 반환할 것을 보장한다.

 

toString()

이 메서드는 인스턴스에 대한 정보를 문자열(String)로 제공할 목적으로 정의한 것이다. 인스턴스의 정보를 제공한다는 것은 대부분의 경우 인스턴스 변수에 저장된 값들을 문자열로 표현한다는 뜻이다.

public String toString(){
	return getClass().getName()+"@"+Integer.toHexString(hashCode());
}

 

 

clone()

이 메서드는 자신을 복제하여 새로운 인스턴스를 생성하는 일을 한다. Object클래스에 정의된 clone()은 단순히 인스턴스변수의 값만을 복사하기 때문에 참조타입의 인스턴스 변수가 있는 클래스는 완전한 인스턴스 복제가 이루어지지 않는다.

 

1.2 String클래스

String클래스는 문자열을 저장하고 이를 다루는데 필요한 메서드를 함께 제공한다.

 

변경 불가능한(immutable) 클래스

한번 생성된 String인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경할 수는 없다. 

'+'연산자를 이용해서 문자열을 결합하는 경우 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열("ab")이 담긴 String인스턴스가 생성된다.

참고, 덧셈연산자를 사용해서 문자열을 결합하는 것은 매 연산 시 마다 새로운 문자열을 가진 String인스턴스가 생성되어 메모리공간을 차지하게 되므로 가능한 한 결합횟수를 줄이는 것이 좋다.

문자열간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 String클래스 대신 StringBuffer클래스를 사용하는 것이 좋다. StringBuffer인스턴스에 저장된 문자열은 변경이 가능하므로 하나의 StringBuffer인스턴스만으로도 문자열을 다루는 것이 가능하다.

 

 

문자열의 비교

문자열을 만들 때는 두 가지 방법, 문자열 리터럴을 지정하는 방법과 String클래스의 생성자를 사용해서 만드는 방법이 있다.

package Ch9;

public class HashCodeEx1 {

	public static void main(String[] args) {
		String str1 = new String("abc");
		String str2 = new String("abc");
		
		System.out.println(str1.equals(str2));
		System.out.println(str1.hashCode());
		System.out.println(str2.hashCode());
		System.out.println(System.identityHashCode(str1));
		System.out.println(System.identityHashCode(str2));
	}

}

/*실행결과
* String str1 = "abc";
* String str2 = "abc";
* str1 == str2 ? true
* str1.equals(str2) ? true
*
* String str3 = new String("abc");
* String str4 = new String("abc");
* str3 == str4 ? false
* str3.equals(str4) ? true
*/

equals()를 사용했을 때는 두 문자열의 내용("abc")을 비교하기 때문에 두 경우 모두 true를 결과로 얻는다. 하지만 각 String인스턴스의 주소를 등가비교연산자 '=='로 비교했을때는 결과가 다르다.

 

 

String클래스의 생성자와 메서드

 

join()과 StringJoiner

join()은 여러 문자열 사이에 구분자를 넣어서 결합한다. 구분자로 문자열을 자르는 split()과 반대의 작업을 한다고 생각하면 된다.

String animals = "dog,cat,bear";
String[] arr = animals.split(","); // 문자열을 ','를 구분자로 나눠서 배열에 저장
String str = String.join("-", arr); // 배열의 문자열을 '-'로 구분해서 결합
System.out.println(str); // dog-cat-bear

java.util.StringJoiner클래스를 사용해서 문자열을 결합할 수도 있다.

package Ch9;

import java.util.StringJoiner;

public class StringEx4 {

	public static void main(String[] args) {
		String animals = "dog,cat,bear";
		String[] arr = animals.split(",");

		System.out.println(String.join("-", arr));

		StringJoiner sj = new StringJoiner("/", "[", "]");
		for (String s : arr)
			sj.add(s);

		System.out.println(sj.toString());
	}

}

/* 실행결과
* dog-cat-bear
*[dog/cat/bear]
*/

String.format()

String str = String.format("%d 더하기 %d는 %d입니다.", 3, 5, 3+5);
System.out.println(str); // 3 더하기 5는 8입니다.

 

기본형 값을 String으로 변환

기본형을 문자열로 변경하는 방법은 간단하다. 숫자에 빈 문자열""을 더해주기만 하면 된다.

이 외에도 valueOf()를 사용하는 방법도 있다. 성능은 valueOf()가 더 좋지만, 빈 문자열을 더하는 방법이 간단하고 편하기 때문에 성능향상이 필요한 경우에만 valueOf()를 쓰면 좋다.

int i = 100;
String str1 = i + ""; // 100을 "100"으로 변환하는 방법1
String str2 = String.valueOf(i); // 100을 "100"으로 변환하는 방법2

String을 기본형 값으로 변환

int i = Integer.parseInt("100"); // "100"을 100으로 변환하는 방법1
int i2 = Integer.valueOf("100"); // "100"을 100으로 변환하는 방법2

package Ch9;

public class StringEx6 {

	public static void main(String[] args) {
		int iVal = 100;
		String strVal = String.valueOf(iVal);

		double dVal = 200.0;
		String strVal2 = dVal + "";

		double sum = Integer.parseInt("+" + strVal) + Double.parseDouble(strVal2);

		double sum2 = Integer.valueOf(strVal) + Double.valueOf(strVal2);

		System.out.println(String.join("", strVal, "+", strVal2, "=") + sum);
		System.out.println(strVal + "+" + strVal2 + "=" + sum2);
	}

}

/* 실행결과
* 100+200.0=300.0
* 100+200.0=300.0
*/

 

int val = Integer.parseInt(" 123 ".trim()); // 문자열 양 끝의 공백을 제거 후 변환

 

1.3 StringBuffer클래스와 StringBuilder클래스

String클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없지만 StringBuffer클래스는 변경이 가능하다. 

내부적으로 문자열 편집을 위한 버퍼(buffer)를 가지고 있으며, StringBuffer인스턴스를 생성할 때 그 크기를 지정할 수 있다. 이때, 편집할 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다. 편집 중인 문자열이 버퍼의 길이를 넘어서게 되면 버퍼의 길이를 늘려주는 작업이 추가로 수행되어야하기 때문에 작업효율이 떨어진다.

 

StringBuffer의 생성자

StringBuffer클래스의 인스턴스를 생성할 때, 적절한 길이의 char형 배열이 생성되고, 이 배열은 문자열을 저장하고 편집하기 위한 공간(buffer)으로 사용된다. StringBuffer인스턴스를 생성할 때는 생성자 StringBuffer(int length)를 사용해서 StringBuffer인스턴스에 저장될 문자열의 길이를 고려하여 충분히 여유있는 크기로 지정하는 것이 좋다.

 

StringBuffer의 변경

String과 달리 StringBuffer는 내용을 변경할 수 있다. 

 

StringBuffer의 비교

StringBuffer클래스의 equals메서드를 사용해도 등가비교연산자(==)로 비교한 것과 같은 결과를 얻는다.

StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");

System.out.println(sb == sb2); // false
System.out.println(sb.equals(sb2)); // false

 

StringBuffer클래스의 생성자와 메서드

StringBuilder란?

StringBuffer는 멀티쓰레드에 안전하도록 동기화되어 있다. 동기화가 StringBuffer의 성능을 떨어뜨리는데 StringBuffer에서 쓰레드의 동기화만 뺀 StringBuilder가 새로 추가되었다. StringBuilder는 StringBuffer와 완전히 똑같은 기능으로 작성되어있다.

 

 

 

https://github.com/hongchii/Study_Java/tree/master/src/Ch9

 

hongchii/Study_Java

자바의 정석 예제 및 인프런 Java TPC. Contribute to hongchii/Study_Java development by creating an account on GitHub.

github.com

 

자바의 정석을 토대로 공부 후 정리한 내용입니다.

 

728x90
반응형

댓글