국비지원 자바수업을 시작한지 어느덧 2주가 지났습니다.
매일 오전 4시간동안 자바 수업을 듣고, 수업이 끝날때면 과제를 주시는데
생각을 꽤 해야하는 재밌는 문제를 주로 주셔서 항상 즐겁게 하고 있습니다.
마침 이번에는 간만에 비교적 간단한 과제를 주셔서, 해결책을 여러개 만들어 보았습니다.
금주 금요일의 과제
일단 내가 손으로 ' , ' 를 붙인다면 어떤 절차로 할까 하고 잠시 생각해 보았습니다. 저는 뒤에서 부터 숫자를 세자리씩 세면서 콤마를 붙이기 때문에 일단 생각대로 구현해보기로 했습니다.
또한, 금요일 수업에서 배운게 String 클래스기 때문에, 새로배운 charAt()을 통해 각 자리 숫자를 읽어오기로 했습니다.
예상대로 거꾸로 출력되는 모습
뒤에서 부터 숫자를 셌으니, 당연하게도 숫자가 뒤에서부터 출력이 되었습니다. 세자리 마다 쉼표를 찍지만, 6자리라고 해서 ,123,456 처럼 쉼표를 찍으면 안되니, if문 안에 조건을 하나 더 걸어줬습니다.
String 배열은 0부터 존재하지만, length()는 문자열의 길이를 1부터 세기 때문에, 그걸 맞춰주기 위해 -1이 필요합니다.
이제, 저 새로 만든 String 을 어떻게 반대로 출력할 것인가에 대해 생각해봐야 합니다.
- 당일 수업시간에 문자열뒤집기에 대해 배웠기때문에, 뒤집어볼까 생각을 했지만 String 변수를 하나 더 만들기는 자원이 아깝단 생각이 들었습니다.
- for 문이 도는동안 읽는 족족 print를 해볼까도 생각 했지만, 뒤에서 부터 읽다보니 한계가 있었습니다.
- for문을 하나 더 쓰지만, 어차피 새로운 String을 만들어도 값을 넣기 위해 같은 숫자만큼의 반복작업이 필요하다 생각해서, 거꾸로 만들어놓은 String을 다시 거꾸로 읽으며 프린트 하는 선 에서 타협했습니다.
그렇게 첫번째로 완성한 과제
여기서 몇가지 보안점을 생각해봤습니다. 금요일 수업시간에 선생님께서 String과 StringBuffer를 비교해주시며, 둘 사이에 엄청난 성능 차이가 있다고 말씀해주셨습니다. 선생님을 따라 "a"를 뒤에 계속 붙이는 실험을 하며 a의 숫자를 늘리고, 시간을 재는 실험도 했었습니다. a를 많이 붙일수록 성능차이는 기하급수적으로 올랐습니다.
수업 종료후 궁금증에 그 이유에 대해 검색을 해봤는데, 성능차이에 대한 여기에서 짧게만 설명하고 가자면, String의 '불변성' (In Java, String is a final and immutable class, which makes it the most special) 때문 입니다. 문자열 뒤에 문자를 더 붙이면 수정되는 것처럼 보여도 그게 사실은 항상 새로운 String을 만드는 과정이었고, 그로인해 성능에서 극악의 모습을 보였습니다.
- 이번에는 StringBuffer를 써봐야겠다. ( 수업시간에는 "a" 에 "a" 를 붙이는 실험만 해서 제가 사용법을 잘 몰라, a 라는 이름을 가진 StringBuffer를 "b" 라는 값을 갖도록 선언 한 후, "c"를 뒤에 계속 붙이도록 해서 용법을 연습했습니다)
- 뒤에서 부터 세다 보니, for 문을 한번 더 써야 되는 번거로움이 있기때문에, 앞에서 부터 문자열을 읽으며 쉼표를 작성하도록 새로 구상 해 보았습니다. 총 문자열의 길이에서 해당 자리의 번호를 빼고 3으로 나눠 떨어지는 지를 검사하도록 해서, 쉼표 찍는 자리를 정했습니다.
개선이 이루어진 두번째 버전
이렇게 만들어 놓고 보니, 굳이 새로운 스트링을 만들어서 값을 저장 하지 않아도 숫자를 출력하는 데는 무리가 없겠단 생각이 들었습니다. 그래서 str2 관련 내용을 모두 지우고, 그때그때 프린트 하도록 바꿔보았습니다.
새로운 String 생성 없이, 출력만 하도록 구현한 세번째 버전
수업시간에 간단히 짚고 넘어갔던 내용(StringBuffer)이지만 성능향상을 위해 응용한 [두번째 버전]과,
나름 최소한의 리소스를 사용하도록 노력 했던 [세번째 버전] 중에 선생님이 어느쪽을 선호하실지는 잘 모르겠습니다.
과제를 제출할때마다, 나름대로의 개선 했던 중간 내용들은 항상 기억 어딘가에 묻힌채 사라지고 최종 source 만이 남아 아쉬웠는데, 처음으로 그 과정을 기록해보니 재미가 있어 다음에 또 과제를 올릴 것 같습니다
'Programming > Java' 카테고리의 다른 글
javax.mail 이용해 이메일 보내기 (2) | 2021.02.17 |
---|---|
iText 활용한 pdf 파일 작성하기 (0) | 2021.01.24 |
게시판 페이징 처리하기 (0) | 2020.12.20 |
클래스 자유생성 과제 (0) | 2020.12.06 |
1. 논리형 type ' boolean '은 왜 1bit가 아닌 1byte의 크기를 가질까? (0) | 2020.11.21 |