[F-lab 모각코 챌린지 33일차] TIL

JeongheeKim·2023년 7월 4일

TIL

목록 보기
33/66

학습계획


  • System.out.println() 메소드가 성능에 영향을 미치는 이유와 대안
  • 제네릭 Type Erase

Today I Learned


System.out.println() 메소드가 성능에 영향을 미치는 이유와 대안

System.out.println()은 IO-operation이므로 System.out.println 작업이 종료될때가지 프로그램은 대기상태가 된다. 대안으로는 logging framework 있다.

logging framework는 logging 레벨 조정, 출력 형태(console, file등)을 설정할 수 있다.

클래스 로더 로딩 과정

  • Loading
    • 로드된 클래스 및 부모 클래스 정보, enum 관련 여부, 변수, 메소드 정보를 JVM에 올린다.
  • Verification
    • .class파일이 JVM명세에 맞게 작성되었는지 검증
  • Preparation
    • load된 메모리를 기본값으로 초기화하고, 클래스 변수를 위한 메모리에 할당
  • resolution
  • InitialIzation
    • static변수들이 정의된 값으로 초기화 됨

ArrayList의 첫 번째 위치에서 데이터를 삭제할 때와, 마지막 위치에서 데이터를 삭제할 때 시간 복잡도는?

  • 첫번째 위치 데이터 삭제 : O(n)
    • 첫번째 위치의 데이터를 삭제 후, 남아있는 요소를 앞으로 이동해야한다..
  • 마지막 위치 데이터 삭제 : O(1)
    • ArrayList는 데이터가 순차적으로 저장되므로 마지막 위치 데이터만 제거하면 된다.

❓ 와일드카드의 한계와 함정에 대해 설명해주세요. 와일드 카드를 사용하는 제네릭 코드에서 컴파일 타임에는 성공하고 런타임에 예상치 못한 오류가 발생하는 경우가 있나요? 그러한 경우를 예시와 함께 설명해주세요.

와일드 카드 사용 시 매개변수로 들어오는 경우 타입이 정해진다.

아래 예제는 컴파일 시 오류가 발생한다. List<?>은 다양한 타입의 리스트를 받을 수 있지만, 내부의 요소의 구체적인 타입에 대해 알 수 없다.

static void unsafeAdd(List<?> l1, List<?> l2) {
	l1.add(l2.get(0));
}

Java8이후 ArrayList초기화 방식

  1. 다이아몬드 연산자를 사용한 초기화 선언

    1. java8전에는 new ArrayList()과 같이 생성자 호출 시 타입을 명시해야했지만, java8이후부터는 다이아몬드 연산자로만 선언이 가능하다.

      List<String> list = new ArrayList<>();
  2. 스트림을 통한 초기화

    List<String> fruits = Stream.of("apple","durian","orange").collect(Collectors.toList());

Generic Type Erase

  • 제네릭으로 선언된 파라미터의 범위가 제한적이지 않은 경우 컴파일 시 타입제한을 강제하는 과정을 뜻한다.
  • 제네릭으로 선언된 파라미터의 범위가 제한적이지 않은 경우 (Object로 형변환?같은 느낌인가) 제한한다.
  • 확장된 제네릭 타입에서 다형성을 보장하기 위해 사용한다.
  • JDK1.5이후 등장했으므로 이전 버전의 코드에는 제네릭이 존재하지 않았다. Type Erase를 통해 모든 클래스의 조상인 Object로 타입으로 변환하여 하위 호환성을 유지한다.
public static <E> boolean containsElement(E [] elements, E element) {
        for (E e : elements) {
            if(e.equals(element)) {
                return true;
            }
        }
        return false;
    }

SQL문법

홀짝 구하기(postgreSQL, MySQL, Oracle)

select *
from Cinema
where description <> 'boring'
and mod(id,2) != 0
order by rating desc

mod(column_name, 2)== 0 일 경우 짝수 조건을 사용할 수 있다.

https://tableplus.com/blog/2019/09/select-rows-odd-even-value.html


완주하지 못한 선수(hash)

def solution(participant, completion):
    dict = {}
    for i in participant:
        if i in dict:
            dict[i] = dict[i] + 1
        else:
            dict[i] = 1
    for j in completion:
        dict[j] = dict[j] - 1
    for k in dict:
        if dict[k] != 0:
            return k
  • in , not in x in 리스트, 튜플, 문자열 x not in 리스트, 튜플, 문자열
  • 다른사람 풀이
    • 이미 1의 값을 가진 요소는 삭제해서 정답 리턴 시 첫번째 요소만 리턴할 수 있다.

      def solution(participant, completion):
          dict = {}
          for i in participant:
              if i in dict:
                  dict[i] = dict[i] + 1
              else:
                  dict[i] = 1
          for j in completion:
              if dict[j] == 1:
                  del(dict[j])
              else:
                  dict[j] = dict[j] -1
          answer = list(dict.keys())[0]
          return answer

      딕셔너리 요소를 정렬하여 같이 않을 경우 요소를 리턴하는 방식

      def solution(participant, completion):
          participant.sort()
          completion.sort()
          for i in range(len(completion)):
              if participant[i] != completion[i]:
                  return participant[i]
          return participant[len(participant) -1]

      [참고]

      https://stackoverflow.com/questions/8601831/do-not-use-system-out-println-in-server-side-code

      https://docs.oracle.com/javase/tutorial/java/generics/erasure.html

0개의 댓글