java 15

[JAVA] 전략패턴

정의 행위를 클래스로 캡슐화하여 동적으로 행위를 자유롭게 바꿀수 있게 해주는 패턴 객체들이 할 수 있는 행위를 각각 전략으로 만들어, 동적으로 전략을 바꿔 행위를 수정하는 패턴 기존코드의 변경없이 실제 로직 변경을 할 수있는 패턴 GoF 디자인 패턴의 분류 중 행위패턴에 해당함 사용하는 용도 클래스들의 동작이 다른 경우 로직 변경이 필요할 때 사용 예시 public interface Skill { void use(); } public class Sett { private Skill skill; public void useSkill() { skill.use(); } public void setSkill(Skill skill) { this.skill = skill; } } public class Haymak..

JAVA 2021.11.29

[JAVA] String / StringBuilder / StringBuffer

String 정리 기본타입(Primitive Type)이 아닌 참조타입(Reference Type) 불변(immutable)의 속성 (불변이라 멀티쓰레드 환경에서 쓰레드세이프함 / 값 변경 가능성이 없기 때문에 동기화 문제 X) String 객체는 String constant pool(Heap에 할당되어 있음)에서 따로 관리가 됨 String constant pool에서 String을 관리하면 Java는 Runtime 에서 Heap영역의 메모리를 절약함 (같은 값을 가지는 String에 대해 같은 메모리를 참조하기 때문) String은 결론적으로 Heap영역에서 관리하며 불변객체이기 때문에 문자열을 추가, 수정, 삭제를 하면 새로운 문자열을 만들어야 하기 때문에 Heap영역에서 많은 가비지가 생성되어 성..

JAVA 2021.06.20

[JAVA] HashMap 원리

정의 Key-Value가 1:1로 Mapping되는 자료구조 Mapping으로 인해 삽입, 삭제, 검색이 평균적으로 O(1)인 자료구조 Key에 대한 해시값을 기반으로 값을 저장 및 조회하는 자료구조 개념 정리 HashMap은 기본적으로 내부구조는 배열로 되어 있음 Key는 직접 내부 배열의 인덱스가 될 수 있으며, 이를 버킷이라고 함 인덱스는 hashcode()에서 리턴하는 int값(정수값) % 실제 표현이 가능한 정수범위(n)보다 작은 M개의 원소로 만들어짐, 해당 인덱스는 1 / M 확률로 동일한 값으로 발생할 수 있으며, 이를 해시충돌이라고 함 해시충돌 방지 기법으로 Open Addressing 방식과 Seperate Chaning 방식이 있으며, Java HashMap 같은 경우 Seperate..

JAVA 2021.06.13

[JAVA] 일급컬렉션

정의 Collection을 Wrapping하면서, Wrapping한 Collection 외 다른 멤버 변수가 없는 상태 예시 public class BookStore { private String name; private List books; } public class Book { private String name; private double price; } BookStore클래스에 List인 books를 선언하였음 해당 List books를 사용하지 않고, Wrapping 처리를 함 (아래 예시 참조) public class Books { /* Book을 Wrapping한 Books */ private List books; .. } public class BookStore { private Strin..

JAVA 2021.06.10

[JAVA] Map / getOrDefault

getOrDefault 찾는키가 존재하면 해당 키의 값을 반환하고 없으면, Default 값을 반환하는 메소드 사용법 getOrDefault(Object key, V defaultValue) key : 값을 가져와야하는 요소 키 defaultValue : 지정된 키에 매핑 된 값이 없는 경우 설정 된 default 값 public class Main { public static void main(String[] args) { Map map = new HashMap(); map.getOrDefault("키", "기본값"); /* 결과 null로 나옴 */ System.out.println(map.get("키")); } } public class Main { public static void main(Str..

JAVA 2021.06.10

[JAVA] 싱글턴 패턴

정의 및 특징 객체의 인스턴스가 오직 1개로만 만들어져서 공유하는 패턴 하나의 인스턴스를 메모리에 등록해서 여러 스레드가 동시에 해당 인스턴스를 공유하여 사용하게끔 할 수 있어서, 요청이 많은 곳에서 사용하면 효율을 높임 (전역으로 사용되는 인스턴스이기 때문) 싱글턴을 만들때 동시성(Concurrency) 문제를 고려해야함 내부 상태를 변경하기가 어려움 (상태 넣기가 어려움) 싱글턴 패턴 구현 싱글턴패턴 기본구현은 static영역에 객체 instance를 미리 하나 올려서 getInstance() 메서드를 통해서만 조회할 수 있게 구현을 하며, 생성자를 private으로 막아 new 키워드로 객체인스턴스를 생성못하게 막음, 그외 구현 방식은 여러가지가 있음 싱글턴 패턴 구현 방법 Eager Initial..

JAVA 2021.06.05

[JAVA] JVM 구조

JVM 정의 자바 가상머신, 자바 바이트 코드를 실행하는 주체, 어떠한 운영체제에서 독립적으로 실행 가능 자바 바이트 코드를 인터프리터와 JIT컴파일러를 통해 변환하여 실행함 JRE 정의 자바 애플리케이션을 실행할 수 있도록 구성된 배포판 JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스파일을 가지고 있음 JDK 정의 JRE + 개발에 필요한 툴 오라클은 자바 11부터 JRE를 따로 제공하지 않고 JDK만 제공함 JVM 구성 Class Loader Execution Engine Garbage Collector Runtime Data Area Class Loader 자바파일을 컴파일하면 클래스파일(바이트 코드)이 생성되고, 클래스 파일들을 엮어 Runtime Data Ar..

JAVA 2021.06.03

[JAVA] Enum

정의 열거형이라고 불리며, 서로 연관된 상수들의 집합을 의미 /* enum 예시 */ public enum Security { NORMAL, WARNING, DANGER; } 특징 인스턴스 생성과 상속을 방지하여 상수값의 타입 안정성이 보장 데이터들 간의 연관관계를 명확하게 표현하여, 구현의 의도를 명확하게 알수 있음 코드가 단순해지고, 가독성 보장 enum 클래스 내부 동작은 static영역임, 즉 프로그램이 종료되기 전까지 가져다 쓸 수 있는 메모리 공간 확보됨 (https://stackoverflow.com/questions/143285/how-much-memory-do-enums-take) 일반 메서드를 가질 수 있음 실무에서 사용할 때, 주로 관계가 있는 타입으로 묶어서 사용함 (ex. 부서유형..

JAVA 2021.06.02

[JAVA] GC의 종류

GC종류를 명확하게 설명을 못해서 정리 GC종류 Serial GC Parallel GC CMS GC G1 GC Serial GC -XX:+UseSerialGC 32비트 JVM에서 돌아가는 싱글쓰레드 어플리케이션에서 사용 MinorGC, MajorGC 모두 순차적으로 수행 (싱글쓰레드 방식) Deletion and Compacting 수행 Parallel GC (Throughput Collector) -XX:+UseParallelGC 64비트 JVM에서 돌아가는 멀티 CPU, 유닉스 머신에서 사용 Default로 young generation에서만 멀티스레드를 활용, 옵션을 통해 old generation에서도 멀티스레딩 활용 가능 많은 CPU를 사용하기 때문에 GC의 부하를 줄이고, 애플리케이션 처리량을..

JAVA 2021.05.23

[JAVA] 상태패턴

정의 상태를 객체화하여 상태가 행동을 할 수 있도록 위임하는 패턴 상태 클래스들을 인터페이스로 캡슐화 하여, 인터페이스를 호출하는 방식 사용하는 경우 객체 동작이 상태에 의존하는 경우 오브젝트 상태에 따라 여러 부분의 조건문이 있는 경우 예시 /* 캡슐화 인터페이스 정의 */ public interface MonitorState { public void checkState(); } /* 상태클래스 정의 */ public class Normal implements MonitorState { @Override public void checkState() { System.out.println("정상상태 확인"); } } /* 상태클래스 정의 */ public class Warning implements Mon..

JAVA 2021.05.21