자바
18 posts
이펙티브 자바 - 아이템 11 & 12

이 글은 몇몇 크루들과 이펙티브 자바 스터디를 하며 정리한 내용입니다. 🙌 🌩 [아이템 11] equals를 재정의하려거든 hashCode도 재정의하라 와 함께 도 재정의하지 않으면 이나 의 원소로 사용할 때 일관성이 무너진다. Object 명세에 따르면 다음 규약이 있다. eqauls(Object)가 두 객체를 같다고 판단하면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다. 다시 말해서 논리적으로 같은 객체는 같은 해시코드를 반환해야 한다는 것이다. 해시코드가 같지 않으면 다음 코드에서 일관성이 깨진다. 좋은 hashCode를 작성하기 hashCode의 로컬 int 변수 result를 첫번째 핵심 필드의 해시코드로 초기화 한다. (여기서 해시코드는 다음 2.a 단계대로 계산한다.) 다음 핵심 필드 들에 대해서 다음과 같이 해시코드를 계산하고 result 필드를 갱신한다. 기본 타입 필드라면 Type.hashCode(f)를 수행한다. Type은 해당 기본 타입의 박싱 클…

December 19, 2021
자바
이펙티브 자바 - 아이템 9 & 10

이 글은 몇몇 크루들과 이펙티브 자바 스터디를 하며 정리한 내용입니다. 🙌 🌩 [아이템 9] try-finally 보다는 try-with-resources를 사용하라 자바에서 close 메서드를 직접 호출해서 닫아주어야하는 자원들 , , 등등 try-finally 사용시 단점 try-finally를 사용한다면 닫아야 하는 자원이 많아질수록 매우 복잡해진다. try 블록과 finally 블록에서 모두 예외가 발생할 수 있는데, 만일 둘다 예외가 발생했을 경우 이후에 일어난 예외가 첫번째 예외를 삼켜서 디버깅을 어렵게 한다. try-with-resources로 해결 짧고 간결하여 읽기가 수월하다. try 내부와 에서 모두 예외가 발생 하더라도 첫번째 예외만 보여지고 두번째 예외는 되어 출력된다. catch 블록을 함께 사용하여 여러 예외를 처리할 수 있다. 🌩 [아이템 10] equals는 일반 규약을 지켜 재정의하라 대부분은 를 재정의 하지 않는 것이 가장 좋다. 책에서는 특히나…

December 18, 2021
자바
이펙티브 자바 - 아이템 7 & 8

이 글은 몇몇 크루들과 이펙티브 자바 스터디를 하며 정리한 내용입니다. 🙌 🌩 [아이템 7] 다 쓴 객체 참조를 해제하라 JVM 언어를 사용한다면 GC가 알아서 사용되지 않는 객체를 해제할텐데 왜 이런 항목이 있는걸까? 다음과 같은 경우에는 GC가 해당 객체가 다 쓴 객체인지 아닌지 판단할 수가 없다. Stack 자료구조를 구현한 예시이다. 다음과 같은 경우 다시 참조되지 않을 객체에 대한 해제가 이루어지지 않았기 때문에 ‘메모리 누수’가 발생한다. 이 프로그램이 오랜시간 실행이 되다보면 메모리 사용량이 늘어나 성능이 저하되거나 심하면 를 일으킬수도 있다. 위 코드와 같은 경우 배열에 더이상 사용되지 않는 영역의 객체 참조를 배열이 여전히 가지고 있다. 예를 들면 바깥에 존재하는 객체들에 대해서 말이다. 이렇게 GC에게 객체 처리를 맡기는 언어에서 이러한 메모리 누수를 찾기가 매우 어렵다. 또한 쓰이지 않지만 참조되고 있는 객체의 영향이 해당 객체에서 끝이 나는 것이 아니라 해…

December 17, 2021
자바
이펙티브 자바 - 아이템 5 & 6

이 글은 몇몇 크루들과 이펙티브 자바 스터디를 하며 정리한 내용입니다. 🙌 🌩 [아이템 5] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 하나의 클래스에서 다른 자원에 의존하는 경우가 많다. 또한 해당 클래스가 유틸리티 클래스라면 싱글톤이나 정적 클래스로 사용되는 경우가 많다. 정적 클래스로 구현한 경우 싱글톤으로 구현한 경우 그런 경우 여러 단점이 발생한다. 유연하지 않다. 안에 의존하고 있는 객체를 런타임 시점에 바꾸거나 조작하기가 어렵다. 여러 다른 사전들을 이용하고 싶을 때 변경에 자유롭지 못하다. 테스트하기 어렵다. 정적으로 의존 객체를 내부에서 생성하므로 모킹하거나 해당 객체에 대한 조작으로 테스트를 하기 어렵다. 의존성 주입(DI)을 통해 해결하기 위 문제에 대한 가능한 해결방법이 DI 말고 하나가 더 있다. 변경에 대한 유연성을 부여하기 위해 을 제거하고 여러 사전들을 바꿔서 사용할 수 있도록 한다. 이렇게 할 경우 멀티스레드 환경에 취약하고 오류를 내기가 …

December 16, 2021
자바
이펙티브 자바 - 아이템 3 & 4

이 글은 몇몇 크루들과 이펙티브 자바 스터디를 하며 정리한 내용입니다. 🙌 🌩 [아이템 3] private 생성자나 열거 타입으로 싱글턴임을 보증하라 하나의 인스턴스만 생성할 수 있는 것이 싱글턴(Singleton) 패턴이다. 참고로 싱글턴을 사용할 경우 이것을 사용하는 클라이언트를 테스트하기가 어렵다. 싱글턴 객체의 생성지점을 제어하기 어려우므로 mock으로 대체하기가 어렵기 때문이다. 싱글턴 객체를 구현하기 위해서는 다음 3가지 방법을 사용할 수 있다. 1) private 생성자 & public static final 필드 생성자의 접근제어자가 private이므로 인스턴스는 오직 필드를 초기화할 때 단 한번만 생성된다. 일반적인 경우 클라이언트는 이 부분에 대한 권한이 전혀 없지만 예외적으로 을 사용한다면 private 생성자를 호출할 수 있기는 하다. (방어를 위해서는 두번째 생성자 호출시 예외발생) 장점 필드를 사용할 경우 싱글턴이라는 것이 분명히 드러난다. (이므로 재…

December 15, 2021
자바
이펙티브 자바 - 아이템 1 & 2

이 글은 몇몇 크루들과 이펙티브 자바 스터디를 하며 정리한 내용입니다. 🙌 🌩 [아이템 1] 생성자 대신 정적 팩터리 메서드를 고려하라 정적 팩터리 메서드(static factory method)란? 해당 클래스의 인스턴스를 반환하는 정적 메서드이다. 예를 들어 다음 박싱 클래스를 반환하는 정적 메서드를 보자. 이 챕터에서 추천하는 바는 public 생성자 대신 정적 팩터리 메서드를 고려해보라는 것이다. 정적 팩터리 메서드는 장단점이 있다. 따라서 항상 정적 팩터리 메서드가 더 우수하다는 것은 아니다. 다만 습관적으로 public 생성자를 사용하기 이전에 상황을 살피고 정적 팩터리 메서드가 더 적합하다면 해당 메서드를 사용하도록 추천한다. 장점 이름을 가질 수 있다. 여러 종류의 생성자가 필요로 할 경우 매개변수의 수를 다르게 해서 추가하곤 한다. 하지만 이 매개변수와 생성자 자체로는 반환될 객체의 특성이나 언제 이 생성자가 사용이 되는지 설명할 수 없다. 따라서 이름을 가진 정적…

December 14, 2021
자바
JCF 파헤치기 1 - 기본 & ArrayList

💡 Intro 데이터의 그룹을 저장하는 클래스들을 표준화한 프로그래밍 방식 컬렉션 프레임워크는 다수의 데이터를 다루는 여러 클래스를 제공하여 개발자의 부담을 덜어준다. 인터페이스와 다형성을 이용해서 객체지향적으로 설계가 되어 있기 때문에 추상적이고 재사용성이 높은 좋은 프레임워크이다. 🌩 핵심 인터페이스 컬렉션에 담기는 데이터를 크게 3가지로 나누어 각각을 인터페이스로 정의해두었다. 그리고 3가지 중 List, Set의 공통점을 뽑아 따로 인터페이스로 추상화 되어 있다. 각 인터페이스와 특징은 다음과 같다. List: 순서가 있으며 중복이 허용된 데이터의 집합 ArrayList, LinkedList, Stack, Vector, etc. Set: 순서가 없으며 중복을 허용하지 않는 데이터의 집합 HashSet, TreeSet, etc. Map: 키와 값의 쌍으로 이루어진 데이터의 집합이며 순서를 유지하지 않으며 키는 중복을 허용하지 않음 HashMap, TreeMap, Hashtab…

December 03, 2021
자바
JVM 구조 알아보기

💡 Intro JVM은 자바의 큰 장점 중 하나로 이 가상머신이 깔려있는 운영체제에서는 모두 동일하게 자바 클래스 파일이 실행될 수 있다. JVM의 기본 구조를 알아보자 🙌 🌩 JVM 메모리 구조 1) Class Loader 2) Execution Engine 3) Garbage Collector 4) Runtime Data Area 4가지로 나뉘어져 있다. Class Loader JVM 내로 클래스 파일을 로드하고 링크를 통해 배치하는 작업을 수행한다. 런타임 시에 동적으로 클래스를 로드한다. Execution Engine 클래스 로더가 Runtime Data Area에 배치한 바이트 코드들을 명령어 단위로 읽어서 실행하는 작업을 수행한다. 최초 JVM에서는 인터프리터 방식이어서 느렸지만 JIT 컴파일러로 변경되면서 실행이 빠르다는 장점이 있다. 모든 코드 JIT으로 하지 않고 인터프리터로 하다가 일정한 기준이 넘어가면 JIT 컴파일러 방식으로 실행한다. 한번 읽어서 기계어로 변…

November 17, 2021
자바
추상클래스와 인터페이스 더 이상 헷갈리지 않기

💡 Intro 인터페이스와 추상클래스의 차이를 명확하게 구분해보자. 언제 무엇을 쓰는 것이 좋은지 나름의 정의를 내려본다. 상속의 위험성에 대해서 고민해본다. 🌩 추상클래스 추상 클래스는 “미완성 설계도” 이다. 공통부분을 우선 정의한 미완성 설계도를 만들고 각기 다른 상황에 대해서 추가로 구현할 수 있다. 완성되지 않은 abstract 메소드를 포함하고 있다. 추상클래스는 abstract 메소드가 있다는 것을 제외하고는 일반클래스와 동일하다. 상속은 자손 클래스를 만드는데 조상 클래스를 사용하는 것 추상화는 자손 클래스의 공통부분을 뽑아내서 조상 클래스를 만드는 것 상속 추상클래스를 하는 명령어가 상속에서 사용되기 때문에 두 개념이 혼용되어서 사용되기도 한다. 엄밀히 말하면 두 개념이 겹칠수도 있지만 완전히 동일한 것은 아니다. 상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것 적은 양의 코드로 새로운 클래스를 작성할 수 있고 공통부분을 관리할 수 있다는 장점이 …

November 15, 2021
자바
동작 파라미터부터 람다까지: 콜백함수를 곁들인

[INTRO] 자바가 업데이트 되면서 메소드를 일급시민으로 취급할 수 있게 되었다. 이로 인해 동작 파라미터를 통해서 어떠한 동작을 인자로 넘길 수 있다. 메소드를 일급 시민으로 취급하면서 함수형 인터페이스 등의 개념이 등장한다. 코드의 명확성을 증진시키기 위해 익명 클래스, 람다 함수, 메서드 참조 등등의 개념이 활용된다. 동작 파라미터를 활용한 예시로 콜백 함수를 들여다보자. [왜 동작 파라미터인가?] 코딩을 할 때 가장 중요한 요소 중 하나는 변화하는 요구사항에 대응하는 것이다. 동작 파라미터화는 나중에 실행할 코드 블록을 인수로 넘겨서 행동을 결정하는 것이다. 나중에 실행되도록 넘기는 콜백 함수와 같은 동일하게 작용한다. (내재된 개념이다) 이해를 돕기 위해 모던 자바 인 액션 에 나온 예제를 살펴보자. 상황1: 사과를 색으로 필터링 하는 요구사항을 구현한다. 상황2: 사과를 무게로 필터링하는 요구사항을 구현한다. 위 두 코드가 상당히 유사하다. (실제로 작성할 때도 복붙하…

September 22, 2021
자바
Java IOStream 과 파일 입출력

자바 I/O 스트림 Stream은 데이터의 연속이다. Sequence of Data 다르게 말하면 Stream 이란 한쪽으로 흐르는 통로같은 것이다. 자바에서 Stream이란 한쪽 source에서 destination으로 흐르는 데이터를 위한 단방향 통로이다. 자바에서는 여러 매체를 읽거나 쓸 수 있고 각자를 위한 I/O Stream이 구현되어 있다. (disk files, devices, programs, memory arrays) Stream은 단방향 통신이기때문에 들어오는 데이터, 나가는 데이터에 따로 InputStream, OutputStream이 있는 것이다. I/O 스트림은 여러가지 종류의 데이터들을 처리할 수 있다: 바이트, primitive data type, characters, objects Stream은 단순히 데이터를 전달하는 역할만 하기도하고, 몇몇 stream은 데이터를 조작하고 편리하게 변환하는 역할을 수행하기도 한다. 모든 Stream은 사용 후 반드시…

August 26, 2021
자바
CQS(Command Query Separation) 간단히 알아보기

Intro 함수는 시스템의 상태를 바꾸는지에 따라서 크게 두 가지로 나뉜다. 1) Command 2) Query. 이 두 가지 분류법에 대해서 하나의 함수가 두 가지 경우를 모두 담당하는 것은 좋지 않다. Command vs. Query Query 주어진 쿼리에 대한 결과값을 반환하고 시스템의 상태를 변화시키지는 않는다. 다른 값을 바꾸지 않고 오직 질문에만 대답한다. 부작용에서 자유롭다. (read-only) Command 값을 반환하지 않아도 시스템의 상태를 변화시킨다. (영구적) 부작용이 생길 여기자 있다. (mutator, modifier) 이렇게 함수를 두 가지로 나누는 것은 유용하다. 현재 사용하는 함수가 상태를 바꾸지 않는 query 라면 신뢰를 가지고 사용할 수 있다. 하지만 상태를 바꾸는 command라면 함수간 순서에 주의를 기울이고 부작용이 생길 여지를 인지하고 있어야 한다. CQS - Command Query Separation Betrand Meyer라는 프…

July 17, 2021
자바
Hash와 Salt

들어가기 전에 암호화(Encryption)과 해싱은 다른 개념 암호화 - 양방향이므로 복호화가 가능 해싱 - 단방향이므로 복호화가 불가능 단방향 해시 함수 (One-Way Hash Function) 기본적으로 패스워드 등의 보안의 문제가 걸린 정보를 DB에 저장할 때 평문으로 저장하지 않고 해싱한 값을 저장한다. (평문으로 저장할 경우 DB가 해킹되었을 때 심각한 문제가 발생한다) 단방향 해시 함수를 사용해서 원본 내용을 완전히 새로운 내용으로 다이제스트(digest)로 매핑한다. 이때 매핑하는 것을 해시라고 한다. 이것은 단방향이므로 복호화할 수 없다. 해시 함수 종류 SHA MD HAS WHIRLPOOL 한계점 Rainbow Table 동일한 데이터를 동일한 해시 함수로 연산한 다이제스트는 동일한 값을 가진다. 따라서 여러 값들에 대한 다이제스트를 모아놓은 Rainbow Table이라는 것이 존재하고 이것을 통해서 원본 데이터를 유추할 수 있다. Brute-force 해싱 …

June 21, 2021
자바
자바빈 규약 (번외: Serialization)

간단한 JavaBean 규약에 대해서 알고 넘어가기 JavaBean 자바빈 규약을 따르는 Java Class를 말한다. JavaBean 규약 defulat 패키지가 아닌 패키지 하위에 있는 클래스 기본 생성자가 존재 (no-arg constructor) Property는 모두 private으로 선언 Getter/setter를 통해서 properties를 조작 을 implement 하여 직렬화 가능 번외 : Serialization & Deserialization Serialization : converting state of an object into a byte stream Deserialization: reverse process of serialization 해당 객체에 영속성을 부여하기 위해서 사용되는 매커니즘이다. Java 객체를 serialize 하게 하기 위해서는 인터페이스를 구현하도록 한다. 해당 인터페이스는 멤버변수나 메소드가 존재하지 않는 marker inte…

June 08, 2021
자바
Stream vs. Collection

요약하자면 Stream과 Collection의 차이는 다음과 같다. 개념적으로 접근했을 때 Collection의 경우에는 어떠한 데이터를 담는 자료구조의 역할을 주로 하지만, Stream의 경우는 연산과 관련된 것이 주라고 볼 수 있다. Quote Java Collections offer efficient mechanisms to store and process the data by providing data structures like List, Set, and Map. However, the Stream API is useful for performing various operations on the data without the need for intermediate storage. 출처: https://www.baeldung.com/java-return-stream-collection Traversal Collection은 여러번 데이터를 횡단할 수 있지만, Stream은 …

March 20, 2021
자바
[JAVA] 구글에서 제공하는 Java Coding Convention Guide

프리코스를 진행하면서 구글에서 제공하는 javaGuide를 읽고 해당 convention을 따라서 코딩 하도록 하기 위해서 해당 문서를 정독했다. 원래 알고 있던 부분들도 있고 아닌 부분들도 있는데, 이렇게 잘 문서화 되어 있다는 것을 처음 알았다. 다음은 해당 문서를 읽으면서 두고두고 참고할 내용들을 정리한 것들이다. 다음 사이트 참고: Google Java Style Guide 1. Source file structure Java 소스 파일은 다음과 같은 구조를 가지고 있다. 순서에 유의하여 구조화 되어 있다. 만약 존재한다면, license or copyright information Package 명시 Import statements 단 하나의 top-level class → 위의 4 section을 1줄 간격(exactly one blank)으로 나눈다. 1-1. copyright information 소스파일 맨 위에 시작 주석으로 파일 클래스 이름, 버전 정보, 날짜…

November 28, 2020
자바
[JAVA] ArrayList와 LinkedList 차이점

자바에서 LIST 인터페이스를 구현한 Collection 구현체 중 가장 많이 쓰고 헷갈리는 것이 ArrayList와 LinkedList의 차이이다. 알고리즘 코딩을 공부하다가 특정 답을 배열 구조에 담을 일이 있어서 찾아보다 문득 ArrayList, LinkedList 중 무엇을 쓸까 고민하는 김에 정리하게 되었다. 인터페이스도 같고 사용하는 방식도 비슷한 부분이 많기 때문에 ArrayList를 써야할 때 LinkedList를 쓰거나 그 반대로 사용하더라도 큰 차이가 없이 느껴지기도 한다. 하지만 두 가지 자료구조가 구분되어 있는 만큼 더 적절한 부분이 있다. 간단히 한번 알아보자. Java에서는 변수를 저장하기 위해서 배열을 사용한다. 하지만 배열의 단점은 초기에 길이를 저장해서 미리 메모리를 확보해 놓아야 한다는 것이다. 다라서 동적으로 메모리 할당이 어려울 뿐만 아니라, 예상하지 못하는 입력크기에 대해서는 애초에 크게 배열의 크기를 잡아놓는 비효율적인 방법을 택해야 한다…

August 09, 2020
자바
[Java] Wrapper Classes in Java

다음은 Java에 존재하는 아주 특이한 클래스인 Wrapper class에 대한 내용이다. JAVA wrapper class에 대해서 설명한 한 사이트를 번역하는 겸 공부한 내용을 정리해 작성해놓았다. 1. 개요 Wrapper class(감싸는 클래스) 이름이 설명하듯이 wrapper class는 자바의 Primitive types들을 객체로 감싸는 역할을 하는 클래스이다. 다음과 같은 자바의 primitive 타입들은 모두 각자의 wrapper 클래스가 있다. boolean, byte, short, char, int, long, float, double Boolean, Byte, Short, Character, Integer, Long, Float, Double 이것들은 모두 java.lang 패키지에 정의되어 있으므로 따로 import 하지 않아도 사용할 수 있다. 2. Wrapper Classes “Wrapper 클래스의 목적은 무엇입니까?”는 자바 관련 인터뷰에서 흔…

August 08, 2020
자바