그래도 해야지
[JAVA] synchronized를 이용한 동기화와 락의 단위
1. 쓰레드의 동기화싱글쓰레드의 프로세스의 경우 프로세스 내에서 단 하나의 쓰레드만 작업하기 때문에 프로세스의 자원을 가지고 작업하는 문제가 없지만, 멀티 쓰레드 프로세스의 경우 여러 쓰레드가 같은 프로세스 내의 자원을 공유해 작업하기 때문에 서로의 작업에 영향을 준다. 만약에 쓰레드 A가 작업하던 도중에 다른 쓰레드B에게 제어권이 넘어갔을 때 쓰레드 A가 작업하던 공유데이터를 쓰레드 B가 변경하였다면 다시 쓰레드 A가 제어권을 받아서 나머지 작업을 마쳤을 때 원래 의도했던 것과는 다른 결과를 얻을 수 있다. 이러한 일을 방지하기 위해 한 쓰레드가 특정 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 하는 것이 필요하다. 그래서 도입된 개념이 임계영역(critical section)과 잠금(락..
StringBuilder는 어떻게 내부 크기를 늘릴까?
멘토링을 진행하면서 String과 다르게 StringBuilder와 StringBuffer이 가변의 속성을 가지고 있음을 알았다. 그리고 StringBuilder가 어떻게 내부적으로 동작할까? ArrayList와 비슷하게 동작하지 않을까? 라는 궁금증이 생겼고 이에 대해 한번 알아봤다. 1. StringBuilder StringBuilder는 StringBuffer와는 다르게 멀티쓰레드에 안전하지 않은 문자열 클래스이다. 하지만 단일 쓰레드 환경에서는 속도가 더 빠르게 때문에 동기화를 고려하지 않는 환경에서 사용하는 것이 좋다. 그리고 StringBuilder의 객체는 String 처럼 String constant pool을 사용하지 않고 heap 영역에 저장된다. 그렇다면 StringBuilder은 연..
[JAVA] ArrayList의 로드팩터는 1인데 HashMap의 로드팩터는 0.75일까?
/** * The default initial capacity - MUST be a power of two. */ static final int DEFAULT_INITIAL_CAPACITY = 1
[JAVA] float과 double은 왜 정확한 숫자계산에 쓸 수 없을까?
1. float와 double float와 double은 자바에서 0.12, 0.333 과 같은 실수를 표현하는 실수형 자료형이다. 그리고 두 실수형이 표현할수있는 범위는 다음과 같다. 위 표는 ‘양의 범위’만 적은 것으로 - 부호를 붙이면 ‘음의 범위’가 된다. 예를 들어 float 타입으로 표현 가능한 음의 범위는 -1.4 x 10 ^45 ~ -3.4 X 10^38이다. 따라서 float 타입의 표현범위는 -3.4 X 10^38 ~ 3.4 X10^38 이지만, -1.4 X10^45 ~1.4 X 10^-45범위의 값은 표현할 수 없다. (0 제외) 실수형은 소수점을 표현해야하므로 ‘얼마나 큰 값을 표현할 수 있는가 ’뿐만 아니라 ‘얼마나 0에 가깝게 표현할 수 있는가’도 중요하다. 2. 실수의 표현방식..
[JAVA] GC 과정에서 왜 survivor 한곳을 비워야할까?
멘토링을 하다가 멘토님에게 "GC를 왜 두개로 나누고 한곳을 survivor을 비워야할까요?"라는 질문을 받았다. 단순히 그렇구나라고만 생각하고 지나갔었는데 설명을 듣고 이유를 찾아봤다. You must be wondering why do we have 2 survivor space. We have 2 survivor spaces to avoid memory fragmentation. Each time you copy objects from eden to survivor and you get empty eden space and 1 empty survivor space. GC가 일어나 eden이나 survivor 영역에 객체가 제거되면 파편화된 메모리 영역이 존재하게 되는데 이를 한 영역에 모아놔서 순..
[JAVA] 자바의 hashcode는 무엇이고, 어디에 사용할까?
1. hashcode Object의 hashCode() 메소드는 객체의 메모리 주소를 16진수로 hashcode를 리턴한다. 즉 hashcode는 객체의 주소값을 이용해 만든 객체의 고유한 정수값을 말한다. /** * Returns a hash code value for the object. This method is * supported for the benefit of hash tables such as those provided by * {@link java.util.HashMap}. */ @IntrinsicCandidate public native int hashCode(); public static void main(String[] args) { HI hi = new HI(); //객체 생성 S..
[JAVA] == 와 equals()의 차이
1.1 == 기본자료형에서 두 개 의 값이 다른지 비교하는 연산자는 == ,≠ 이다. ==는 같은지를 비교, ≠는 서로 다른지를 비교한다. 이 결과는 무조건 boolean타입이다. 하지만 == 연산자는 참조자료형에서 사용할수없다. 정확히 말하면 == 는 참조자료형의 ‘값’을 비교하지 않고, 객체의 주소값을 비교한다. 기본자료형 : 값을 비교 참조자료형 : 객체의 주소를 비교 public class MemberDTO { public String name; public String phone; public String email; MemberDTO(String name) { //생성자 this.name = name; } } 이런 memberDTO가 있을때 public class Equals { public ..
[JAVA] 객체지향 프로그래밍 - 클래스와 객체
1. 객체지향 프로그래밍 1.1 객체지향언어의 역사 객체지향언어의 기본 개념은 ‘실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다.’ 라는 것이다. 객체지향이론은 상속, 캡슐화, 추상화 개념을 중심으로 구체적으로 발전되었다. 1.2 객체지향언어 특징 코드의 재사용성이 높다. 새로운 코드를 작성할때 기존의 코드를 이용해 쉽게 작성가능하다. 코드의 관리가 용이하다. 코드간의 관계를 이용해 적은 노력으로 쉽게 코드를 변경할 수 있다. 신뢰성이 높은 프로그래밍을 가능하게 한다. 제어자와 메서드를 이용해 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거해 코드의 불일치로 인한 오동작을 방지한다. 객체지향개념을 학습할때 재사용성, 유지보수 그리고 중복된 코드..