백엔드 부트캠프/TIL

[내일배움캠프Spring-10일차] 계산기 과제 Issue

sintory-04 2025. 2. 28. 20:39

    SwingLabel 텍스트 바꾸기

    1. 문제상황

    - swing을 처음 접하다 보니, 텍스트 라벨을 바꾸는 방법을 모르겠음.

    2. 문제 분석 및 해결 

    SwingLabel 을 선언 해 준후, 텍스트를 바꾸어주면 된다.

    JLabel label = new JLabel("기본 텍스트"); // label 생성
    label.setText("새로운 텍스트");  // 텍스트를 변경

    -> 클래스를 구분화시키기 위해 여러 클래스를 만들다 보니, SwingLabel 을 어떻게 접근할 지 고민했다. 이를 위해서 SwingUI.java의 속성에다가 private static으로 선언해서 모든 클래스에 공통으로 해당라벨 (즉, 결과값) 을 선언했다.

    public class SwingUI extends JFrame {
      public static JFrame frame;
      public static JLabel stateLabel;
    }

    stream 사용방법

    stream의 내용은 추후에 따로 포스팅 할 예정이다.

    1. 문제 상황

    - List 의 값을 하나의 String 값으로 표현하기 위해서 steram 사용을 고려해보았다.

    2. 문제 분석 및 해결 

    String textInput = inputNumberList
        .stream()
            .reduce("", (s1, s2) -> s1 + s2);

    여기서 reduce 라는 애가 궁금할텐데 누적합이라고 생각하면 쉽다.

    스트림 요소를 하나의 결과로 줄이는(축소하는) 연산, 즉 스트림의 모든 요소를 하나의 값으로 축소(집계)한다.

    T reduce(T identity, BinaryOperator<T> accumulator);

    ① 매개변수

    identity (초기값)

    • 연산을 시작할 때 기본으로 사용되는 값.
    • 연산이 없는 경우 그대로 반환됨.
    • 초기 값이 매우 중요한다!
      • 예를 들어 숫자 덧셈이면 0, 곱셈이면 1, 문자열 결합이면 ""가 적절하다.

    accumulator (누적 함수)

    • 스트림의 각 요소를 하나씩 받아서 연산을 수행하는 함수.
    • (acc, element) -> newValue 형태로 작성.

    ② 반환값

    • 최종 결과값 (T 타입) -> 제너릭한 함수란 것.

    ✅ 타입 매개변수 T 선언

    1. 문제상황

    num01num02 를 T로 선언하게 된다면,

    Double result = num01.doubleValue() + num02.doubleValue(); 이런식으로 연산해야지 Double로 형변환이 된다.

    그런데 T로 선언하게 되면, 빨간줄로 표시가 된다. 왜 안되는 것일까 ??

    2. 문제 분석 및 해결 

    • 타입 매개변수 T 로 선언하면 , doubleValue() 이런식으로 값을 뽑아야하고.
    • String 값을 바꿀려면 Double.valueOf(textInput); 이렇게 해야한다

    Staticpublic 다시 이해하기

    1. 문제상황 

    - static 메서드는 클래스 레벨에서 동작하기 때문에, 특정 인스턴스(this)에 접근할 수 없다.

    2. 문제 분석 및 해결 

    - 접근제어자는 다른 클래스에서 이 변수 및 메서드에 접근 할 수 있냐 없냐를 결정

    - static 은 클래스 단위로 선언된 변수 및 메서드를 다른 클래스와 공유 할거냐 말거냐.

    - 그러면 왜 static method 에 인스턴스 변수를 사용하면 안되냐?

    => 해당 인스턴스 변수, 즉 모든 값이 공유되지 않는 객체 별로 하나씩 있는 변수인 멤버변수는! 객체가 생성되었을 때 사용할 수 있는 것임.

    => 그런데 static 은 모든클래스 자체에서 호출된 것. 객체 별로 생성 안 되었을 때도 접근 가능 하다는 것. 그래서 this.num01 가 에러가 뜨는 것

    => ? 그러면 인스턴스 변수가 비어있을 경우.

    => 값이 비어있을 경우에는 해당 메서드에서는 클래스의 멤버변수에 접근할수 없는 것인가. > 객체가 존재하지 않으면 접근할 수 없다는 것이 핵심임.

    이런 것과 연관되는 오류로는 값이 없는데 리스트나 동작을 수행 하는 것 > 이 부분이 코드에서도 계속 에러가 뜨는 것 같음.

    ✅ Setter 로 값 조작하기

    튜터님께 개인적으로 질문을 드림.

    1. 문제 고민

    - Setter를 어떻게 활용할지

    2. 문제 분석 및 해결 

    ① 생성자를 만들어서 생성자에 속성 value1value2를 접어 넣어 계산 하는게 나을지

    • 이렇게 될 경우 반복문을 돌 때마다 매번 새로운 new Calculator() 객체를 만들어야함.

    ② 생성자는 비워두고, setter를 통해서 속성 value1valu2 에 접근하는게 나을지

    • 비어있는 객체가 만들어줌. 그 이후에 set 함수를 통해서 값을 바꾸어주는것이라 두번 동작.

    코드에서는 상황에 따라서 해당 동작이 좋을수도 아닐 수도 있다.

    다른 사람들이 구글에 코드를 많이 올렸다. 이 코드를 보면서 해당 Setter를 어떻게 동작했는지 찾아보는 것이 좋을 거 같다하셨다.

    -> 찾아보면 확실히 value1, value2 때문에 새로운 객체를 만든 사람은 없었던 거 같다. ( 애초에 Java class를 여러개 나누지는 않은 거 같다. )

    ✅ 이진탐색법

    - 1부터 100까지 숫자 중 랜덤한 숫자하나 뽑아서 가장 빨리 찾는 알고리즘을 찾는다.

    - 처음은 50을 기준으로 50보다 큰지 작은지 판별 후, 그 다음은 25, 12.5 이런식으로 접근한다고 함.

    String의 형변환

    1. 문제 고민

    - 형 변환 시, 매번 다른 타입들을 변환하다보니, 한 번 정리해주어겠다는 생각을 함.

    2. 문제 분석 및 해결   

    - StringDouble.valueOf(String) 해주면 Double이 된다.

    - 이와 마찬가지로 Integer.valueOf(String) 을 해주게 될시 Integer가 된다.

    +) Number 의 경우 Integer.valueOf(Number)직접 사용할 수 없음. Number는 부모 클래스이기 때문에, 직접 Integer.valueOf(Number)처럼 사용할 수 없다.

    - Number 일 경우 Integer.valueOf(Number.intValue()) 이런식으로 접근해야함.

    - 똑같은 로직으로 Float.valueOf(Number.floatValue()) , Double.valueOf(Number.doubleValue()) , Long.valueOf(Number.longValue()) 이런식으로 사용해야한다.

    ✅ 추가적으로 구현해야 할 부분

    1. 결과값을 보여줄 때 "num1" + "num2" = "결과값" > 이런식으로 되어야할 거 같음. 지금은 결과값만 보여지는 중.
    2. 값이 하나 있는 상태에서 "=" 을 두번 누르면 에러가 뜸. > 에러 해결 메시지 달것, 이거 외에도 추가적인 에러 해결해야함.
    3. C랑 CE 버튼 동작시키기
    4. < (하나 값 삭제) 버튼 동작시키기.

     오늘의 회고

    - 하루종일 레벨 3만 풀었던 거 같다.

    - Swing을 다루고 구현하는데 어려웠던 거 같다.

    - 튜터님께 질문을 했을 때, 의아했던 부분이 있다.

    - 나는 다른 사람들의 코드를 찾아보지는 않았다. 왜냐? 정답을 보는 느낌이 들었기 때문이다.

    - 근데 튜터님은 다른 사람들의 코드를 보면서 이게 좋은 코드인지 아닌지를 지금 당장은 모르더라도 보다보면 그 능력이 올라간다 하셨다.

    - Setter 같은 함수도 다른사람들의 함수를 보면서 다른 사람들은 어떻게 value 값을 조정하는지 찾아보는게 좋을 거 같다고 하셔서 이번 기회에 다른 사람 코드를 찾아보았다.

    - 아직은 다른 사람들의 코드를 읽는 게 어려워서 자세히 이해는 되지 않았지만, 그래도 어느정도 흐름은 이해가 갔다. 그래서 다른사람들의 코드 흐름을 읽었을 때 주의해서 봤던 부분이 있다.

    - 바로 결과값을 저장하는 변수이다. 나는 리스트로 선언했지만, 다른 사람들은 문자열로 선언한 것이 아닌가,, 그래서 나도 문자열로 한번 다뤄보고자 이번에 문자열로 수정했다. 아직까지는 리스트에 비해서는 덜 복잡해진 거 같아서 나쁘지 않은 거 같다.