String 클래스
String은 클래스이다. 따라서 기본형이 아니라 참조형이다.
참조형은 변수에 계산할 수 있는 값이 들어있는 것 이 아니라 X001과 같이 계산할 수 없는 참조값이 들어있다.
따라서 원칙적으로 '+' 같은 연산을 사용할 수 없다
public class StringConcatMain {
public static void main(String[] args) {
String a = "hello";
String b = "world";
String result1 = a.concat(b);
String result2 = a + b; //
System.out.println(result1);
System.out.println(result2);
}
}
실행값 :
helloworld
helloworld
- 자바에서 문자열을 더할 때는 String이 제공하는 concat()과 같은 메서드를 사용해야 한다.
- 하지만 문자열은 너무 자주 다루어지기 떄문에 자바언어에서 편의상 특별히 +연산을 제공한다.
-비교
String 클래스 비교할 떄는 항상 equal() 비교를 해야한다.
복습
- 동일성(identity) ==연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인
- 동등성(Equality) eqauls()메서드를 사용하여 두 객체가 논리적으로 같은지 확인
public class StringEqualMain1 {
public static void main(String[] args) {
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("new String() ==비교 " + (str1 == str2));
System.out.println("new String() ==비교 " + (str1.equals(str2)));
String str3 = "hello";
String str4 = "hello";
System.out.println("리터럴 == 비교" +str3 ==str4); //true
System.out.println("리터럴 == 비교" +str3.equals(str4)); //true
}
}

- 문자열 리터럴을 사용하는 경우 자바는 메모리 효율성과 성능 최적화를 위해 문자열 풀을 사용
- 클래스에 리터럴이 있으면 문자열 풀에 String 인스턴스를 미리 만들어둔다. -이 때 같은 문자열이 있으면 만들지 않는다.
- 문자열 풀 덕분에 같은 문자를 사용하는 경우 메모리 사용ㅇ을 줄이고 문자를 만드는 시간도 줄어듬
-성능 최적화.
따라서 문자열 리터럴를 사용하는 경우에는 참조값이 같아지므로 == 비교가 true.
-불변 객체

- 불변으로 설계 되어있기 때문에 사이드 이펙트가 발생하지 않는다!
String str3 = "hello";
String str4 = "hello"; //if String str4 = "bye"
* 이 경우 같은 경우 또한 불변으로 설계 되어있기 때문에, 새로운 객체르 반환해서 돌려주기 때문에 사이드 이펙트가 발생하지 않는다.
String 클래스는 문자열을 편리하게 다루기 위한 다양한 메서드를 제공한다.
기능이 너무 많기 때문에 메서드를 외우기 보다는 주로 사용하는 메서드가 이런 것이 있구나 대략 알아두고, 필요할 때 검색해서 찾아보자 !
-메서드 체이닝 -Method Chaining
public class ValueAdder {
private int value;
public ValueAdder addValue(int addvValue) {
value += addvValue;
return this;
}
public int getValue() {
return value;
}
}
public class MethodChainingMain1 {
public static void main(String[] args) {
ValueAdder adder = new ValueAdder();
adder.add(1);
adder.add(2);
adder.add(3);
int result = adder.getValue();
System.out.println("result = " + result);
}
}
실행값 :
result = 6
- Main1에서는 add() 메서드를 여러번 호출해서 값을 누적해서 더하고 출력했다.
- add() 메서드의 반환값 x
public class MethodChainingMain2 {
public static void main(String[] args) {
ValueAdder adder = new ValueAdder();
ValueAdder adder1 = adder.add(1);
ValueAdder adder2 = adder1.add(2);
ValueAdder adder3 = adder2.add(3);
int result = adder3.getValue();
System.out.println("result = " + result);
}
}
실행값 :
result = 6
- Main2에서는 add() 메서드의 반환값을 사용했다.

add() 메서드는 자기 자신( this)의 참조값을 반환한다.
이 반환값을 adder1 , adder2 , adder3 에 보관 했다.
따라서 adder , adder1 , adder2 , adder3 은 모두 같은 참조값을 사용한다. 왜냐하면 add() 메서드가 자기 자신( this )의 참조값을 반환했기 때문이다.
지금 봤을 때는 Main1이 훨씬 직관적이다. 그럼 왜 이런 방식을 사용할까?
이번에는 바로 메서드 호출을 해보자.
public class MethodChainingMain3 {
public static void main(String[] args) {
ValueAdder adder = new ValueAdder();
int result = adder.addValue(1).addValue(2).addValue(3).getValue();
System.out.println(result);
}
add() 메서드를 호출하면 Valueadder인스턴스 자신의 참조값( x001 )이 반환된다. 이 반환된 참조값을 변수에 담아두지 않아도 된다. 대신에 반환된 참조값을 즉시 사용해서 바로 메서드를 호출할 수 있다.
adder.add(1).add(2).add(3).getValue() //value=0
x001.add(1).add(2).add(3).getValue() //value=0, x001.add(1)을 호출하면 그 결과로 x001
을 반환한다.
x001.add(2).add(3).getValue() //value=1, x001.add(2)을 호출하면 그 결과로 x001을 반환한
다.
x001.add(3).getValue() //value=3, x001.add(3)을 호출하면 그 결과로 x001을 반환한다.
x001.getValue() //value=6
6
메서드 호출의 결과로 자기 자신의 참조값을 반환하면, 반환된 참조값을 사용해서 메서드 호출을 계속 이어갈 수 있다.
코드를보면 `.` 을찍고메서드를 계속 연결해서 사용한다. 마치 메서드가 체인으로 연결된 것처럼 보인다.
이러한기법을 메서드 체이닝이라 한다.
메서드 체이닝 기법은 코드를 간결하고 읽기 쉽게 만들어준다.
“만드는 사람이 수고로우면 쓰는 사람이 편하고, 만드는 사람이 편하면 쓰는 사람이 수고롭다” 는 말이 있다.
메서드 체이닝은 구현하는 입장에서는 번거롭지만 사용하는 개발자는 편리해진다
참고로 자바의 라이브러이와 오픈 소스들은 메서드 체이닝 방식을 종종 사용한다.
조금 기본적인 내용이니 오늘은 간단히 정리하고 스킵 ^^..
'Language > ☕ Java' 카테고리의 다른 글
| [Java] 예외 처리 (Exception Handling) (0) | 2024.08.25 |
|---|---|
| [Java] 불변 객체 (0) | 2024.08.20 |
| [Java] Object 클래스 (0) | 2024.08.19 |
| [Java] 다형성 역할과 구현 예제 (0) | 2024.08.15 |
| [Java] 다형성 2 (0) | 2024.08.14 |