Language/Java
[Java] HttpServlet
[Java] HttpServlet
2023.04.06HttpServlet HttpServlet은 GenericServlet을 상속하고 있고 GeneralServlet은 Servlet을 구현한 클래스이다. 그럼 차례대로 알아보자. Servlet Servlet은 서블릿 생명주기와 정보에 관련된 메서드들이 선언되어 있다. init() servlet이 처음 로딩될 때 한 번 호출되는 메서드 예외가 생겼을 경우 UnavailableException이나 ServletException 발생 service() client로부터 servlet에 대한 요청이 있을 때 호출되는 메서드 성공적으로 Init() 메서드가 호출되면 수행된다. client의 요청 방식에 따라 get일 경우 doGet(), post일 경우 doPost() 메서드를 호출한다 destroy() servl..
[Java] 스트림(Stream)
[Java] 스트림(Stream)
2023.04.06스트림(Stream)? 스트림(Stream)은 Java 8 API에 새로 추가된 기능이다. 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 여기서 선언형이란 데이터를 처리하는 구현 코드 대신, 질의로 표현하는 것을 말한다. 또 스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. 그럼 다음 예시 코드를 한번 보자. List highRatingMovies = new ArrayList(); for (Movie movie: movies) { if (movie.getRating() > 7) { highRatingMovies.add(movie); } } Collections.sort(highRatingMovies, new Comparator() { publi..
[Java] 메서드 참조
[Java] 메서드 참조
2023.04.04메서드 참조? 메서드 참조는 람다 표현식을 축약한 형태이다. 메서드 참조를 사용하면 람다 표현식을 더 줄일 수 있는데, 상황에 따라 가독성이 더 좋아보일 수 있다. 다음은 람다 표현식을 메서드 참조로 바꾼 예시이다 inventory.sort((Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())); inventory.sort(comparing(Apple::getWeight)); 메서드 참조는 실제로 메서드를 호출하는 것이 아니기 때문에 괄호는 적지 않는다. 메서드 참조 형태 메서드 참조는 크게 3가지 형태가 있는데, 한 번 살펴보자. 정적 메서드 참조 예를 들어 Integer의 parseInt 정적 메서드를 다음과 같이 메서드 참조 형태로 바꿀..
[Java] 람다 타입 검사/추론/제약
[Java] 람다 타입 검사/추론/제약
2023.04.04타입 검사 람다가 사용되는 context를 이용해서 람다의 형식(type)을 추론할 수 있다. 어떤 context에서 기대되는 람다 표현식의 형식을 대상 형식(target type)이라고 부른다. 타입 검사 과정 다음 예시를 통해 타입 검사 과정을 확인해보자. filter(inventory, (Apple apple) -> apple.getWeight() > 150); filter 메서드의 선언을 확인한다. filter 메서드는 두 번째 파라미터로 Predicate 형식(target type)을 기대한다. Predicate은 test라는 한 개의 추상 메서드를 정의하는 함수형 인터페이스이다. test 메서드는 Apple을 받아 boolean을 반환하는 함수 디스크립터를 묘사한다. filter 메서드로 전달..
[Java] 함수형 인터페이스
[Java] 함수형 인터페이스
2023.04.03함수형 인터페이스? 함수형 인터페이스는 오직 하나의 추상 메서드를 가지고 있는 인터페이스이다. 함수 디스크립터 함수형 인터페이스의 추상 메서드는 람다 표현식의 시그니처를 묘사한다. 함수형 인터페이스의 추상 메서드 시그니처를 함수 디스크립터라고 한다. 다양한 람다 표현식을 사용하려면 공통의 함수 디스크립터를 기술하는 함수형 인터페이스 집합이 필요하다. 자바 API는 Comparable, Runnable, Callable 등의 다양한 함수형 인터페이스를 포함하고 있다. 여기서 Java 8 라이브러리는 java.util.function 패키지에서 새로운 함수형 인터페이스를 제공하는데, 그 중에서 Predicate, Consumer, Function 인터페이스를 살펴보자. Predicate java.util.f..
[Java] 람다 표현식 소개
[Java] 람다 표현식 소개
2023.03.31람다 표현식? 람다 표현식은 메서드로 전달할 수 있는 익명 함수를 단순화한 것이다. 람다 표현식에는 이름은 없지만, 파라미터 리스트, 바디, 반환 형식, 발생할 수 있는 예외 리스트는 가질 수 있다. 특징 익명: 보통의 메서드와 달리 이름이 없으므로 익명이라 표현한다. 함수: 람다는 메서드처럼 특정 클래스에 종속되지 않으므로 함수라고 부른다. 전달: 람다 표현식을메서드 인수로 전달하거나 변수로 저장할 수 있다. 간결성: 익명 클래스처럼 많은 자질구레한 코드를 구현할 필요가 없다. 람다 표현식을 이용하면 동적 파라미터 형식의 코드를 더 쉽게 구현할 수 있다. 예를 들어, Comparator 객체를 기존보다 간단하게 구현할 수 있다. [기존] Comparator byWeight = new Comparator..
[Java] 동작 파라미터화 코드 전달하기
[Java] 동작 파라미터화 코드 전달하기
2023.03.28동작 파라미터화? 동작 파라미터화란 아직은 어떻게 실행할 것인지 결정하지 않은 코드블록을 의미한다. 이 코드 블록은 나중에 프로그램에서 호출한다. 예를 들어, 나중에 실행될 메서드의 인수로 코드 블록을 전달할 수 있다. 결과적으로 코드 블록에 따라 메서드의 동작이 파라미터화 된다. 변화하는 요구사항마다 새로운 파라미터를 받는 메서드를 만들어야 하는 상황이 생길 수 있다. 하지만 동작 파라미터화 코드를 전달하면 해결이 가능하다. 변화하는 요구사항에 대응하기 농장 재고목록 애플리케이션에서 재고 파악하는 예제를 통해 요구사항의 변화에 대응해보자. 요구사항 1. 녹색 사과만 필터링 사과 색을 정의하는 다음과 같은 Color enum이 존재한다고 가정하자 enum Color { RED, GREEN } public..
[Java] 바이트코드 조작
[Java] 바이트코드 조작
2023.03.22코드 커버리지 측정 코드 커버리지는 테스트 코드가 프로덕션 코드를 얼마나 실행했는지를 백분율로 나타내는 지표이다. 즉, 테스트 코드가 실제로 프로덕션 코드를 얼마나 검증하고 있는지를 나타낸다. 코드 커버리지를 통해 현재 작성된 테스트 코드의 수가 충분한 것인지 논의할 수 있다. 그럼 코드 커버리지 툴을 사용해서 코드 커버리지를 측정해보자. 대표적으로 JaCoCo가 있다. 여기선 JaCoCo를 통해 측정해보도록 하자. Jacoco 먼저 JaCoCo 플러그인을 추가하고 task를 설정해보자. plugins { id 'jacoco' } jacoco { toolVersion = '0.8.5' } JaCoCo Gradle 플러그인에는 다음과 같은 task가 있다. jacocoTestReport: 바이너리 커버리지..
[Java] JVM
[Java] JVM
2023.03.20JVM, JRE, JDK? 자바 프로그램을 개발하기 위해 이런 것들을 설치하는 과정을 거쳤을 것이다. 일단 검색한대로 설치하긴 했는데, 이것들은 전부 무엇이고 어떤 역할을 할까? 한 번 살펴보자. JVM(Java Virtual Machine) JVM(Java Virtual Machine)은 자바 가상 머신으로 자바 프로그램 실행 환경을 만들어주는 소프트웨어이다. JVM은 자바 바이트코드(.class)를 OS에 특화된 코드로 변환(interpreter, JIT compiler)하여 실행시켜준다. 이 때문에 JVM을 사용하면 모든 플랫폼에서 동작하도록 할 수 있다. 즉, 플랫폼에 영향을 받지 않는다는 말이다. 여기서 주의할 점은 Java는 어떠한 JVM에서도 동작시킬 수 있기 때문에 플랫폼에 의존적이지 않지..
[Java] "" vs new String("")
[Java] "" vs new String("")
2023.03.19String Java에는 문자열을 쉽게 다룰 수 있는 String Class가 존재한다. 아마 객체 중에서 제일 많이 사용한 것이 무엇일까 생각해보면 거의 당연히 String 일거라 생각한다. 이렇게 많이 사용하는 만큼 사용법도 잘 알고 사용하면 금상첨화가 될 것이다. 먼저, String은 다음과 같은 방식들로 선언할 수 있다. public class Main { public static void main(String[] args) { String s1 = ""; String s2 = new String(""); } } 분명 딱 봐도 선언하는 방식이 다르다. 그런데 둘에게 차이가 없을까? 분명 어떠한 차이라도 있지 않을까? 그럼 이제부터 그 차이를 한 번 살펴보자 "" vs new String("") 위..
[Java] 아무 생각 없이 생성했는데 동일한 객체?
[Java] 아무 생각 없이 생성했는데 동일한 객체?
2023.03.09Integer.valueOf(127) == Integer.valueOf(127)은 true? Integer.valueOf(127) == Integer.valueOf(127)은 true가 출력된다고 한다. 뭔가 이상하다. 배운대로라면 Integer는 클래스, 즉 참조 타입이기 때문에 다른 객체가 생성되어 false가 떠야 맞는 것 같은데 그렇지가 않다. 그럼 다른 객체로 생성이 안된다는 얘기일까? 한 번 살펴보자. 다음 코드의 실행 결과를 한 번 예상해보자. public class IntegerCacheCheck { public static void main(String[] args) { System.out.println(Integer.valueOf(128) == Integer.valueOf(128)); ..
[Java] abstract class vs interface
[Java] abstract class vs interface
2023.01.20abstract class에 대해 공부하다가 interface와의 차이점이 궁금하여 작성하였다. 추상 클래스(Abstract class) vs 인터페이스(Interface) 추상 클래스(Abstract class) 먼저 추상 클래스(abstract class)는 클래스 내에 추상 메서드가 하나 이상 포함된 클래스를 말한다. 클래스 안에 메서드가 하나 이상 있다면 그 클래스 앞에는 반드시 abstract 클래스명으로 표기되어야 하며 abstract와 final 키워드를 동시에 표기할 수 없다. 일반 클래스에서 추상 클래스를 상속을 받는다면 추상메서드가 있을 경우 모두 구현해주어야 한다. 인터페이스(Interface) 반면 인터페이스(interface)는 모든 메서드가 추상 메서드인 경우이다. 간단히 생각하..