본문 바로가기

Java

(19)
Java Garbage Collection alkhwa-113.tistory.com/entry/1%EC%A3%BC%EC%B0%A8-JVM%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EB%A9%B0-%EC%9E%90%EB%B0%94-%EC%BD%94%EB%93%9C%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94-%EA%B2%83%EC%9D%B8%EA%B0%80 자바를 쓸 때 JVM 은 OS 에서 메모리를 할당받아 에플리케이션에 필요한 자원을 사용한다. 그 중 우리가 자주 쓰는 참조 타입들은 메모리의 힙 영역에 저장된다고 공부했었는데, 매번 쌓이는 힙 영역을 개발자가 관리하지 않아도 괜찮은 이유가 Java Garbage Collection 때..
List.of() vs Arrays.asList() vs Collections.unmodifiableList() 불변 리스트를 만들기 위해서 나는 주로 Arrays.asList를 사용해왔다. 자바에는 불변 리스트를 만드는 방법이 여러가진데, 이들의 차이점은 무엇일까? 1. 셋 다 불변 리스트이다. 하지만 조금씩 허점이 있다. List.of 는 완전한 불변 리스트이다. add, set, remove 에 대해서 모두 UnsupportedOerationException을 발생시킨다. UnsupportedOerationException 은 RuntimeException 을 상속하는 unchecked 예외이다. 하지만 Arrays.asList 는 add, remove 는 같은 예외를 던지지만, set 이 가능하다. 따라서 정확하게는 반만 불변이다. Collections.unmodifiableList 는 List.of처럼 불..
Enum 활용(람다식 사용하기) 3주차 미션이 끝나고 마지막 최종 코딩 테스트를 기다리고 있다. 3주차 미션은 너무 어려웠어서, 코드 리펙토링이 충분히 진행되지 못했다. 그래서 조금 더 코드를 줄이는 방법을 고민한 결과 Enum을 좀 더 고급스럽게 사용하면 코드를 더 줄일 수 있을 것 같았다. Enum은 서로 연관된 상수의 집합이다. 클래스로서 상수들을 정의할 수 있고, 생성자와 메서드를 가질 수 있다. 새로운 영감을 받은건 아래 글의 댓글이었다. okky.kr/article/641946 나는 enum 클래스를 이렇게 이용하고 있었다. Option은 사용자가 선택하는 번호, getMenu()는 사용자 입력 String을 Option과 비교해 같은 enum상수를 반환하여 컨트롤러에서 사용했다. public class LineMenuCon..
함수형 인터페이스 정리 인터페이스명 추상 메소드 설명 Runnable void run() 기본적인 인터페이스, 매개변수와 반환값 없음 Supplier T get() 매개변수 없음, 제네릭타입 반환값 가짐 Consumer void accept() 제네릭 매개변수 하나, 반환값 없음(void) Predicate boolean test() 제네릭 매개변수 하나, Boolean 반환값 하나 Function R apply(T t) 제네릭 매개변수 하나와 다른 제네릭 반환값하나 Comparator int compare(T o1, T o2) 같은 제네릭 타입 매개변수 두개를 받고, Integer 반환값 하나 가짐, 객체간 비교를 위핸 compare를 위한 인터페이스 BiConsumer void accept(T t, U u) 서로다른 제네릭..
인터페이스 vs 추상 클래스 3주차 미션의 controller, service, 메뉴, 입출력부분을 구현하면서 느낀점은 반복적인 코드들이 많이 등장했다는 것이다.1주차 피드백에 반복은 모든 악의 근원이라는 말이 있었기에, 공통적인 메소드를 엮어내기 위해 인터페이스와 추상클래스의 개념을 도입하기 위해 고민했었다. 하지만 조금 미숙한 부분이 있었기에 이렇게 정리해보려 한다.이 역시 짧은시간 공부한 나의 알량한 지식으로 내린 결론이므로 이후 생각이 바뀔 수 있는 여지가 많다. 그냥 지금 저사람이 저런 생각을 가지고 있구나 라고 보면 되겠다. 1. 추상클래스 추상클래스는 아래의 형태로 만들 수 있다.abstract public class Controller { } 추상 클래스 내에서는public abstract void A();와 같은 형..
JAVA8) 스트림 API 1. 스트림 자바에서는 많은 양의 데이터를 저장하기 위해 배열, 컬렉션을 이용한다. 배열, 컬렉션의 데이터에 접근하기 위해서는 기존의 방법으로는 for문이나 iterator을 사용하여 접근했는데., JAVA8버전 부터 도입된 람다식과 람다식을 이용하는 스트림은 효율적으로 요소들에 접근하는 방식을 제공한다. 2. 스트림의 특징 스트림은 내부반복을 통해 작업을 수행한다. 생성된 스트림은 한번만 사용이 가능하다.(재사용할 수 없다) 원본 데이터를 읽기만 할 뿐, 변경하지 않는다. Lazy한 연산(지연 연산)을 통해 성능을 최적화한다. parallelStream()을 통해 병렬연산을 지원한다. 생성연산, 중개연산, 최종연산의 세가지 단계로 이루어진다. 3. 컬렉션 vs 스트림 컬렉션에 정의된 메소드 add, r..
JAVA8) 메소드 레퍼런스 람다 표현식에서 메서드 호출 1회로 코드가 끝나는 경우 메서드 레퍼런스를 이용하면 코드를 더 줄일 수 있다. docs.oracle.com/javase/8/docs/api/java/util/function/Function.html Function 라는 인터페이스가 있다. R을 파라미터로 입력받아 T로 반환하는 apply() 추상메소드가 있는 함수 인터페이스이다. Function func = str -> Integer.parseInt(str); 람다식을 사용하여 일급 객체로 만들면 이렇게 할 수 있다. System.out.println(func.apply("15")); Integer integer = func.apply("15"); 이렇게 출력하거나 값을 저장할 수 있을 것이다. 람다의 메서드 구현부분이 한..
JAVA8) 람다 표현식 람다 표현식의 특징 -> 를 이용한다. 익명 메서드처럼 이름이 없다. 메서드가 아닌 '함수'이다. 간단하다. (매개변수) -> (표현식) 의 형태를 가진다. (매개변수) -> { 표현식; 표현식; .. } 도 가능하다. 1. 일반 익명 메소드를 람다 표현식으로 바꾸기 아래의 함수형 인터페이스가 있다. public interface Movable { int move(int num); } 아래는 Car클래스에 구현하는 버젼이다. class Car implements Movable { @Override public int move(int num) { Return num = num * 2; } } 재 사용성이 없다면 우리는 익명 메소드를 이용하여 사용할 수 있다. public static void main(St..