본문 바로가기
Today I Learned 2024. 4. 29.

(24.04.29)[3주차] CODE KATA 이슈 정리(String에 char붙이기), 과제 이슈 정리(불필요 초기화 중복)

과제 때문에 코드를 짜는데도 맞는지 검증하고, 또 제어자 때문에 헷갈려서 아직 갈길은 먼것 같아

자괴감이 너무 든다.


CODE KATA 이슈 정리

더보기
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

class Solution {
    public long solution(long n) {
          String str = String.valueOf(n);
        char[] charArr = str.toCharArray();
        ArrayList<Character> charList = new ArrayList<>();

        for (char c : charArr) {
            charList.add(c);
        }

        Collections.sort(charList);
        Collections.reverse(charList);

        String answerStr = "";

        for (char c : charList) {
            answerStr += c;
        }

        long answer = Long.parseLong(answerStr);
        
        return answer;
    }
}

charatcter 타입을 String으로 합치기 이슈

이슈

  • 스와핑을 사용해서 배열을 반대로 뒤집는 것을 하지 않으려곤 Collections 클래스의 reverse를 사용하도록 함
  • String 클래스의 concat 메서드를 쓰려고 character를 String으로 바꾸고 추가하려고 시도: answerStr.concat(String.valueOf(c)) 계속 에러가 발생

원인

  • String 은 char타입의 배열이라곤 할 수 있지만, 단순히 add  concat 메서드를 사용할 필요가 없음
    • concat은 말그대로 String끼리 붙이는 메서드이기 때문에 적합X

해결

  • String에 char타입 데이터를 더하고 싶을 때는 그냥 +=만 사용하면 간단하게 해결

과제 이슈 정리

초기화 중복

더보기

 

public class Calculator {
    /* 필드 생성*/
    private int num1;
    private int num2;
    private char operator;
    private Deque<Double> calculationResult;
    
    /* 초기화를 위한 기본 생성자 */
    public Calculator() {
        calculationResult = new LinkedList<>();
    }

...

}

이슈

  • 초기화 중복 주의 발생

원인

  • Calculator  클래스 내 변수 초기화를 위해서 private Deque<Double> calculationResult = new LinkedList<>(); 코드가 기본 생성자와 초기화를 두번하게 만들어버림
  • Calculator 클래스가 생성될 때 마다 초기화 시키기위해서 기본 생성자를 생성했을 때, 같은 작업을 두번하게 되는 상황

해결

  • 처음에는 빨간줄 그어지고 기본생성자가 잘못되었는줄 알고 이것저것 고쳐봤지만, 다시 한번 위에서 부터 읽어보다가클래스 속성 선언 즉 인스턴스 변수로 calculationResult 가 설정이 안되어있음을 발견 -> private Deque<Double> calculationResult;로 바꿔서 변수 선언으로 바꿈
    • 기본 생성자를 중간에 추가하고 바꾸는 것 보다는 속성(인스턴스 변수선언) + 생성자(초기화 등) + 기능(메서드) 이 순서대로 클래스가 한 덩어리임을 잊지를 말아야함
    • 자주 습관처럼 객체생성으로 초기화 + 기본생성자 이렇게 초기화를 시키는데 작동하는데 문제는 없지만(다른 클래스에서 객체 생성 할 때마다 초기화 하는거나 처음 로드할때 초기화 하는거나 똑같으므로) 쓸데없는 중복으로 코드가 비효율적으로 변함을 인지해야 + 명확하지 않은 초기화 이므로
  • 단, final 상수 일 경우 무조건 초기화 진행.

 


내일이 마지막 과제일이기 때문에 빠르게 코딩을 완성할 수 있도록.