본문 바로가기
기술면접/JAVA 관련 기술면접

[JAVA 기술면접] 라이브러리 활용

by 거북이의 기술블로그 2024. 10. 24.

java.base 모듈

  • 기본으로 가지고 있는 java 모듈
종류
- java.lang : Java 기본클래스 포함 (Object, String, System ...)
- java.util : 컬렉션 프레임워크와 유틸리티 (List, Map, Set)
- java.io : 파일 입출력
- java.nio : 비동기 입출력, 버퍼 ,채널, 파일경로/복사/이동/삭제 관련
- java.net : 네트워크 프로그래밍 지원 모듈
- java.security : 보안 및 암호화 관련 클래스
- java.math : 대형정수 및 고정 소수점 숫자 다루는 클래스
- java.time : 시간 및 날짜관련
import java.nio.file.Path;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.*;

public class App {
    public static void main(String[] args) throws Exception {
        
        String hello = "Hello";
        System.out.println(hello);

        //java.util - List사용
        List<String> list  = Arrays.asList("java", "hello");
        List<String> list2 = new ArrayList<>();

        for (String string : list) {
            System.out.println(string);
        }
        
        //java.time - 현재 날짜 시간
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);

        //java.nio.file - 파일경로 처리
        Path path= Paths.get("example.txt");
        System.out.println(path.toAbsolutePath());

        // java.io - 파일읽기
        try(BufferedReader reader = new BufferedReader(new FileReader(path.toFile()))){
            String line;
            while ((line = reader.readLine()) != null){
                System.out.println(line);
            }
        }catch(IOException e){
            e.printStackTrace();
        }

        List<String> lines = Files.readAllLines(path);
        for (String string : lines) {
            System.out.println(string);
        }

    }
}

 

제네릭

  • 컴파일 타임에 타입을 체크한다 (타입 안정성 보장)
  • 타입 캐스팅 제거 (타입 변환을 명시적으로 표현할 필요가 없음)
  • 다양한 타입을 사용할 수 있음 (유연한 코드 작성)
주의)
제네릭 타입은 상속관계를 따르지 않음
List<Object> list = new ArrayList<String>(); // 컴파일 오류 (Object, String 상속관계를 따르지 않음)
public class Test<T>{
     private T item;
     
     public void set(T item){
          this.item = item;
     }
     
     public T get(){
          return item;
     }
}

 

 

멀티스레드

  • 스레드 생성은 Runnalbe 과 Thread을 이용
class MyThread extends Thread{
    @Override
    public void run(){
    }
}

class MyRunnable extends Runnable{
    @Override
    public void run(){
    }
}
  • 스레드 상태
    • Runnable :실행 가능 상태
    • Blocked :  차단 상태 (락 해제 대기)
    • Waiting : 대기 상태 ( Object.wait(), .join()으로 인한 대기)
    • TIMED_WAITING : 시간 제한 대기 상태 (.sleep(), .wait())
    • Terminated : 종료상태
  • 스레드 제어
    • start() : 스레드 실행
    • sleep() : 지정 시간동안 스레드 일시 중단 ( 락 해제 x)
    • join() : 다른 스레드 작업 끝나길 기달림
    • wait() : 스레드 간의 동기화 작업 (중단 , 락 해제 o)
    • notify() : wait()작업 해제
  • 경쟁상태 (race condition 해결)
    • wait()을 하여 스레드 대기상태
    • 동기화 키워드 (synchronized)를 이용하여 보장
public synchronized void method(){
    //...
}

 

컬렉션 자료구조

List vs Set
- List : 순서가 있는 데이터 집합, 중복요소 허용
-
set : 순서가 없고, 중복된 요소를 허용하지 않음

[선언]
List<String> list = new ArrayList<>();
Set<String> set = new HashSet<>();
HashMap Vs TreeMap
- HashMap : 순서를 보장하지 않음, 해싱을 이용 (시간복잡도 : O(1))
- TreeMap : 키에 대해 정렬된 순서로 저장, Red-Black Tree 이용 ( 시간 복잡도 : O(logn) )

[선언]
Map<String, Integer> hashMap = new HashMap<>();
Map<String,Integer> treeMap = new TreeMap<>();
ArrayList Vs LinkedList
- ArrayList : 내부적으로 동적 배열 사용, 요소 중간 삽입/삭제 O(n)이 걸림 (랜덤 접근 빠름)
- LinkedList : 이중연결리스트 이용, 요소 중간 삽입/삭제 O(1) 이 걸림 (랜덤 접근 느림)

[선언]
List<String> arrayList = new ArrayList<>();
List<String> linkedList = new ArrayList<>();
Iterator Vs ListIterator
- Iterator : 컬렉션의 요소를 순방향으로 순회 (현재 요소 삭제 가능 / 수정 ,삽입 불가능)
- ListIterator : 컬렉션의 요소를 양방향으로 순회 (요소를 삽입, 수정, 삭제 가능)

[선언]
List<String> iterator = list.iterator();
Iterator<String> iterator  = list.iterator();
ListIterator<String> listIterator = list.listIterator();
HashSet Vs TreeSet
- HashSet : 순서가 없는 컬렉션 , 빠른검색과 삽입
- TreeSet : 정렬된 순서, 이진검색트리 사용

[선언]
Set<String> hashSet = new HashSet<>();
Set<String> treeSet = new TreeSet<>();
동시성 문제 해결 방법
- ConcurrentHashMap
- CopyOnWriteArrayList
- ConcurrentLinkedQueue

 

람다식

  • 인터페이스의 추상메서드가 단일일경우, 람다를 이용하여 구현이 가능하다 ( = 함수형 인터페이스)
    • 함수형 인터페이스
      • 단 하나의 추상메서드만을 가지고 있어야함
      • 여러개의 default 메서드나 static 메서드는 포함할 수 있다
Runnable runnable = () -> System.out.println("thread start!");
// Runnable 인터페이스에는 @Override run() 추상메서드 한개가 있으므로, 람다를 이용해 자동 적용되게 할 수 있다
  • 메서드를 간단히 표현할 수 있는 구문
  • 가독성, 불변성을 가진다
  • 함수를 변수처럼 다룰 수 있다
[람다식 문법]

1. (parameters) -> 표현식 형태
-> 람다식 결과를 그대로 반환

2. (parameters) -> { 블록형태; }
-> 명시적으로(return) 반환

 

스트림

  • 컬렉션 요소를 처리하기 위한 기능
  • 연산과정은 중간연산 + 최종연산이 서로 다른 역할을 한다
    • 중간 연산 : 스트림을 변환하여 새로운 스트림을 반환
    • 최종 연산 : 스트림을 소모하고 결과를 반환한다
  • 람다식과 함께 자주 사용된다
public class StreamEx{
     public static void main(String[] args) {
          
          List<Integer> numbers = Arrays.asList(1,2,3,4,5,6);
          
          numbers.stream()
                 .filter(n -> n%2 == 0) // 짝수 필터링 
                 .map(n-> n*n) //제곱
                 .forEach(System.out::println); // 결과 출력
          }
     }
}