인프런 커뮤니티 질문&답변

개화동과자사장님의 프로필 이미지
개화동과자사장

작성한 질문수

김영한의 실전 자바 - 중급 1편

[3.StringClass][str.concat] concat질문 (p.8, p.15)

작성

·

230

1

[p.8 / str.concat 오류 이유 -> 불변]

하기 코드의 오류가 발생한 이유는 str.concat(" java")를 한 내용을 String타입의 변수로 담아주지 않았기 때문입니다.

package lang.string.immutable;
public class StringImmutable1 {
    public static void main(String[] args) {
        String str = "hello";
        str.concat(" java");
        System.out.println("str = " + str);
    }
}

 

그에 비해 반면, p.15의 concat부분이 이해가 되지 않습니다.

package lang.string.method;
public class StringChangeMain1 {
    public static void main(String[] args) {
        String str = "Hello, Java! Welcome to Java";
        System.out.println("인덱스 7부터의 부분 문자열: " + str.substring(7));
        System.out.println("인덱스 7부터 12까지의 부분 문자열: " + str.substring(7,
                12));
        System.out.println("문자열 결합: " + str.concat("!!!"));
        System.out.println("'Java'를 'World'로 대체: " + str.replace("Java",
                "World"));
        System.out.println("첫 번째 'Java'를 'World'으로 대체: " +
                str.replaceFirst("Java", "World"));
    }
}

상기에서 str.concat을 한것은 어떠한 String변수에도 담기지 않았습니다.

그럼에도 불구하고, str과 !!!가 합쳐져서 나온것을 볼 수 있습니다. 불변의 String 객체의 내용이 변수에 담지 않았음에도 불구하고 합쳐져서 나오는 이유는 무엇인가요? 궁금합니다!!

답변 1

1

안녕하세요. 개화동과자사장님, 공식 서포터즈 y2gcoder입니다.

불변객체는 연산결과를 새로운 객체로 반환한다는 것을 기억하시면 차이를 이해하시기 쉬우실 것 같습니다!

말씀해주신 p.8 에서는 str.concat()의 결과를 출력하지 않고, str 객체를 출력하고 있습니다. 불변 객체의 이러한 연산 메서드의 특징 중 하나는 대상 객체에는 영향을 주지 않는다는 것입니다. 그래서 대상 객체인 str을 출력했기 때문에 " java" 가 결합되지 않은 "hello"가 출력된 것입니다!

반면 p.15에서는 str.concat() 를 그대로 출력에 사용하고 있습니다. str.concat()의 반환 타입은 연산한 결과물(문자열, 새로운 String 객체)이기 때문에 "!!!"가 붙은 문자열이 출력되고 있습니다. 하지만 이 때도 str을 출력해보시면 원래의 문자열 그대로 출력되는 것을 보실 수 있습니다 🙂

 

감사합니다.

아 그렇네요 빠르게 답변주셔서 감사드립니다. 오늘도 좋은 하루 보내세요 !! 😊😊😊😊

좋은하루 보내십쇼!

개화동과자사장님의 프로필 이미지
개화동과자사장

작성한 질문수

질문하기