개요 Map에 많은 구현체들이 있지만 주로 HashMap을 사용하고 상황에 따라 TreeMap이나 LinkedHashMap정도를 고려해보는 것이 현실입니다. Hash를 사용하는 HashMap이면 성능적으로 충분히 훌륭하지 않은가 생각했는데, EnumMap이 HashMap보다 성능적으로 훨씬 좋다는 사실을 알게 되었습니다. EnumMap 이 뭘까 EnumMap도 Map의 구현체입니다. 대신 한가지 조건이 있는데 key값으로 enum이 들어가야 합니다. enum DayOfWeek { MON, TUE, WED, THU, FRI, SAT, SUN } public static void main(String[] args) { Map enumMap = new EnumMap(DayOfWeek.class);//키에 들어..
개요 class MyClass { class InnerClass{} static class InnerStaticClass{} //내부 클래스에 static이 붙는다면? } 클래스 내부에 선언된 두개의 내부 클래스에 대한 차이점에 대해서 얘기해보겠습니다. 만약에 'static'키워드가 붙은 내부 클래스를 보면서 '아 static이니까 메모리에 하나만 올라가는 인스턴스 인가보다' 라고 생각하신다면.. 큰 오해를 하고 계신다는 점을 미리 알려드립니다. :) 원래 'inner 혹은 내부'라는 키워드는 static class에 사용하지 않습니다. 이 포스팅에서는 차이점을 비교하기 위해서 편의상 사용하겠습니다. 정확한 명칭은 static member class (혹은 정적 멤버 클래스) 라고 해야합니다. 1. 내부..
스프링 빈(bean)은 쓰레드 세이프.. 하겠..지?? 빈(bean)은 개발자 입장에서 편리합니다. 스프링이 생성하고 관리하고 조립도 해주고 많은 제어를 많이 해주니까 말이죠. (어제까지만 해도) 저는 스프링 빈(bean)이라면 쓰레드 세이프 할 것이라는 무지에서 비롯된 믿음이 있었습니다. 하지만 스프링 빈(bean)은 근본적으로 쓰레드 세이프 하지 않습니다. 왜 쓰레드 세이프 하다고 오해했을까? 같이 공부하는 (주니어 개발자) 친구들에게 질문해봐도 이 부분에서 같은 오해를 하는 친구들이 많다는 걸 알 수 있었습니다. 왜 이런 오해를 하고 있을까요? 첫번째 이유는 많은 요청을 받는 멀티 쓰레드 환경에서 학습해보지 못한 경험상에 이유입니다. 두번째 이유는 (놀랍게도) 쓰레드 세이프하게 빈(bean) 클래스..
[개요] 자바에서 숫자를 다루기 위한 타입들은 크게 두 가지로 분류할 수 있습니다. 하나는 '원시 타입(primitive type)'이고, 또 다른 하나는 참조 타입(reference type)'입니다. 원시 타입은 (int, double, boolean... )을 말하며, 참조 타입은 (Integer, Double, Boolean...)을 말합니다. 요즘 자바는 오토박싱, 언박싱이 잘 되어서, 원시 타입과 참조 타입을 코드 구현상에서 같이 사용해도 개발자 입장에서는 크게 불편함이 없습니다. int i = Integer.valueOf(1); Integer integer = i; //오토박싱 언박싱이 되기 때문에, 이런식으로 사용해도 컴파일 오류를 발생하지 않습니다. (+ 참고로 오토박싱은 메모리 누수의 ..
[개요] JPA를 공부하는데 가장 난해한 부분인 '영속성 컨텍스트'에 대해서 알아보겠습니다. 영속성 컨텍스트에 대한 지식이 수반되어야 JPA의 동작방식을 온전히 이해할 수 있습니다. [영속성 컨텍스트 (Persistence Context)] 영속성 컨텍스트란 인스턴스로 존재하는 엔티티를 관리하고 영속화시키는 논리적 영역 입니다. 영속화의 사전적 의미는 '사라지지 않고 지속되게 한다' 입니다. 쉽게 말하자면 DB에 저장된다는 의미입니다. 하지만 '영속'이라는 말에 현혹되어서는 안됩니다. 영속성 컨텍스트에서 관리하는 엔티티라고 해도 반드시 '영속화'되어 DB에 저장된 것은 아닙니다. 다만 영속화 될 수 있는 가능성이 있을 뿐입니다. 영속성 컨텍스트에서 엔티티를 관리하고 필요에 따라 DB의 데이터를 저장, 조..
테이블 작성 CREATE TABLE 테이블명 ( 열명1 자료형 \[DEFAULT 기본값\] \[제약 조건\], //제약 조건에 대해서는 따로 설명 열명2 자료형 \[DEFAULT 기본값\] \[제약 조건\], ... ); 테이블 삭제 DROP TABLE 테이블명; 테이블 변경 ALTER TABLE 테이블명 ADD 열명 자료형 \[DEFAULT 기본값\] \[제약 조건\]; //새로운 열 추가하기 ALTER TABLE 테이블명 MODIFY 열명 자료형 \[DEFAULT 기본값\] \[제약 조건\]; //MODIFY로 기존의 열명을 입력하고 자료형, 기본값, 제약 조건을 입력한다. ALTER TABLE 테이블명 CHANGE \[기존 열 이름\] \[신규 열 정의\]; //CHANGE 명령으로는 열명까지도 바..
COUNT로 행 갯수 구하기 SELECT COUNT(*) FROM 테이블명 [WHERE 열명=조건]; //테이블에 존재하는 [조건을 만족하는] 모든 행의 갯수 SELECT COUNT(열명1), COUNT(열명2) FROM 테이블명; //열명1과 열명2의 갯수를 별도로 센다. //NULL은 집계함수가 세지 않는다. DISTINCT로 중복 제거하기 SELECT ALL 열명 FROM 테이블명; SELECT 열명 FROM 테이블명; //ALL 키워드는 기본값이다. //모든 열 조회 SELECT DISTINCT 열명 FROM 테이블명; //중복된 값을 제거하여 조회한다. SELECT COUNT(DISTINCT 열명) FROM 테이블명; //중복값을 제거하고 행의 갯수를 센다. SUM으로 합계 구하기 SELECT ..
행 추가하기 INSERT INSERT INTO 테이블명 VALUES (값1, 값2, ...); //테이블의 모든 열 구성에 맞게 입력 INSERT INTO 테이블명(열1, 열2, ...) VALUES (값1, 값2, ...); //원하는 열에만 값을 입력 //명시하지 않은 열에는 NULL이나 DEFAULT로 선언된 값이 들어간다. DEFAULT 값 Table을 통해 설정해둔 DEFAULT(기본값)으로 값 추가하기 INSERT INTO 테이블명(열1, 열2) VALUES (2, DEFAULT); //명시적으로 Default 값으로 넣기 INSERT INTO 테이블명(열1) VALUES (2); //암묵적으로 Default 값으로 넣기 삭제하기 DELETE DELETE FROM 테이블명 \[WHERE 조건식..