일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 데이터베이스
- Service Locator
- Firebase
- 트랜잭션
- @Valid
- Web
- 디자인 패턴
- Connection Pool
- Effetive Java
- @ControllerAdvice
- JPA
- db
- Effective Java
- Service Locator 패턴
- Proxy Patter
- java
- @MockBean
- SQL 삽입 공격
- springboot
- 플라이웨이트
- restTemplate
- NotBlank
- @SpyBean
- NotEmpty
- multi module
- Item04
- 이펙티브 자바
- Spring Boot
- FCM
- deleteById
- Today
- Total
목록Java (15)
NoTimeForDawdling
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/csQ1rn/btrQw2fbmom/gizj3AZgNLFpNvkq5NKqo0/img.png)
상황에 따라 ArrayList와 LinkedList를 적절히 활용한다면 더 좋은 효율성을 보여줄 수 있을 텐데요, 어떨 때 어떤 자료구조를 사용하면 좋을지 한번 알아보겠습니다. 구조 ArrayList와 LinkedList를 그림으로 보면 다음과 같습니다. ArrayList는 데이터들이 순서대로 쭉 늘어선 배열의 형식을 취하고 있습니다. LinkedList는 순서대로 늘어선 것이 아니라 자료의 주소 값으로 서로 연결되어 있는 구조를 하고 있습니다 ArrayList 동적 배열을 사용하여 요소를 저장합니다. 데이터를 저장하고 접근하는데 좋습니다. 특정 자료형들이 메모리 공간 상에서 연속적으로 이루어져 있습니다. 인덱스로 해당 원소에 접근할 수 있으며, 인덱스를 알고 있다면 O(1)의 시간 복잡도로 원소에 접근..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/R8lyF/btrfPWCVxh9/SrUKrdkzckusECfhoEbtDk/img.png)
최근에 비동기 처리에 대한 관심이 생겼다. Java를 활용한 비동기 처리에 대해 한번 공부해보고자 한다. Sync vs Async CompletableFuture를 공부하기에 앞서 Sync(동기)와 Async(비동기)에 대해 먼저 알아보자. 이번 포스팅에서 사용할 시나리오는 다음과 같다. 시나리오 카페에 있는 메뉴의 가격을 조회한다. 예를 들어 "iceAmericano"라는 이름의 메뉴를 조회하면 4100원이라고 응답을 해주는 기능이다. 클래스에서는 가격을 조회하는 메서드를 제공한다. 클라이언트는 해당 메서드를 호출할 때 커피의 이름을 파라미터로 넘겨주면 4100원이라는 데이터를 리턴받는다. 여기서 클라이언트는 메서드를 호출하는 곳이다. Sync 클라이언트에서 "iceAmericano"라는 메뉴를 조회하..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cvTucy/btreTH6l8Dp/aW2EiakNYaS2AHkgW7HpZK/img.png)
String String 클래스는 immutable(불변) 하기 때문에 String의 값은 한 번 생성되면 변경될 수 없다. String 클래스의 문자열을 저장하는 char[]를 보면 final로 선언되어있다는 것을 확인할 수 있다. 그렇기 때문에 한번 할당한 문자열에 대한 변경이 불가능하며, 문자열 연산이 많아질 때 계속해서 새로운 객체를 만들기 때문에, 오버해드가 발생하므로 성능이 떨어지는 단점이 있다. 반복적으로 문자열을 이어 붙이면 Heap영역에 참조를 잃은 문자열 객체가 계속해서 쌓이게 되고, 이는 GC에 대한 비용이 증가라는 단점을 낫게 된다. 하지만 이러한 불변성은 멀티스레드 환경에서 동기화를 신경 쓸 필요가 없다. 즉, Thread Safe하다. 또한, 단순하게 읽어가는 조회 연산에서는 타..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/sn0Se/btq66kFadru/gLofketUMc5H0KuT6qVFzk/img.png)
강한 참조(Strong Reference) 강한 참조는 Java의 기본 참조 유형으로 new를 통해 객체를 생성할 때 생기게 되는 참조다. 강함 참조를 통해 참조되고 있는 객체는 참조가 해제되지 않는 이상 가비지 컬렉션의 대상에서 제외된다. 약한 참조(Weak Reference) 약한 참조는 java의 lang 패키지의 WeakReference 클래스를 사용하여 생성한다. 약한 참조는 GC가 발생하면 무조건 수거된다. WeakReference가 사라지는 시점이 GC의 실행 주기와 일치한다. Soft Reference Soft 참조는 강한 참조와 약한 참조와는 다르게 GC에 의해 수거될 수도 있고, 수거되지 않을 수도 있다. 메모리에 충분한 여유가 있다면 GC가 수행된다 하더라도 수거되지 않는다. 하지만 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bb53Pj/btqZheUfht9/P0Kq9lwjD0Yhs9GkjWJuS1/img.png)
해시코드(hashCode) 해시코드란? 자바에서 동일한 이름의 객체가 여러 개 생성될 수 있는데, 이 객체들은 이름만 같을 뿐 서로 다른 상태를 가진 객체들입니다. 이 객체들을 구분하기 위해 고유한 정수값으로 출력시켜주는 메서드가 바로 hashCode()입니다. 즉, 해시코드란 객체를 식별하는 고유한 정수값을 의미합니다. 해시코드는 일반적으로 객체의 내부 주소를 정수값으로 변환하는 형태로 구현됩니다. 코드 예제 public class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } } public class HashcodeTest { public..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b3igKa/btqYLylkXUE/HKsDLiSTKYf5liKqhjzqY0/img.png)
기본형과 참조형의 종류 기본형과 참조형의 종류는 다음과 같습니다. 기본형(Primitive Type) Boolean Type(boolean) Numeric Type Character Type(char) Integral Type Integer Type(short, int, long) Floating Point Type(float, double) 참조형(Reference Type) Class Type Interface Type Array Type Enum Type 기본형(Primitive Type) 기본형이란? 기본형은 실제 값을 저장하는 공간입니다. 자바에서 기본 자료형은 반드시 사용하기 전에 선언되어야 합니다. 비객체 타입으로 null값을 가질 수 없습니다. 기본형의 종류(8가지) Type Bits Ra..
예전에 스터디를 참여하면서 일급 컬렉션에 대해 공부하고, 적용해 본 적이 있었습니다. 일급 컬렉션이 무엇인지, 어떤 장점이 있는지 지금부터 알아보겠습니다. 일급 컬렉션이란? 일급 컬렉션은 Collection을 Wrapping 하면서, 그 외 다른 멤버 변수가 없는 상태를 뜻합니다. 중요한 점은 Collection을 포함한 클래스는 반드시 다른 멤버 변수가 없어야 한다는 겁니다. 간단한 코드 예제 List numbers = new ArrayList(); numbers.add(1); numbers.add(2); numbers.add(3); 위의 코드를 아래와 같이 Wrapping 하는 것을 얘기합니다. public class Numbers { private List numbers; public FirstCl..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/wlNL6/btqYtOPpnyi/yr0DJ8wxGHWgGTEY8tywE1/img.png)
개발을 하다 보면 객체를 복사할 때가 있을 겁니다. 객체의 복사는 얕은 복사와 깊은 복사 두 개념으로 나뉩니다. 단어만 보고 어떤 개념인 것 같은지 느낌이 오시나요?? 어떤 느낌일 것 같은지 생각해 보셨다면 생각한 것과 일치하는지 한번 알아보겠습니다! 얕은 복사란?(Shallow copy) 얕은 복사란 객체의 참조값(주소값)을 복사하는 것을 의미합니다. 복사된 객체는 원본 객체와 같은 주소값을 참조합니다. 그렇기 때문에 복사된 객체의 값이 바뀌면 원본 객체의 값 또한 바뀌게 됩니다. 깊은 복사란?(Deep Copy) 깊은 복사란 객체의 실체 값을 복사하는 것을 의미합니다. 복사될 객체에 새 주소를 할당하여 원본 객체의 모든 값을 복사합니다. 원본 객체의 주소 값을 참조하지 않기 때문에 복사된 객체의 변화..