본문 바로가기

전체 글155

MySQL 테이블 복사하기 MySQL 데이터베이스에서 제약조건을 포함하여 테이블을 복사하는 방법에 대해 알아보자. 예제에서 사용되는 테이블은 MySQL 샘플 데이터베이스 sakila에 있다. sakila 샘플 데이터베이스는 Github에서 받을 수 있다. 테이블 구조 살펴보기 sakila 데이터베이스의 actor 테이블 구조를 간단하게 살펴보자. actor_id 컬럼이 테이블의 Primary Key이며, auto_increment 설정이 되어 있다. 그리고 컬럼은 actor_id , first_name, last_name, last_update 4개로 구성되어 있다. CTAS로 테이블 복사하기 CTAS(create table as select) 구문을 사용해서 actor 테이블을 복사하자. SQL를 실행하고 나서 actor_tes.. 2019. 4. 4.
Effective Java 아이템 6. 불필요한 객체 생성을 피하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. 똑같은 기능의 객체를 매번 생성하는 것보다 객체 하나를 재사용하는 편이 나은 경우가 많다. 재사용은 일단 매번 객체를 생성하는 것보다 빠르다. 특히 불변 객체는 언제든 재사용 할 수 있다. 변하지 않기 때문이다. 실무에서 개발 업무를 하다 보면 String을 많이 사용한다. 경험적으로 문자열 값을 처리하는 경우가 많았던 것 같다. String을 리터럴로 선언하면, 같은 객체를 재사용하게 된다. new String() 코드는 문자열 인스턴스를 매번 새로 생성하며, 동일한 문자열 값이더라도 다른 인스턴스를 생성한다. // String 리터럴로 선언해서 동일한 문자열이면 같은 객체를 사용하는 방식 Stri.. 2019. 4. 4.
Effective Java 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. 많은 클래스들은 협력하기 위해서 하나 이상의 자원에 의존한다. 예를 들어 맞춤법 검사기는 사전에 의존하는데, 이러한 맞춤법 검사기를 정적 유틸리티 클래스로 구현한 것을 드물지 않게 볼 수 있다. 이와 유사하게 싱글턴으로 구현하는 경우도 흔한다. 다음 코드는 맞춤법 검사기를 싱글턴으로 구현한 예제이다. public class SpellChecker { private final Lexicon dictionary = ...; private SpellChecker() { } public static SpellChecker INSTANCE = new SpellChecker(); public boolean is.. 2019. 4. 4.
Effective Java 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들어야 하는 경우가 있다. 이 방식은 객체 지향적으로 좋은 않은 클래스라고 여길 수 있지만, 이러한 클래스도 나름의 쓰임새가 있다. 예를 들어 java.lang.Math와 java.util.Arrays 클래스처럼 기본 타입 값이나 배열 관련 메서드를 모아 놓을 수 있다. 또한, java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 가지고 있는 클래스가 있을 수 있다. 다음 코드는 Math 클래스의 일부분이다. public final class Math { private Math() {} public s.. 2019. 4. 4.
Effective Java 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. 싱글턴(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴은 함수와 같은 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트에서 사용할 수 있다. 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려울 수 있다. 인터페이스를 정의하고 구현하는 경우가 아니라면 mock 구현으로 교체하기가 어렵기 때문이다. 싱글턴을 만들 때 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 제공한다. public static final 필드 방식 private 생성자는 public st.. 2019. 4. 4.
Effective Java 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. 정적 팩터리와 생성자는 선택적 매개변수가 많을 경우에 적절하게 대응하게 어렵다는 제약이 있다. 특정 클래스에 선택 항목이 많은 경우가 있다. 예를 들어 식품 포장의 영양정보를 표현하는 클래스를 생각해보자. 영양정보 클래스 NutritionFacts는 1회 내용량, 트랜스지방, 포화지방, 콜레스테롤 등 20개가 넘는 선택 항목을 갖고 있다. 대부분의 제품은 이 선택 항목 중 대다수의 값은 기본값인 0이다. 각각의 제품은 항목의 모든 값을 대부분 사용하지 않는다. 점층적 생성자 패턴 이러한 클래스의 경우 대부분의 개발자들이 점층적 생성자 패턴(telescoping constructor pattern)을 .. 2019. 4. 4.
Effective Java 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라 Effective Java 3판을 학습하며 요약한 내용입니다. 자세한 내용은 책을 참고해주시기 바랍니다. 클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자이다. 클래스는 생성자와 별도로 정적 팩터리 메서드(static factory method)를 제공할 수 있다. 다음 코드는 Boolan 클래스에서 발췌한 예이다. valueOf 메서드는 기본 타입 boolean 값을 받아서 Boolean 객체 참조를 반환한다. public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 정적 팩터리 메서드가 생성자보다 좋은 장점은? 장점 1. 이름을 가질 수 있다 생성자에 넘기는 매개변수와 생성자 자체만.. 2019. 4. 4.
Java 배열 원소 문자열 출력, toString() vs deepToString() 일차원 또는 다차원 배열의 원소를 문자열로 출력하는 방법에 대해 알아본다. Java 배열에 toString 메서드 배열의 원소 값이 어떻게 이루어졌는지 확인하기 위해서 아래 코드를 사용하면 원하는 결과의 형태로 출력이 되지 않는다. 배열의 원소가 아닌 hexadecimal 값이 출력된다. int[] arr = {1, 2, 3, 4, 5 }; System.out.println(arr.toString()); // hexadecimal 출력 ✅ 배열의 원소를 문자열로 출력하려면, Arrays 클래스의 toString, deepToString 메서드를 사용해야 한다. Arrays 클래스 toString, deepToString 메서드 Arrays 클래스의 toString과 deepToString 두 메서드 차이.. 2019. 4. 4.
Integer 클래스 valueOf, parseInt 메서드 차이점 Integer 클래스에는 valueOf, parseInt 메서드가 있다. 두 메서드는 매개 변수로 전달 받은 문자열(String) 값을 정수 형태로 반환다. 메서드 시그니처를 살펴보면, 두 메서드의 차이는 리턴 타입이 다르다는 것을 알 수 있다. valueOf 메서드 valueOf 메서드는 Integer 객체를 반환한다. 그리고 내부적으로 parseInt 메서드를 사용한다. public static Integer valueOf(String s) throws NumberFormatException { return Integer.valueOf(parseInt(s, 10)); } parseInt 메서드 parseInt 메서드는 기본 자료형 int를 반환한다. 오버로딩 메서드 내부적으로 parseInt(s, 1.. 2019. 4. 4.