분류 전체보기
-
[Effective Java] 아이템11: equals를 재정의하려거든 hashCode도 재정의하라Language/Java 2022. 6. 5. 00:11
equals를 재정의한 클래스 모두에서 hashCode도 재정의해야 한다. 그렇지 않으면 hashCode 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 과 같은 컬렉션의 원소로 사용할 때 문제를 일으킬 것이다. ✔️ hashCode 에 관한 규약 다음은 Object 명세에서 발췌한 규약이다. equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. 단 애플리케이션을 다시 실행한다면 이 값은 달라져도 상관없다. equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다. equals(Object)..
-
[Effective Java] 아이템10: equals는 일반 규약을 지켜 재정의하라Language/Java 2022. 6. 4. 16:53
equals 메서드는 재정의하기 쉬워 보이지만 곳곳에 함정이 도사리고 있다. 따라서 재정의가 필요하지 않은 경우에는 재정의하지 않는 것이 최선의 선택이다. ✔️ equals를 재정의하지 않는 것이 좋은 상황 1️⃣ 각 인스턴스가 본질적으로 고유한 경우 값을 표현하는 게 아니라 동작하는 개체를 표현하는 클래스. Thread 와 같은 클래스가 좋은 예시다. 2️⃣ 인스턴스의 '논리적 동치성'을 검사할 일이 없는 경우 3️⃣ 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는 경우 4️⃣ 클래스가 private 이거나 package-private 이고, equals 메서드를 호출할 일이 없는 경우 참고❗️ equals가 실수로라도 호출되는 걸 막고 싶다면 다음처럼 구현하자. @Override ..
-
[따라하며 배우는 도커와 CI환경] 6. 간단한 어플을 실제로 배포해보기(개발 환경 부분)DevOps/Docker 2022. 5. 30. 14:56
이번 시간부터는 간단한 애플리케이션를 배포하면서 도커를 배워보자. ✔️ 리액트 환경 세팅 리액트를 사용하려면 node를 반드시 설치해야 한다. $ npx create-react-app ./ node 설치 후, 위의 명령어를 통해 리액트 앱을 위한 환경을 세팅한다. 명령어가 실행되면 다음과 같은 파일들이 생성된다. ✔️ 도커로 리액트 앱 실행 이제 도커를 통해 리액트 앱을 실행해보자. 도커로 리액트 앱을 실행하기 위해서는 다음과 같은 과정을 수행해야 한다. 1️⃣ 도커 파일 생성 및 빌드 다음과 같이 도커 파일을 생성하자. Dockerfile.dev FROM node:alpine WORKDIR /usr/src/app COPY package.json ./ RUN npm install COPY ./ ./ CM..
-
[Effective Java] 아이템9: try-finally 보다는 try-with-resources 를 사용하라Language/Java 2022. 5. 30. 01:19
자바에는 InputStream, OutputStream, java.sql.Connection과 같이 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. 그런데 자원 닫기는 클라이언트가 놓치기 쉬워 성능 문제로 이어질 수 있다. 그렇다면 자원이 제대로 닫히도록 보장할 수 있는 방법은 무엇일까? 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally가 쓰였다. ✔️ try-finally static String firstLineOfFile(String path) throws IOException { BufferedReader br = new BufferedReader(new FileReader(path)); try { return br.readLine(); } finally { br..
-
[Effective Java] 아이템8: finalizer와 cleaner 사용을 피하라Language/Java 2022. 5. 30. 00:39
자바는 두 가지 객체 소멸자를 제공한다. 1️⃣ 첫 번째는 finalizer 다. finalizer는 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다. 2️⃣ 두 번째는 cleaner 다. finalizer는 오동작, 낮은 성능, 이식성 문제가 있었기 때문에, 자바 9에서 deprecated API로 지정되었고 finalizer의 대안으로 cleaner가 소개되었다. cleaner는 finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 성능이 느리고, 일반적으로 불필요하다. 그렇다면 지금부터 finalizer와 cleaner의 문제점을 알아보자. ✔️ 불확실성 (수행 미보장) finalizer와 cleaner는 즉시 수행된다는 보장이 없다. 객체에 접근할 수 없게 된 후 f..
-
[따라하며 배우는 도커와 CI환경] 5. Docker ComposeDevOps/Docker 2022. 5. 23. 17:11
📌 Docker Compose 란, 다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구 이다. 정의만 보아서는 어떤 도구인지 감이 잘 오지 않을 것이다. Node.js와 Redis를 이용한 애플리케이션을 만들어보면서 Docker Compose에 대하여 알아보자. 지난 강의에서 Node.js를 사용하여 간단한 애플리케이션을 만들어보았다. 그렇다면 Redis란 무엇일까? ✔️ Redis 란? Redis(REmote Dictionary Server)는 메모리 기반의 키-값 구조 데이터 관리 시스템으로, 모든 데이터를 메모리에 저장하고 빠르게 조회할 수 있는 비 관계형 데이터베이스(NoSql)이다. Redis를 사용하는 이유 메모리에 저장하기 때문에 Mysql 같은 데이터베이스에 데이터를 저장하고 불..
-
[따라하며 배우는 도커와 CI환경] 4. 도커를 이용한 간단한 Node.js 어플 만들기DevOps/Docker 2022. 5. 22. 15:33
이제부터 매우 간단한 Nodejs 앱을 도커 환경에서 실행해보자. ✔️ 아주 간단한 Node.js 앱 만들기 도커 실습을 위한 것이기 때문에 앱은 최대한 간단하게 만들어보자! Nodejs 프로젝트를 생성해주고 다음과 같이 파일을 추가한다. package.json { "name": "nodejs-docker-app", "version": "1.0.0", "description": "", "main": "server.js", "scripts": { "start": "node server.js", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "dependencies": { "express": "^..
-
[Effective Java] 아이템7: 다 쓴 객체 참조를 해제하라Language/Java 2022. 5. 21. 03:21
가비지 컬렉션 언어에서는 메모리 누수를 찾기가 아주 까다롭다. 가비지 컬렉터는 객체 참조 하나를 살려두면 그 객체 뿐만 아니라 그 객체가 참조하는 모든 객체(그리고 또 그 객체들이 참조하는 모든 객체...)를 회수해가지 못한다. 그래서 단 몇 개의 객체가 매우 많은 객체를 회수되지 못하게 할 수 있고, 잠재적으로 성능에 악영향을 줄 수 있다. 스택을 구현하는 다음의 코드를 보자. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAP..