[우아한테크코스] 2일차 TIL

3 minute read

오늘의 공부한 것

  1. 문자열 계산기 완성하기
    • null 입력 시 nullPointerException으로 안넘겨져서 엥?? 했는데 없는 값을 isEmpty() 먼저 고민해서였다..ㅠㅜ
    • CsvSource에서 어떤 이유에서인지 matcher, pattern이 먹지 않아 한참 고민
    • 정규표현식에 포함되는 문자열이 그것을 구분자로 구분되지 않아 또 한참 고민
  2. 자동차 경주 게임 이름 객체 생성
    • test 코드로 carNames가 잘 생성되었는지 확인할 방법을 생각 중..
  3. 보이는 라디오 한시간 회의
    • 우리 페어는 설이 짓는거, cwm가 제 때 안 먹는 경우를 표현할 예정..

내일 해야할 일

  1. 자동차 경주 게임 페어랑 완성
    • 단위테스트와 리팩토링까지
  2. 페어랑 가상배경, 정확한 상황까지 생각하기
  3. 10:30 강의 열심히 듣기
  4. 2:00 포수타 잘 보내기
  5. 약속에 마음 앞서지 않고 마무리까지 페어랑 잘 하기 + 페어랑 마치고 우리가 고민 안한 부분 있는지 질문방 참고..

TIL

  1. null은 인자로 전달할 수 없는가?애 대해 검색하다 찾은 java의 인자 전달 방식
    • java는 인자를 CallByValue, CallByReference로 전달한다.
      parameter는 보통 함수가 전달받는 인자를, argument는 함수 내에서 선언하고 전달하는 인자를 말한다.
      syntax가 언어의 구문규칙이라면, semantics는 명령어를 생산해내는 지침이다.
      int hi = 1024;
      String ho = "string";
      

      위의 hi는 변수의 값이 1024인 반면, ho의 참조변수의 값은 포인터값으로 레퍼런스이다.

    • call-by-value 함수로 인자를 전달할때 전달될 argument의 결과를 대응 되는 함수의 변수로 복사해 본사된 값은 함수 내에서 지역적으로 사용되는 지역 값이다. caller는 복사하는 방식으로 인자를 넘겨줬기 때문에 callee 내에서 어떤 작업을 하더라도 caller에게는 영향이 없다.
      void swap(int f, int p){
      int tmp = f;
      f = p;
      p = tmp;
      }
      int main(){
      int x = 10;
      int y = 20;
      swap(x, y);
      }
      

      예시로 위와 같은 함수가 있을 때 x,y 와 f,p가 무관하다는 것이 있다.

  • call-by-reference 인자로 사용될 변수의 묵시적인 레퍼런스를 함수로 전달하는 것이다. 예시로 swap에서 직접적으로 x, y 변수 자체에 레퍼런스를 전달하는 것이다. java는 보통 이 메커니즘을 지원하지 않는다. 참조변수 자체의 레퍼런스(주소)를 얻을 수 있어야 하는데 그 방법이 없기 때문이다.

  • 결론적으로 java의 메서드 인자 전달 방식은 call-by-value로, 객체에 대한 포인터 값 또는 원시타입의 값을 말한다.

  1. 여러 인자를 이용해 split 하는 법
    • “1,2.3:4”.split(“, . :”) 위와 같이 구분자를 ‘ ‘로 구분해서 split할 수 있다.
  2. java의 정규표현식이란?
    • 정규표현식이란 특정한 규칙을 가진 문자열의 집합을 표현하기 위해 쓰이는 형식 언ㄴ어이다. 사용자가 형식에 맞게 입력했는지 검증할 때 유용하다.
    • 정규표현식은 자바의 java.util.regex 패키지를 이용한다.
      주로 Pattern 클래스와 Matcher 클ㄹ래스를 사용한다.
      • Pattern 클래스
    • compile(String regex): 정규표현식으로부터 패턴 생성
    • matcher(String text): text로부터 패턴에 대한 matcher 생성
    • split(String text): 문자열을 패턴에 따라 분리 (?? 확인 필요)
    • 상수
      • Pattern.CANON_EQ : None표준화된 매칭 모드를 활성화합니다.
      • Pattern.CASE_INSENSITIVE : 대소문자를 구분하지 않습니다.
      • Pattern.COMMENTS : 공백과 #으로 시작하는 주석이 무시됩니다. (라인의 끝까지).
      • Pattern.MULTILINE : 수식 ‘^’ 는 라인의 시작과, ‘$’ 는 라인의 끝과 match 됩니다.
      • Pattern.DOTALL : 수식 ‘.’과 모든 문자와 match 되고 ‘\n’ 도 match 에 포함됩니다.
      • Pattern.UNICODE_CASE : 유니코드를 기준으로 대소문자 구분 없이 match 시킵니다.
      • Pattern.UNIX_LINES : 수식 ‘.’ 과 ‘^’ 및 ‘$’의 match시에 한 라인의 끝을 의미하는 ‘\n’만 인식됩니다. - Matcher 클래스
    • matches(): 패턴과 일치할 경우 true
    • find(): 패턴과 일치할 경우 true, 위치로 이동
    • find(int start): 시작점부터 검색 수행
    • start(): 매칭되는 시작 위치 반환
    • end(): 매칭되는 종점 위치 반환
    • group(): 매칭된 부분 반환
    • group(int number): 해당하는 group의 매칭 부분 반환
    PATTERN = "//(.)\n(.*)"
    text = "//:\n1:2:3"
    Matcher matcher = Pattern.compile(PATTERN).matcher(text);
    if(matcher.find()){
        String delimiter = matcher.group(1);
        text = matcher.group(2);
    }

위와 같이 사용하면 delimiter에는 형식에 맞는 :가, text에는 1:2:3이 들어간다.

  • 정규표현식의 문법
    • ^ 문자열 시작
    • $ 문자열 종료
    • . 임의의 한 문자(\는 안됨)
      • 앞 문자가 없을 수도 무한일수도
      • 앞 문자가 하나 이상
    • ? 앞 문자가 없거나 하나
    • [] 문자의 집합이나 범위로 사이는 -, 앞에 ^있으면 not
    • {} 횟수나 범위
    • () 괄호 안을 하나의 문자로 인식
    • 패턴 속 연산 수행시 사용
    • ~ 는 나중에……
  1. JUnit 5
    • 5부터 test method에 접근지정자 필수로 달지 않아도 된다!! 뚫고 들어오기 때문이당
    • @Disabled 하면 해당 테스트는 넘어간다.
    • assertTrue, assertAll, assertEqual
      => 자세한 설명, 공식 문서
    • @ParameteredTest에 @ValueSource(strings = {“123”, “345”}), @CsvSource(value = {“123:6”, “456:15”}, delimiter = ‘:’) 이외에도
      @NullSource, @EmptySource, @NullAndEmptySource, @EnumSource, @MethodSource (메서드로 스트림과 같은 인자 전달)
      => 자세한 설명, 공식 문서