복잡한 거 아니니깐 빠르게 알아보자!
1. String 더하기
단순하지만 강력한 방법이다
다만.. 복잡시럽게 보일 수 있다는 단점 존재
2. printf
C언어를 배웠다면 익숙한 그 printf문법
당연히 패딩넣기도 된다.
다만 %p, %x등의 메모리 관련 포맷형식을 사용하면 UnknownFormatConversion 예외가 발생한다
자바만의 특이점으로는 %h를 통해 메모리해시값을 얻을 수 있다. 슬프지만 당연하게도 Primitive type은 메모리주소를 알 수 없다
3. String.format()
printf와 비슷하게 형식을 지정할 수 있다
그럼 차이점이 뭐야? 할 수 있는데, printf는 포맷팅 동시에 출력이 되는 방식이고, String.format은 반환형인 String으로 만들어서 재사용한다던지, 좀 더 가공을 한다던지 할 수 있다
iteration하는 도중에 현재처리하는 객체의 정보를 받아서 처리하거나 함수형태로 전달할 수도 있다
그리고 Locale인자를 맨 앞에 받아서 여러 국가별 처리(i18n - internationalization)도 할 수 있다
보통 Locale로 영향 받는건 통화, 날짜, 숫자 정도이다
특정 국가는 3자리간 구분기호로 ,가 아닌 .을 사용하고 소수점은 .가 아닌 ,를 사용하기도 한다
4. Text block.formatted()
자바13버전부터 도입된 기능이다
String.format과 유사하지만, multi line을 쓸 수 있다던지(안내메시지) 위의 예제코드처럼 %s, %d 등을 활용해서 포맷팅 처리할수도 있다. 거의 함께 trim()이 사용된다
5. StringBuilder
이름과 걸맞게 String을 Build해주는 녀석이다
자동적으로 String 포맷으로 다 변환을 해주기때문에 %d, %f, %s 이런 형식을 사용하지 않아도 된다
- String.format() vs StringBuilder
String.format은 일단 1줄에 표시할 수 있기 때문에 가독성이 더 뛰어나다. 그리고 %2.f %10d등 다양한 포맷팅을 지원한다
StringBuilder는 여러줄로 표현해야 하기 때문에 가독성이 뛰어나지 않다. 또한 단순히 문자열로만 표현해주기때문에 기능이 제한적이다
6. MessageFormat
MessageFormat의 format에서는 placeholder를 지원하기 때문에 위치 기반으로 변수를 입력할 수 있다
또한 객체 기반의 포맷팅을 지원하기 때문에 배열이나 리스트 등의 객체에서 값을 쉽게 삽입할 수 있다
또한 국제화도 지원한다
7. MessageFormat More
2차원배열에서의 사용 예.
어디에 어떤 값이 꽂힐지 예상이 쉽지 않기 때문에 사실 좋아하는 코드는 아니다.
그리고 현업에서 배열보다는 리스트를 더 많이 사용하기 때문에 뭐.. 단순히 알고리즘 풀때정도야 사용할 수 있을 것 같다
클래스를 만들어봤다
place holder에 값을 담아서 출력할 수 있다
Locale과 다양한 Format과 함께 사용한 예제코드이다
MessageFormat은 NumberFormat, DateFormat 등과 같이 사용할 수 있는 Format의 구현체이지만 조금 특이한 성질을 갖고 있다
다른 Formatter들과는 다르게 복합 형식(composite format)을 처리하는 클래스이다. 여러개의 서브 포맷터(DateFormat, NumberFormat, ChoiceFormat 등)를 결합하여 하나의 메시지 형식을 만들어낸다
자바는 왜 아직도...?
자바스크립트에서 지원하는 Template Literal
앵귤러에서 지원하는 String Interpolation(문자열 보간)
코틀린에서 지원하는 String Interpolation(문자열 보간)
파이썬에서 지원하는 f-String
그럼 왜 자바는 아직도 String Interpolation을 지원하지 않을까?에 대해서 Chat gpt한테 한번 물어봤다
말을 들어보니 그럴수도 있을 것 같다. 컴파일러도 다시 만들어야하고, 여러 버전과의 호환성, 초기 설계, 그리고 전 국가적으로 다양하게 해석되는 점..등등.. 보수적으로 변할 수 밖에 없고, 지원을 망설이는 이유도 알 수 있었다
1. Java의 설계 철학과 초기 설계
Java는 1990년대 초에 설계되었고, 당시의 목표는 안정성, 성능, 그리고 플랫폼 독립성을 강조하는 것이었습니다. 이러한 설계 목표로 인해, Java는 간결하고 명확한 구문을 추구하기보다는 안정성과 호환성을 우선시했습니다. 따라서, 변수 삽입이나 String Interpolation 같은 기능보다는 명확하게 포맷팅 메서드를 사용하는 것을 선호했습니다.
2. 기존의 호환성과 유지보수
Java는 다양한 버전이 긴 기간 동안 사용되어 왔고, 특히 기업 환경에서 중요한 역할을 해왔습니다. 이러한 상황에서는 새로운 기능을 도입할 때 기존 코드와의 호환성을 매우 신중하게 고려해야 합니다. 새로운 구문이나 기능이 기존 코드와 충돌할 가능성이 있으면, Java 커뮤니티는 이를 쉽게 받아들이지 않습니다.
3. 문자열 처리에 대한 기존의 접근 방식
Java에서는 String.format이나 MessageFormat과 같은 포맷팅 메서드를 통해 문자열 처리의 유연성을 제공합니다. 이 방식은 초기부터 사용되어 왔으며, 개발자들에게 친숙합니다. 또한, 이 방식은 다양한 데이터 타입을 안전하게 처리할 수 있는 방법을 제공하며, 명시적인 형식 지정자를 통해 오류를 줄일 수 있습니다.
4. 언어의 진화
다른 언어들은 Java보다 나중에 설계되었거나, Java의 발전 이후 등장하여 더 현대적인 구문을 도입했습니다. 예를 들어, JavaScript의 템플릿 리터럴(Text Literal)이나 Kotlin의 문자열 템플릿은 이 언어들이 설계될 당시 최신의 편리한 기능을 제공하려는 시도의 일환입니다.
5. Java의 대응
Java는 보수적으로 진화해 왔지만, 최근 몇 년 동안 다양한 편의 기능들을 도입하고 있습니다. 예를 들어, switch 표현식, var 키워드, Text Blocks 등은 Java가 보다 현대적인 기능들을 수용하려는 움직임을 보여줍니다.
6. Java의 미래
Java 커뮤니티는 신중하게 새로운 기능들을 도입하고 있습니다. 공식적으로는 아직 String Interpolation이 도입되지 않았지만, 이러한 피드백을 통해 언젠가는 Java도 더 직관적인 문자열 삽입 기능을 제공할 가능성도 있습니다.
호환성
1. 기존 코드와의 충돌 가능성
Java는 전 세계적으로 수십억 줄의 코드가 운영 중이며, 이 코드들은 다양한 환경에서 실행됩니다. 새로운 기능이 추가될 때, 기존 코드를 깨
뜨리지 않는 것이 매우 중요합니다. 예를 들어, 만약 String Interpolation 구문이 추가된다고 가정해 보겠습니다.
String name = "John";
String greeting = "Hello, ${name}";
이러한 새로운 구문이 도입된다면, 기존 코드에서 이미 사용 중인 $나 {} 구문과 충돌할 수 있습니다. 예를 들어, 다음과 같은 코드가 있다고 가정해보겠습니다.
String template = "Price: ${cost}";
이 코드는 현재는 단순한 문자열로 해석되지만, 새로운 구문이 도입되면 문자열 템플릿으로 해석될 수 있습니다. 이는 기존 코드의 동작을 변경시킬 수 있으며, 예기치 않은 버그를 일으킬 수 있습니다.
2. 컴파일러의 복잡성 증가
새로운 기능을 도입할 때는 컴파일러가 이를 올바르게 처리할 수 있어야 합니다. String Interpolation을 도입할 경우, 컴파일러는 새로운 구문을 파싱하고, 적절하게 기존 구문과 구분해야 합니다. 이는 컴파일러의 복잡성을 증가시키며, 새로운 버그를 도입할 가능성도 높아집니다.
3. 런타임 라이브러리와의 호환성
Java의 표준 라이브러리와 많은 써드파티 라이브러리들이 이미 특정 방식으로 설계되어 있습니다. 새로운 기능이 도입되면, 이러한 라이브러리들도 새로운 구문을 지원할 수 있도록 업데이트되어야 합니다. 이 과정에서 많은 호환성 문제가 발생할 수 있습니다.
4. 교육과 학습 비용
Java는 기업에서 널리 사용되고 있으며, 많은 개발자들이 이미 Java의 현재 기능을 기반으로 코드를 작성하고 있습니다. 새로운 구문이 도입되면, 모든 개발자들이 이를 학습해야 하고, 기업 내부적으로도 새로운 기능을 도입하기 위해서는 코드 리뷰, 교육, 문서화 등 추가적인 작업이 필요합니다.
5. 기존 개발 도구와의 통합 문제
Java의 개발 도구 생태계는 매우 방대합니다. IDE, 빌드 도구, 린터, 정적 분석 도구 등은 모두 Java의 현재 구문을 기반으로 설계되어 있습니다. 새로운 기능이 도입되면, 이러한 도구들도 이를 지원하기 위해 업데이트되어야 합니다. 이 과정에서 일관성 문제나 도구 간의 호환성 문제가 발생할 수 있습니다.
'Program Language > Java' 카테고리의 다른 글
Mutable/Immutable Object의 Value를 계속 변경하면 무슨 일이 발생할까? (feat. VisualVM, GC) (0) | 2024.08.27 |
---|---|
자바에서 두 변수 값 바꾸기(Swap, Generic, Wrapper) (0) | 2024.08.24 |
Reference type(Mutable Object)의 Call By Value 살펴보기 2 (0) | 2024.08.23 |
댓글