java 8

[Effective Java] 모든 객체의 공통 메서드

equals는 일반 규약을 지켜 재정의하기 equals를 overriding하지 않는 경우 각 인스턴스가 본질적으로 고유함 인스턴스의 논리적 동치성 검사 불필요 상위 클래스의 equals가 하위 클래스에도 잘 맞음 클래스가 private이거나, package-private이어서 equals 호출 안함 equals를 overriding해야 하는 경우 논리적 동치성을 확인해야 하는 경우 equals 동치관계 구현 조건 반사성 : 객체는 자기 자신과 같아야 함 대칭성 : 두 객체는 서로에 대한 동치 여부에 동일한 답을 해야 함 추이성 : 첫번째 == 두번째 == 세번째 일관성 : 두 객체가 같다면 영원히 같아야 함 Non-null : 모든 객체가 null과 같지 않아야 함 equals 구현 방법 ==로 입력이..

ReadingBooks 2021.07.30

[Effective Java] 객체 생성과 파괴

생성자 대신 정적 팩터리 메서드를 고려하기 정적 팩터리 메서드 장점 이름을 가질 수 있음 호출될 때마다 인스턴스를 생성할 필요가 없음 반환 타입의 하위 타입 객체를 반환할 수 있음 입력 매개변환에 따라 매번 다른 클래스의 객체를 반환할 수 있음 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 됨 정적 팩터리 메서드 단점 정적 팩터리 메서드만 제공하면 하위 클래스 생성 불가 정적 팩터리 메서드는 개발자가 찾기 어려움 매개변수가 많으면 builder를 고려하기 빌더 패턴 = 안정성(점층적 생성자 패턴) + 가독성(자바 빈즈 패턴) 빌더 패턴은 계층적 클래스와 함께 쓰기 좋음 private 생성자나 enum으로 singleton을 보증하기 싱글턴 생성 방식 public stati..

ReadingBooks 2021.07.27

Java의 스레드(Thread) 알아보기

개요 여러 가지 일을 병행하는 멀티태스킹은 프로세스 기반, 스레드 기반으로 구현할 수 있습니다. 프로세스 기반 여러 프로그램이 병행으로 실행되는 것 프로세스가 생성될 때마다 새로운 메모리 영역을 할당받음 프로세스 실행에 필요한 새로운 시스템 자원을 할당받음 스레드 기반 프로그램 내부에서 여러 작업이 병행으로 실행되는 것 프로그램의 프로세스에서 사용하는 자원과 메모리를 공유 스레드를 실행하기 위한 자원만 필요 스레드 == 경량 프로세스 멀티 스레드 환경에서는 모든 스레드가 종료되어야 프로그램이 종료됨 스레드의 목적 멀티 스레드를 구현해야 하는 상황 여러 사용자의 동시 요청 처리 외부 데이터 IO 작업 스레드 활용 스레드 생성 java.lang.Thread 클래스를 상속 Runnable 인터페이스를 구현해서..

서블릿(Servlet)이란

개요 클라이언트의 요청에 응답하는 자바 객체입니다. 동적으로 컨텐츠를 생성합니다. HTTP를 지원합니다. 관련 API를 사용할 수 있습니다. 웹서버에서 서비스되는 페이지입니다. MVC 패턴에서 Controller 역할을 담당합니다. 서버가 실행할 수 있는 자바 프로그램은 오직 서블릿뿐입니다. 환경설정 파일 : web.xml 웹 앱의 서비스 처리에 관한 내용이 정의되어 있는 파일입니다. 웹 서버는 web.xml의 내용대로 웹 앱 실행을 위한 설정을 완료합니다. 서블릿 디렉터리 서블릿이 공식적으로 존재하는 디렉터리입니다. 모든 Web Application Server의 구조가 동일합니다. 서블릿 디렉터리는 WEB-INF/classes입니다. 서블릿 클래스 간 관계 서블릿을 구현하려면 HttpServlet을 ..

Java의 Garbage Collection

개요 자바의 메모리 관리 방법입니다. 자바의 객체는 Runtime Data Areas의 Heap에 할당됩니다. JVM의 Heap Area 자바는 개발자가 메모리를 관리하지 않습니다. Garbage Collector가 객체의 메모리를 해제합니다. GC가 수행될 때, GC를 위한 스레드를 제외하고 모든 스레드의 작업이 중지됩니다(Stop the World). GC 튜닝은 Stop the World의 시간을 줄이는 것입니다. 가설 : Weak Generational Hypothesis 대부분의 객체는 금방 접근 불가능 상태(unreachable)가 됩니다. 오래된 객체에서 젊은 객체로의 참조는 아주 적게 존재합니다. GC 대부분의 객체는 Young 영역에서 GC(Minor GC)됩니다. Young 영역의 GC..

JVM(Java Virtual Machine)이란

개요 자바 프로그램이 실행되는 가상 환경 자바 개발자는 바이트 코드 파일을 배포하는 과정까지만 합니다. 사용자가 자바 프로그램을 실행하려면 JVM이 필요합니다. JVM은 바이트 코드가 각 OS에서 실행될 수 있도록 기계어로 변환하고 프로그램을 실행합니다. JVM을 통해서 플랫폼 독립적인 개발이 가능해집니다. JVM 구조 자바 프로그램은 각 OS에 최적화된 JVM 위에서 실행됩니다. Class Loader Loading : 클래스를 적재 Linking : 래퍼런스를 연결 Initialization : static 값 초기화 & 변수 할당 Memory Stack 스레드마다 런타임 스택 생성 메소드 호출을 스택 프레임으로 쌓음 스레드가 종료되면 런타임 스택도 사라짐 PC Registers 스레드마다 현재 실행..

Lambda와 함수형 인터페이스

개념 익명 함수를 의미합니다. 람다식으로 구현하는 방식을 함수형 프로그래밍이라고 합니다. 함수형 프로그래밍에서 개발자는 핵심 내용만 구현하고, 나머지는 Java에서 자동으로 처리합니다. 함수형 스타일은 서술형 스타일에 객체의 개념과 명령문을 추가하여 처리하는 스타일입니다. 인터페이스를 람다식으로 구현 람다식으로 구현하려는 인터페이스는 반드시 1개의 메서드만 선언되어야 합니다. 1개의 메서드만 구현된 인터페이스를 함수형 인터페이스라고 합니다. 기본 문법 명령문이 1개일 때 : () -> 명령문; 명령문이 여러 개일 때 : () -> {명령문1; 명령문2; ... 명령문n;} @FunctionalInterface 함수형 인터페이스를 구현할 때, 2개 이상의 추상 메서드 선언되는 오류를 방지하기 위해서 @Fu..

Stream API

개념 스트림 데이터는 처리 과정에서 임시로 존재합니다. 스트림은 필요한 작업을 수행한 후 자동으로 소멸합니다. 데이터 소스 원본을 변경하지 않고도 데이터를 처리할 수 있습니다. 구성 스트림 생성 중개 연산 스트림을 받아서 스트림을 반환합니다. 여러개의 중개 연산을 수행할 수 있습니다. 중개 연산은 일반적으로 지연 연산입니다. 최종 연산 스트림의 결과를 산출합니다. 이때 지연 연산으로 미뤄진 중개 연산을 수행합니다. 최종 연산 이후 스트림은 소멸합니다. 특징 스트림은 각 요소의 처리 방법에 관심을 두고 있습니다. 개발자가 반복문을 구현해서 요소에 접근 --> 외부 반복 스트림은 내부적으로 각 요소마다 접근 --> 내부 반복 파이프-필터 패턴 스트림은 데이터에 대해서 각종 중개 연산(필터) 후 최종 연산으로..