본문 바로가기
❤️‍🔥TIL (Today I Learned)

[TIL] 2022-11-15(12day)

by elicho91 2022. 11. 15.

JAVA 기초문법(4)


👉 날짜와 시간 다루기

-1) 기본 시간 다루기

public class Main {
    public static void main(String[] args) {
        System.out.println("now()를 활용하여 생성");
        LocalDate date = LocalDate.now();
        LocalTime time = LocalTime.now();
        LocalDateTime dateTime = LocalDateTime.now();

        System.out.println(date);
        System.out.println(time);
        System.out.println(dateTime);

        System.out.println("of()를 활용하여 생성");
        LocalDate newDate = LocalDate.of(2021, 03, 29);
        LocalTime newTime = LocalTime.of(22, 50, 55);

        System.out.println(newDate);
        System.out.println(newTime);
    }
}

 

-2) 날짜와 시간 형식 수정

DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");	//원하고자 하는 날짜형식
String myDate = newFormatter.format(LocalDate.now());
System.out.println(myDate);

 

-3) 날짜와 시간 차이 계산

LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(2021, 8, 9);
Period period = Period.between(today, birthday);
System.out.println(period.getMonths());
System.out.println(period.getDays());

 

-4) 오늘의 날짜와 시간을 [연도/월/일 시간/일자]로 출력하기

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy/MM/dd h/mm");
        String now = dateTimeFormatter.format(LocalDateTime.now());
        System.out.println("현재시간: " + now);
    }
}

👉 컬렉션 Collection 정의

- 다수의 데이터를 다루기 위한 자료구조를 표현하고 사용하는 클래스의 집합

- 컬렉션 프레임워크의 모든 클래스는 Collection interface를 구현(implement)하는 클래스 또는 인터페이스

 

-1)컬렉션을 위한 자바 인터페이스와 클래스 

 

# List : 순서가 있는 데이터의 집합이며 데이터의 중복을 허용.
→ ArrayList, LinkedList, Stack 등
# Set : 순서를 유지하지 않는 데이터의 집합이며 데이터의 중복을 허용X.
→ HashSet, TreeSet 등
# Map : 키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합. 순서는 유지되지 않으며 키는 중복을 허용x 값은 중복 허용
→ HashMap, TreeMap 등
# Stack : 마지막에 넣은 데이터를 먼저 꺼내는 자료구조. LIFO(Last In First Out)
→ Stack, ArrayDeque 등
# Queue : 먼저 넣은 데이터를 먼저 꺼내는 자료구조. FIFO(First In First Out)
→ Queue, ArrayDeque 등
- 컬렉션 인터페이스**에는 컬렉션 클래스에 저장된 데이터를 읽고, 추가하고 삭제하는 등 데이터를 다루는데 기본적인 메소드들을 정의.

 

 

👉 컬렉션 Collection - List, Set, Map

-1) List

# 순서가 있는 나열된 데이터를 표현.

# ArrayList는 배열을 이용하여 데이터를 저장하는 List 인터페이스

public class Main {
    public static void main(String[] args) {
        List list = new ArrayList(10);
        list.add(1);
        list.add(5);
        list.add(4);
        list.add(11);
        list.add(10); // ArrayList에 값 한개씩 입력
        System.out.println(list); // [1,5,4,11,10]

        Collections.sort(list); // list 정렬
        System.out.println(list); // [1,4,5,10,11]

        System.out.println(list.size()); // arrayList의 크기 출력

        arrayList.remove(4); // 인덱스를 활용하여 해당하는 값 제거
        System.out.println(list);

        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i)); // get을 이용하여 값 1개씩 출력
        }
				for (int current : list) {
						System.out.println(current);
        }

    }
}

 

-2) Set

# 순서를 유지하지 않는 데이터의 집합이며 데이터의 중복을 허용X

# HashSet은 Set 인터페이스를 구현한 대표적인 컬렉션

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Set<Integer> integerSet = new HashSet<>(); // Collection의 자료형에는 primitive 타입은 올 수 없음.
        integerSet.add(1);
        integerSet.add(3);
        integerSet.add(2);
        integerSet.add(9);// 하나씩 값을 삽입.
        System.out.println(integerSet); // 
        Set<String> stringSet = new HashSet<>();
        stringSet.add("LA");
        stringSet.add("New York");
        stringSet.add("LasVegas");
        stringSet.add("San Francisco");
        stringSet.add("Seoul");
        System.out.println(stringSet);

        stringSet.remove("Seoul"); //Seoul을 HashSet에서 제거.
        System.out.println(stringSet);

        ArrayList<String> target = new ArrayList<String>();
        target.add("New York");
        target.add("LasVegas");//제거할 항목을 ArrayList에 삽입.
        stringSet.removeAll(target);//제거항목에 삽입된 도시들을 삭제.
        System.out.println(stringSet);

        System.out.println("LA가 포함되어있나요? " + stringSet.contains("LA"));
        System.out.println("LA가 포함되어있나요? " + stringSet.contains("LasVegas"));
        //LA가 HashSet에 포함되어있으면 true를, 그렇지 않으면 false를 반환.

        System.out.println("현재 HashSet의 크기는 : " + stringSet.size() + "입니다.");
        //HashSet의 크기를 반환.

        stringSet.clear();//HashSet의 모든 아이템들을 삭제.
        System.out.println(stringSet);
    }
}

 

-3) Map

# 키(key)와 값(value)을 하나의 데이터로 저장

# 해싱(hashing)을 가능하게 하여 데이터를 검색하는데 유용

public class Main {
    public static void main(String[] args) {
				Map<Integer, String> map = new HashMap<>();
        map.put(1, "apple");
        map.put(2, "berry");
        map.put(3, "cherry");

        System.out.println(map);

        System.out.println("1st in map: " + map.get(1));

        map.remove(2);
        System.out.println(map);
        System.out.println(map.containsKey(2));
        System.out.println(map.containsValue("cherry"));
        
        map.clear();
        System.out.println(map);
    }
}

 

👉 컬렉션 Collection - 스택, 큐, ArrayDeque

-1) 스택 Stack

# 마지막에 저장한 데이터를 가장 먼저 꺼내는 자료구조 (LIFO)

 ex) 웹브라우저의 앞페이지 이동 뒤페이지 이동 / 그릇 쌓기

public class Main {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(3);
        stack.push(5);
        stack.push(7);
        System.out.println(stack); // Stack을 출력합니다

        System.out.println(stack.peek()); // Stack의 가장 상단 값을 출력.(삭제는 안함.)
        stack.pop(); // Stack의 가장 상단 값을 제거합니다.
        System.out.println(stack);
        System.out.println(stack.size()); // Stack의 크기를 반환.
        System.out.println(stack.contains(1)); // Stack에 1이라는 값이 있으면 true를, 그렇지 않으면 false를 반환.
        System.out.println(stack.empty()); // STack이 비어있으면 true를, 그렇지 않으면 false를 반환.
        System.out.println(stack);
    }
}

 

-2) 큐 Queue

# 처음에 저장한 데이터를 가장 먼저 꺼내는 자료구조 (FIFO)

 ex) 은행 창구 줄서기 / 인쇄작업 대기목록

public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(1);
        queue.add(3);
        queue.add(5);//Queue에 값 삽입합니다.
        System.out.println(queue);//Queue 출력합니다.
        System.out.println(queue.poll()); // Queue에서 객체를 꺼내서 반환합니다.
        queue.add(7);
        queue.add(11);
        queue.add(9);
        System.out.println(queue);
        System.out.println(queue.peek()); //Queue에서 삭제 없이 요소를 반환합니다.
        System.out.println(queue);
    }
}

 

-3) ArrayDeque

# 기본 Stack, Queue의 기능을 모두 포함하면서도 성능이 더 좋다.

# 양 끝에서 삽입과 반환 가능

public class Main {
    public static void main(String[] args) {
        ArrayDeque<Integer> arrayDeque = new ArrayDeque<>(); // ArrayDeque를 이용한 선언(제네릭스 이용)
        arrayDeque.addFirst(1);
        arrayDeque.addFirst(2);
        arrayDeque.addFirst(3);
        arrayDeque.addFirst(4); // arrayDeque의 앞에 값을 삽입
        System.out.println(arrayDeque);

        arrayDeque.addLast(0); // arrayDeque의 끝에 값을 삽입
        System.out.println(arrayDeque);

        arrayDeque.offerFirst(10); // addFirst와 비슷하지만 큐의 크기 문제가 생길 때, offerFirst는 false를,
        // addFrist는 exception을 반환합니다.
        System.out.println(arrayDeque);

        arrayDeque.offerLast(-1); // arrayDeque의 끝에 값을 삽입
        System.out.println(arrayDeque);
        System.out.println(arrayDeque.size()); // 7


        System.out.println(arrayDeque.removeFirst()); // 첫번째 값을 제거하면서 그 값을 리턴
        System.out.println(arrayDeque.removeLast()); // 마지막 값을 제거하면서 그 값을 리턴
		    System.out.println(arrayDeque);
				System.out.println(arrayDeque.size()); // 5

        System.out.println(arrayDeque.pollFirst()); // 첫번째 값을 반환 및 제거하면서 그 값을 리턴
        System.out.println(arrayDeque);
				System.out.println(arrayDeque.size()); // 4

        System.out.println(arrayDeque.pollLast()); // 마지막 값을 반환 및 제거하면서 그 값을 리턴
        System.out.println(arrayDeque);
				System.out.println(arrayDeque.size()); // 3

        System.out.println(arrayDeque.peekFirst()); // 첫번째 값을 반환, 제거하지 않음
        System.out.println(arrayDeque.peekLast()); // 마지막 값을 반환, 제거하지 않음
				System.out.println(arrayDeque.size()); // 3
    }
}

👉 제네릭스 Generics

public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}

- 다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능을 의미

 

- <T> == Type

- <E> == Element

- <K> == Key

- <V> == Value

- <N> == Number

- <R> == Result

 

-1) Collection.java 중 일부

public interface Collection<E> extends Iterable<E> {
	int size();
	boolean isEmpty();
	Iterator<E> iterator();
	boolean add(E e);
	<T> T[] toArray(T[] a);
	boolean containsAll(Collection<?> c);
	boolean addAll(Collection<? extends E> c);
}

 

-2) List.java 중 일부

public interface List<E> extends Collection<E> {
  // Collection 에 있는 메소드들 모두 포함 
  // + List 에만 있는 메소드들
	boolean add(E e);
}

 

-3) ArrayList.java 중 일부

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable 
{
	public <T> T[] toArray(T[] a) {
        if (a.length < size)
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
        System.arraycopy(elementData, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }
    public E get(int index) {
        rangeCheck(index);

        return elementData(index);
    }
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
}

👉 람다 Lamda

[기존의 메소드 형식]
반환타입 메소드이름(매개변수 선언) {
    수행 코드 블록
}

[람다식의 형식]
반환타입 메소드이름(매개변수 선언) -> {
    수행 코드 블록
}

- 함수의 이름을 따로 정의하지 않아도 곧바로 함수처럼 사용할 수 있는 함수 (식별자가 없다.)

public class Main {
    public static void main(String[] args) {
        ArrayList<String> strList = new ArrayList<>(Arrays.asList("korea", "japan", "china", "france", "england"));
        Stream<String> stream = strList.stream();
        stream.map(str -> str.toUpperCase()).forEach(System.out::println); // :: => 매개변수를 중복해서 사용하고 싶지 않을 때 사용.
    }
}

👉 스트림 stream

# 데이터의 흐름

# 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자

# 스트림을 활용해서 필터링,데이터 변경, 다른 타입이나 자료구조로 변환 가능

 

-1) 스트림의 특징

 1. 데이터 소스를 변경하지 않는다.

 2. 작업을 내부적으로 반복 처리한다.

 3. 컬렉션의 요소를 모두 읽고 나면 닫혀서 재사용이 불가능 (필요할 경우 재생성)

 

-2) 스트림의 구조

1. 스트림 생성
- 'Stream<T> Collection.stream()` 을 이용하여 해당하는 컬렉션을 기반으로하는 스트림을 생성
2. 중간 연산
- 중간 단계로써 데이터의 형변환 혹은 필터링, 정렬 등 스트림에 대한 가공.
- map(변환) / sorted(정렬) / skip(스트림 자르기) / limit(스트림 자르기) 등......
3. 최종 연산
- 스트림의 요소를 소모해서 결과를 반환하는 단계. 최종 연산 이후에는 스트림이 닫히게 되고 더 이상 사용불가
- 최종 연산의 결과값은 단일 값일 수도 있으며 배열 혹은 컬렉션일 수도 있음.
- collect()를 이용해서 다른 콜렉션으로 바꾸는 것, reduce를 이용해서 incremental calculation하는 것도 가장 많이 쓰이는 패턴.

 


🙋‍♂️ 소감 : 

람다와 ArrayDeque는 처음 예전 강의에서는 배우지 않았던 내용이다,실무에서 많이 쓰이는 방법이라고 하니, 반복해서 연습해야겠다.

😈 아는 내용이라고 그냥 넘어가지 않기! 😈

'❤️‍🔥TIL (Today I Learned)' 카테고리의 다른 글

[TIL] 2022-11-17(14day)  (0) 2022.11.17
[TIL] 2022-11-16(13day)  (0) 2022.11.16
[TIL] 2022-11-14(11day)  (0) 2022.11.14
[TIL] 2022-11-11(10day)  (0) 2022.11.11
[TIL] 2022-11-10(9day)  (1) 2022.11.10

댓글