Java

Java에 대해 공부한 것을 남깁니다.

Java - Atomic Type

동시성 제어

Java Atomic Type에 대해서 최근 메세지 큐 시스템을 제어하는 프레임워크 repo를 보다가 AtomicInteger라는 타입을 보게 되었다. 처음 보는 타입이라 흥미로워서 서치해보았다. 멅티 스레딩 프로그래밍에서 고려할 동시성 문제를 고려하면, 경쟁상태race condition을 고려해야 한다. 그럴 때 사용하는 것이 Atomic...

Java - 클린코드 with Java 18기에서 배운 점 정리

클린코드 with Java 18기

클린코드 객체 간 의존관계 연결, 인자 수를 최소화하기 메소드(함수)에 인자 수를 최소화한다 - 클린코드 책 중에서 메소드에서 이상적인 인자 개수는 0개이다. 다음은 1개이고, 다음은 2개이다. 3개는 가능한 피하는 편이 좋다. 4개 이상은 특별한 이유가 있어도 사용하면 안 된다. 인자를 줄이는 방법 관련이...

Java - switch to interface

조건분기: 미궁처럼 복잡한 분기 처리를 무너뜨리는 방법

조건 분기가 중첩되어 낮아지는 가독성 개선하는 방법 조기 리턴으로 중첩 제거하기 가독성을 낮추는 else 구문도 조기 리턴으로 해결하기 switch 조건문 switch 조건문 중복이 위험한 이유 같은 형태의 switch 조건문이 여러 개 사용될 수 잇다. 요구사항 변경 시 수정(case문 추가)을 누락할 수 있다. swi...

Java - static method

응집도와 static method의 상관관계

응집도 모듈 내부에 있는 데이터와 로직 사이의 관계가 얼마나 강한지 나타내는 지표 모듈은 클래스, 패키지, 레이어 등을 모두 포함한다. 응집도가 높은 구조는 변경하기 쉬운 바람직한 구조 응집도가 낮은 구조는 변경시 문제가 발생하기 쉽다. 응집도가 낮아지는 이유 1. static method의 오용 static 메서드로 정의...

Java - 함수형 인터페이스

코드 리뷰로부터 얻은 값진 수확

오늘 코드 리뷰 시간에 함수형 인터페이스 사용을 배웠다. 코드를 줄일 수 있는 새로운 방법을 배웠다! 근본적 질문 왜 함수형 프로그래밍이 주목받는가? 2000년대 초반까지는 CPU의 클럭 증가, 실행시간 최적화, cache 크기 증가를 통해 소프트웨어의 싱글 프로게스, 싱글 스레드의 속도가 증가했다. 그러나 전력 소모 및 발열 문제 등...

Java - 45) 스트림은 주의해서 사용하라

<이펙티브 자바>

이전에 코딩해놓은 서비스의 코드를 다시 보면서 stream으로 리팩토링하는 작업을 하고 있다. 놀랍도록 간결해지고 있다! 스트림은 주의해서 사용하라 스트림을 제대로 사용하면 프로그램이 짧고 깔끔해지지만, 잘못 사용하면 읽기 어렵고 유지보수도 힘들어진다. Stream API Stream API는 다량의 데이터 처리 작업을 돕고자 탄생했다....

Java - 바이트코드 조작

java를 조금 더 깊게 알고 싶어요.

코드 커버리지는 어떻게 측정하는 걸까? 테스트 커버리지 툴을 쓰면 (예를 들어 JaCoCo) 바이크 코드를 읽어서 코드에서 코드 커버리지를 측정해야 하는 부분을 카운트한다. 실행할 때, 그 중에 몇 개를 지나갔는지 카운트한다. 예상과 실제를 비교해서 측정한다. 작성중…! reference 더 자바, 코드를 조작하는 다양한 방법

Java - JVM, JDK, JRE

java를 조금 더 깊게 알고 싶어요.

JVM, JDK, JRE의 차이를 알아보자. JVM : Java Virtual Machine 자바 가상 머신 자바 바이트코드 (.class파일)를 인터프리터와 JIT 컴파일러가 OS에 특화된 코드로 변환하여 실행 JVM 밴더: 오라클, 아마존, Azul 등 특정 플랫폼에 종속적 JRE : Java Runtime Environme...

Java - flatMap, map

stream과 친해지기

flatMap()과 map()의 차이 mozilla에 의하면, Javascript에도 Array.prototype.flatMap()메소드가 있다. flatMap()메소드는 먼저 매핑함수를 사용해서 각 엘리먼트에 대해 map을 수행한다. 그 후 결과를 새로운 배열로 만든다. depth가 1인 flat(), 그 후 map()을 실행한 것과 동일하...

Java - SLF4J란?

logging

로그를 남긴다는 것? 시스템 운영에 대한 기록을 Log형태로 파일에 저장해 관리하는 것이다. 로깅의 목적 디버깅, 시스템 에러 추적, 성능, 문제점 향상 등을 위해 사용 너무 적은 로그는 정확한 시스템 상황을 파악하기 어렵게 한다. 너무 많은 로그는 파일IO로 인해 오버헤드와 로그 파일의 백업 문제 등 파생 문제가 발생할 가능성...

Java - '배열보다는 리스트를 사용하라'

<이펙티브 자바>를 읽으며 정리

배열보다는 리스트를 사용하라 배열과 제네릭 타입의 차이점 1. 변할 수 있는가? 배열은 함께 변한다. sub가 super의 하위타입이라면, sub[]는 super[]의 하위 타입이 된다. 제네릭은 함께 변하지 않는다. 서로 다른 타입 Type1과 Type2가 있을 때, List<Type1>과 List<Type2>는 ...

Java - Stack과 Queue

<이것이 자바다>를 읽으며 정리

Stack LIFO Stack<E> stack = new Stack<E>(); 주요 메소드 push(E item) : 주어진 객체를 스택에 넣기 peek() : 스택의 맨 위 객체를 가져오기. 객체를 스택에서 제거하지 않음. pop() : 스택의 맨 위 객체를 가져오기. 객체를 스택에서 제거함. Q...

Java - 비트 shift 연산자

연산자

비트 이동 연산자 x << y : 정수 x의 각 비트를 y만큼 왼쪽으로 이동시킨다. 빈자리는 0으로 채워진다. x >> y : 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킨다. 빈자리는 정수 a의 최상위 부호비트와 같은 값으로 채워진다. x >>> y : 정수 x의 각 비트를 y만큼 오른쪽으로 이동...

Java - 객체와 자료구조

<클린코드>

객체와 자료구조 변수를 private으로 정의하는 이유 남들이 변수에 의존하지 않게 만들고 싶어서 private 변수를 선언해놓고, 왜 getter와 setter를 당연하게 public 으로 만들어 비공개 변수를 외부에 노출하는가? 변수 사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지지는 않는다. 구현을 감추려면 추상화가 필요하다....

Java - 면접질문(JVM)

면접 대비를 해보자

JVM (Java Virtual Machine) 스택 기반의 가상 머신 자바 애플리케이션은 클래스 로더를 통해 읽어들여 자바 API와 함께 실행한다. Java가 OS에 구애받지 않고 재사용 가능하게 해준다. 메모리 관리, Garbage Collection을 수행한다. 자바 바이트 코드를 실행할 수 있는 주체다. 자바 프로그램 ...

Java - 면접질문(final 키워드, 접근제어자)

면접 대비를 해보자

Java final 키워드에 대해서 설명해주세요. 각각의 쓰임에 따라 어떻게 동작하나요? (Class, Variable) final 키워드 final class : 다른 클래스가 상속받지 못한다. final method : 자식 클래스에서 상위 클래스의 final method를 오버라이드 하지 못한다. final variable...

Java - 면접질문(기본형과 참조형, wrapper class)

면접 대비를 해보자

Primitive Type 기본형 타입 변수에 값 자체를 저장한다. stack영역에 생성된다. 사용하기 전에 반드시 선언되어야 한다. 초기화를 하지 않으면 자료형에 맞는 기본 값이 들어간다. OS에 따라 자료의 길이가 변하지 않는다. 비객체 타입이다. null을 가질 수 없다. 정수 byte, short, int, long ...

Java - 면접질문(OOP)

면접 대비를 해보자

객체 지향 방식을 왜 사용한다고 생각하시나요? 이전에 정리했던 포스팅 참고 Spring - 객체지향 SOLID 5원칙 OOP Object-Oriented Programming으로, 객체 지향적인 프로그래밍을 뜻한다. OOP는 객체를 기준으로 코드를 나누어 구현하는데, 자바는 클래스 단위로 객체를 표현한다. 클래스는 설계...

Java - stream

스트림 메소드 모음

스트림 파이프라인 Pipeline 프로세서로 가는 명령어들의 움직임을 의미 연산을 여러개의 stage로 분할해서 처리하기 때문에, 고속화를 위한 하나의 방식으로 볼 수 있다. Reduction 대량의 데이터를 가공하고 축소하는 것. 리덕션의 결과로 데이터 합계, 평균, 카운팅, 최댓값, 최솟값 등을 얻을 수 있다. -> 최...

Java - HashMap

HashMap의 메소드

HashMap 해싱된 Map을 뜻한다. Map Key-Value쌍으로 데이터를 보관하는 자료구조 Key는 맵에서 유일성을 가져야한다. 두 개 이상의 키가 존재하면 안 된다. Value는 중복된 값이어도 상관없다. HashMap과 HashTable 공통점 : HashTable은 사용법이 거의 동일하다. 차이점 : Hash...

Java - 함수

<클린코드>

함수 인수 함수에서 이상적인 파라미터 개수는 0개. 적으면 적을 수록 좋고, 3개는 가능한 피하는 편이 좋다. 4개 이상은 특별한 이유가 필요하다. 특별한 이유가 있어도 사용하면 안된다. 테스트 관점에서도 인수가 많을 수록 어렵다. 갖가지 인수 조합으로 함수를 검증하는 테스트 케이스를 작성해야 한다. 인수가 3개를 넘어가면 인수마다 ...

Java - Switch문 리펙토링

<클린코드>

다형성을 활용해 Switch문 을 저차원 클래스에 숨기고 반복하지 않는 방법 나쁜 Switch문 예시 1 2 3 4 5 6 7 8 9 10 11 12 public Money calculatePay(Employee e) throws InvalidEmployType { switch (e.type) { case COMMISSIONED...

Java - Comparable

<이펙티브 자바>

이펙티브 자바 책을 읽으면서 새로 알게 된 부분을 기록한 것입니다. Comparable을 구현할지 고려하라 compareTo = Comparable 인터페이스의 유일한 메소드 Object의 메소드가 아니다. 단순 동치성 비교에 더해 순서까지 비교할 수 있으며, 제네릭하다. Comparable을 구현했다 == 그 클래스의 인스턴스들에...

Java - 6) 불필요한 객체 생성 피하기

<이펙티브 자바>

이펙티브 자바 책을 읽으면서 새로 알게 된 부분을 기록한 것입니다. 불필요한 객체 생성 예시 실행될 때마다 String 인스턴스를 새로 만드는 것 1 String s = new String("umbrella"); 개선된 버전 1 Stirng s = "umbrella" 새로운 인스턴스를 매번 만드는 대신 하나의 String...

Java - 1) 정적 팩토리 메소드

<이펙티브 자바>

이펙티브 자바 책을 읽으면서 새로 알게 된 부분을 기록한 것입니다. Static factory method 정적 팩토리 메소드 : 클래스의 인스턴스를 반환하는 단순한 정적 메소드 (디자인 패턴과 다름) 예시 1 2 3 public static Boolean valueOf(boolean b) { return b ? Boolean.TR...

Java - 5) 의존 객체 주입

<이펙티브 자바>

이펙티브 자바 책을 읽으면서 새로 알게 된 부분을 기록한 것입니다. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다 대신 클래스가 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해야 한다. 이 자원들을 ...

Java - 가비지 컬렉션

Java Garbage Collection

Generation Garbage Collection 가비지 컬렉션이란? 동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능 Java에서 개발자가 프로그램 코드로 메모리를 명시적으로 해제하지 않기 때문에, 메모리 누수 방지를 위해 가비지 컬렉터는 더 이상 필요 없는 객체를 찾아서 지우는 역할을 한다. 동적...

Java - Comparable, Comparator로 정렬하기

Java 객체 정렬하기

Comparable Interface vs Comparator Interface 객체를 정렬한다는 것은 사용자가 정의한 기준으로 정렬하는 것이다. 객체를 비교하는 정렬 기준을 Comparable과 Comparator 인터페이스로 명시할 수 있다. Comparable과 Comparator은 모두 인터페이스다. 인터페이스에 선언된 메소드를 구현하면서 사...

Java - 더 빠른 입출력을 구현하기 위한 여정

StringTokenizer와 BufferedReader 콤비네이션

BufferedReader 버퍼를 이용해서 읽고 쓰는 것 Scanner보다 입출력의 효율이 좋아진다. 하드디스크는 원래 속도가 느리고, 외부장치와의 입출력은 생각보다 시간이 걸리는 작업이다. 따라서 데이터를 바로 목적지로 이동시키는 것보다 메모리 버퍼를 두어 데이터를 한번에 묶어서 이동시키는 것이 효율적이고 빠르다. Scanner와의...

Java - 람다 Predicate

<이것이 자바다>를 읽으며 정리

Predicate 함수적 인터페이스 매개변수와 boolean 리턴값이 있는 testXXX()메소드를 가지고 있다 이 메소드들은 매개값을 조사해서 true 또는 false로 리턴하는 역할을 한다 인터페이스 명 : Predicate<T> 추상 메소드 : boolean test(T t) 객체 T...

Java - 스트림

<이것이 자바다>를 읽으며 정리

Stream 자바 8부터 추가된 컬렉션의 저장요소를 하나씩 참조해서 람다식(functional style)으로 처리할 수 있도록 해주는 반복자 iterator -> stream iterator 반복자를 사용했을 때 1 2 3 4 5 6 List<String> list = Arrays.asList("김", "나", "박", "이"...

Java - 직렬화

<이펙티브 자바>

객체 직렬화 자바가 객체를 바이트 스트림으로 인코딩하고 (직렬화) 그 바이트 스트림으로부터 다시 객체를 재구성하는 (역직렬화) 매커니즘 직렬화된 객체는 다른 VM에 전송하거나 디스크에 저장한 수 나중에 역직렬화할 수 있다. 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바...

Java - 3)싱글턴

<이펙티브 자바>

이펙티브 자바 책을 읽으면서 새로 알게 된 부분을 기록한 것입니다. private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴 인스턴스를 오직 하나만 생성할 수 있는 클래스를 뜻한다. 싱글턴의 예시) 무상태 stateless 객체나 설계상 유일해야 하는 시스템 컴포넌트가 있다. 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트...

Java - 중첩 클래스와 중첩 인터페이스

<이것이 자바다>를 읽으며 정리

중첩 클래스 Nested Class 클래스 내부에 선언한 클래스 두 클래스의 멤버들을 서로 쉽게 접근할 수 있다. 외부에는 불필요한 관계 클래스를 감춰서 코드의 복잡성을 줄일 수 있다. 1 2 3 4 5 class ClassName { class NestedClassName { // 중첩 클래스 } } ...

Java - 람다

<이것이 자바다>를 읽으며 정리

객체지향 + 함수적 프로그래밍 자바는 객체 지향 흐로그래밍이 소프트웨어 개발의 주요 패러다임이었던 1990년대에 디자인되었다. 최근들어 함수적 프로그래밍이 다시 부각되고 있는데, 병렬 처리와 이벤트 지향 프로그래밍에 적합하기 때문이다. 객체 지향 프로그래밍과 함수적 프로그래밍을 혼합하여 더욱 효율적인 프로그래밍이 될 수 있도록 개발 언어...

Java - 2)메소드와 생성자

이펙티브 자바

이펙티브 자바 책을 읽으면서 새로 알게 된 부분을 기록한 것입니다. 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩토리와 생성자가 가진 제약 - 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점이다. 선택적 매개변수가 많을 경우 사용할 수 있는 몇 가지 패턴을 보여준다. 예시) 식품포장의 영양정보를 표현하는 클래스 1회 ...

Java - 메소드와 생성자

자바로 배우는 자료구조

매소드와 생성자 클래스는 서로 관련있는 데이터들을 하나의 단위로 묶어두기 위한 것이다. 서로 관련있는 데이터들뿐 아니라 그 데이터와 관련이 깊은 메소드를 함께 묶어둘 수 있다. 이렇게 해서 응집도(cohension)를 높이고, 결합도(coupling)를 낮출 수 있다. 연관성있는 모듈끼리 모아놓으면, 다른 모듈간의 상호의존성이 떨어져서 ...

Java - StringBuffer

StringBuffer가 무엇인지 알아보자

String String class 는 character string을 의미한다. Serializable, Comparable, CharSequence 인터페이스 상속 public final class로 되어 있다 → final형이기 때문에 초기값으로 주어진 String은 불변이고, 새로 할당되면 덮어씌워지는 것이 아닌 새로운 클래스에 ...

Java - Xml

Xml형식이 무엇인지 알아보자

Xml Extensible Markup Language 웹에서 구조화한 문서를 표현하고 전송하도록 설계한 마크업 언어. 문서 내용에 대한 구조와 의미를 기술하기 위한 언어. 다른 특수한 목적을 갖는 마크업 언어를 만드는 데 사용하도록 권장되는 다목적 마크업 언어, 메타언어다. 확장성이 뛰어나고 간단하다. 기본 개념 구조적인...

Java - Buffer

BufferedReader, BufferedWriter의 그 Buffer가 무엇인지 알아보자

Buffer란? 데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역을 의미 속도 차이가 있는 장치 사이에서 데이터를 전송할 때, 데이터 손식을 방지하고, 효율적으로 사용하기 위한 임시 저장공간 버퍼링 : 버퍼를 활용하는 방식 또는 버퍼를 채우는 동작 유튜브에서 동영상을 재생할 때, 재생중인 붉은...

Java - 정규표현식(Regular Expression)으로 한글 찾기

java.util.regex 패키지

Regular Expression 일정한 조건 패턴에 일치하는 문자열을 찾기 위해서 사용 java.util.regex패키지 내의 Matcher 클래스와 Pattern 클래스로 사용 정규표현식 몇 가지 표현식 설명 . 임의의 한 문자를 의미. 글자가 ...

Java - Stream

inputStream, outputStream의 그 stream이 무엇인지 알아보자

Stream 흐르는 시냇물 본래 영단어의 뜻은 흐르는 시냇물이라고 한다. 넓게 보아 ‘흐름’을 의미한다고 보면 될 것 같다. 데이터의 흐름 컴퓨터 용어로 stream이란, 데이터, 패킷, 비트 등 일련의 연속성을 갖는 흐름을 의미한다고 한다. 음성, 영상, 텍스트 등이 작은 데이터 조각으로 하나의 줄기를 이루면서, 순서대로 물 흐르...

Java - 버블 정렬

정렬 알고리즘

bubble sort 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 public class BubbleSort { public static void main(String[] args) { int[] ar...

Java - 예외처리

exception handling

예외처리 프로그램 오류 컴파일 에러 : 컴파일 시에 발생하는 에러 런타임 에러 : 실행 시에 발생하는 에러 논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것 자바에서는 실행시 발생할 수 있는 프로그램 오류를 에러와 예외(exception)로 구분 에러 : 메모리 부족이나 스택오버플로우처럼 일단 발생하면 복구할 수 없...

Java - JVM의 메모리 구조

method area, call stack, heap

JVM의 메모리 구조 1. 메소드 영역 method area 프로그램 실행 중 어떤 클래스가 사용됨 -> JVM은 해당 클래스의 클래스 파일을 읽어서 분석 -> 클래스에 대한 정보 (클래스 데이터)를 메소드 영역에 저장 클래스의 클래스 변수도 이 영역에 함께 생성됨 2. 힙 heap 인스턴스가 생성되는 공간 프로그...

Java - Thread

Thread에 대해서

쓰레드 프로세스와 자원을 이용해서 실제로 작업을 수행하는 것 모든 프로세스에는 최소한 하나 이상의 쓰레드 존재. 둘 이상의 쓰레드를 가진 프로세스 == multi-threaded process 하나의 프로세스가 가질 수 있는 쓰레드의 개수는 제한되어 있지 않지만, 쓰레드가 작업을 수행하면서 개별적인 호출스택을 필요로 하기 때문에 메모리의...

Java - 상속

상속에 대해서

상속 예제 Hero클래스를 상속하는 Warrior, Archer, Wizard 클래스를 만들고 Main클래스에서 메소드 호출하기 1 2 3 4 5 6 7 8 9 10 11 12 13 14 package objectTutorial; public class Hero { String name; public Hero(String name) { ...

Java - Inheritance

다형성에 대해서

다형성 polimorphism 여러가지 형태를 가질 수 있는 능력 조상 타입 참조 변수로 자손 타입 객체를 다루는 것. Tv t = new SmartTv()와 같이 조상타입의 자손 객체 생성이 가능하다. 반대의 경우는 불가능 instanceof 연산자 참조변수의 형변환 가능여부 확인에 사용. 가능하면 true반환. 형변...

Java - Inheritance

class의 기본에 대해서

상속 Inheritance : extends 기존의 클래스로 새로운 클래스를 작성하는 것(재사용) 자손은 조상의 모든 멤버를 상속받는다 (생성자, 초기화블럭 제외) 자손의 멤버 개수는 조상보다 적을 수 없다.(같거나 많다) 포함 composites 클래스의 멤버로 참조변수를 선언하는 것 작은 단위의 클래스를 만들고 이들을 ...

Java - Class, method

클래스와 메소드에 대해서

클래스의 정의 클래스 == 데이터 + 함수 변수는 하나의 데이터만 저장할 수 있고, 배열은 같은 종류의 데이터만 저장할 수 있다. 그래서 구조체라는 서로 관련된 여러 데이터를 종류에 관계없이 하나로 저장할 수 있는 공간을 만들게 된다. 이런 구조체에 함수(메소드)를 결합시킨 것이 클래스다. ...

Java - OOP

객체지향에 대해서

객체지향언어의 4가지 특징 캡슐화 상속 추상화 다형성 Class 객체를 정의해놓은 것 용도 : 객체를 생성하는데 사용 예) 제품설계도 Object 실제로 존재하는 것. 사물 또는 개념 예) 제품 객체 : 모든 인스턴스를 대표하는 일반적 용어 인스턴스 : 특정 클래스로부터 ...

Java - Array

배열에 대해서

배열 배열 : 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것 배열의 선언 배열을 다루기 위한 참조변수의 선언 타입[] 변수이름; : 배열을 선언 == 참조변수 선언 변수이름 = new 타입[길이]; : 배열을 생성 == 실제 저장공간을 생성 배열의 인덱스 각 요소에 자동으로 붙는 번호 범위는 0부터 ‘배열길이-1’...