Java (Effective Java) 아이템 4. 인스턴스를 막으려거든 private 생성자를 사용하라 2019. 12. 15. 23:13 생성자에 private 접근제어자를 사용하여 인스턴스화를 막자! 정적 멤버만을 가진클래스는 생성 목적이 인스턴스화는 아니다. 따라서 생성자를 따로 생성하지 않으면 디폴트 생성자가 생긴다는 점을 잊지 말자! 정적멤버만을 가지는 클래스 : java.lang.Math java.util.Arrays public class UtilityClass { private UtilityClass() { } } 단, 이 방법은 상속을 불가능 하게한다. 모든 생성자는 상위 클래스의 생성자를 호출하는데 생성자를 private으로 선언했으니 하위 클래스에서 상위 클래스로 접근할 길이 없다. References 이펙티브 자바 Effective Java 3/E 국내도서 저자 : 조슈아 블로크(Joshua Bloch) / 이복연(개앞.. (Effective Java) 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 2019. 12. 15. 22:48 싱글턴이란? 인스턴스를 오직 하나만 생성할 수 있는 클래스를 뜻함. 장점 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 공유하기 때문에 메모리 낭비를 방지할 수 있다. 두 번째 사용부터는 객체 로딩 시간이 줄어들어 성능이 좋아진다. 단점 싱글턴 인스턴스가 너무 많은 일을 하면 인스턴스의 간의 결합도가 높아진다. (OCP의 원칙에 위배 ) 디버깅이 어려움이 있다. 테스트 코드의 작성의 어려움이 있다. 생성 방법 1. public static final 방식의 싱글턴 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { } public void leaveTheBuilding() { } } El.. (JAVA) 템플릿 메서드 패턴 / 팩토리 메서드 패턴 2019. 12. 9. 13:27 템플릿 메서드 패턴 템플릿 메서드 패턴이란? 상속을 통해 슈퍼클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법 변하지 않는 기능은 슈퍼클래스에 만들어 두고 자주 변경되어 확장할 기능은 서브클래스에 만든다. public abstract class Super{ public void templateMthod(){ //기본 알고리즘 코드 hookMethod(); abstractMethod(); } protected void hookMethod(){ } //선택적으로 오버라이드 가능 public abstract void abstractMethod(); //서브클래스에서 반드시 구현해야하는 추상메서드 } public class Sub extends Super{ public void templateMthod().. (JAVA) 생성자에 매개변수가 많다면 빌더를 고려하라 2019. 12. 8. 10:44 정적 팩토리 메서드와 생성자의 제약 특정 매개변수만이 필요한데 값을 받는 매개변수에는 원하지 않는 매개변수까지 포함되기 때문에 필요하지 않은 값은 0 혹은 " " 로 지정해야 하는 불편함이 따른다. 점층적 생성자 패턴의 단점 public class NutritionFacts { private final int servingSize; private final int serving; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; public NutritionFacts(int servingSize, int serving) { this(servingSize, ser.. (JAVA) 제네릭의 사용 2019. 12. 8. 01:44 제네릭을 사용하는 이유 제네릭 타입을 사용함으로써 잘못된 타입이 선언되어 런타임 시점에 발생하는 오류를 컴파일 시점에서 제거할 수 있다. 제네릭은 클래스와 인터페이스, 메소드를 정의할 때 타입을 파라미터로 사용할 수 있도록 도와준다. 더보기 장점 1. 컴파일 시 강한 타입 체크를 할 수 있다. - 런타임에 에러가 나는 것 보다는 컴파일타임에 미리 오류를 잡을 수 있다. 2. 타입 변환을 제거할 수 있다. -제네릭이 아닌 코드는 불필요하게 타입을 변환해야 하지만 제네릭 타입을 선언하면 타입 변환을 하지 않아도 되므로 성능이 향상된다. 다음 두개의 클래스는 어떻게 다를까? 1. public class Shop{ public Shop() {} private Object obj; public Object get.. (JAVA) Static 2019. 12. 7. 20:08 Static은 왜 사용하는가? 생성 시점 : Static의 생성 시점은 프로그램이 로드되는 순간 static 영역(데이터 영역) 으로 메모리가 올라간다. 따라서 불변하는 클래스, 메서드, 변수는 static으로 사용하는 것이 효율적인다. 단, static이 너무 큰 메모리를 차지한다면 로드될 시에 성능 측면에서 큰 부하가 생기므로 작은 메모리 만을 할당해서 적절히 사용하는 것이 효율적이다. 예시 아래 코드는 serialNum이 static으로 선언되어 있으며 10000으로 초기화되어있다. Student 인스턴스를 생성할 때마다 serialNum은 1씩 증감한다. package me.choi.chapter02.pizza.generic.staticex; public class Student { public.. (JAVA) 내부클래스의 종류 및 사용법 2019. 12. 7. 19:39 내부 클래스를 왜 사용하는가? 1. 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다. 2. 서로 관련있는 클래스를 한 곳에 묶음으써, 한 클래스에 같은 책임을 한데 묶을 수 있다. 단, 작성한 내부 클래스는 재사용이 힘드므로 다른 클래스에서 참조하지 않는 것을 클래스로 둔다. 내부 클래스의 유형 1. 인스턴스 내부 클래스 외부 클래스를 먼저 만든 후 내부클래스 생성 2. 정적 내부 클래스 외부 클래스와 무관하게 생성 3. 지역 내부 클래스 메서드를 호출할때 생성 4. 익명 내부 클래스 메서드를 호출할 때 생성되거나, 인터페이스 타입 변수에 대입할 때 new 예약어를 사용하여 생성 인스턴스 내부 클래스 인스턴스 내부 클래스는 어떻게 생성되는가? InnerClassExample 하위에 Inner.. (JAVA) 생성자 대신 정적 팩터리 메서드를 고려하라 2019. 12. 4. 00:08 정적 팩터리 메서드란? 특정 클래스의 인스턴스를 반환하는 단순한 정적 메서드 ex) 박싱클래스 Boolean /*Boolean의 내부*/ public static Boolean valueOf(String s) { return parseBoolean(s) ? TRUE : FALSE; } 정적 팩터리 메서드를 사용했을때의 장점들 1. 네이밍이 가능해진다. 생성자는 네이밍을 할 수가 없기 때문에 메서드만의 뚜렷한 특징을 나타낼 수 있는 방법이 없다. 하지만, 정적 팩터리 메서드는 메서드에 네이밍이 가능함으로 해당 메서드가 나타내는 의미를 바로 catch 할 수 있다. * 시그니처가 같은 생성자를 여러번 호출이 필요하다면 정적 메서드 패턴을 사용하여 차이를 드러내는 이름을 지어주어 코드 가독성을 높여보자! 2... (JAVA) 디폴트 생성자(default constructor) 2019. 11. 24. 22:52 class Parent { private int money; private String name; public Parent(int money, String name) { this.money = money; this.name = name; } } class Child extends Parent{ public Child(int money, String name) { } } 다음 코드는 정상적인 코드인가? answer) 다음 코드를 실행하면 컴파일 오류가 발생한다. 이유는 무엇일까? 부모 클래스에 디폴트생성자가 선언되어있지 않기 때문 디폴트생성자는 선언 안해줘도 컴파일 시 자동으로 생성해준다고 하지않나? 그건 오버로딩을 하지 않았을 때의 말이다. 특정 파라미터를 포함하는 생성자를 오버로딩하였을때 디폴트 생성자.. (JAVA8) Java8 개요 2019. 11. 11. 15:22 자바8을 사용해야하는 이유 자연어에 가까운 간단한 방식으로 코드 구현 가능 병렬 실행 환경의 새롭고 단순한 방식을 지원 예1. 스트림 처리 리눅스 or 유닉스의 경우 cat file1 fil2 | tr "A-Z" "a-z" |sort| tail -2 sort는 여러행의 스트림을 입력받아 병렬로 처리한다. (->여러행의 스트림을 출력) cat, tr, sort, tail은 모두 병렬로서 처리된다. 이처럼 자바8의 스트림 API는 한번에 처리하던 기존방식을 탈히여 병렬로 처리하게끔 도와준다.(스레드 사용X) 예2. 메세지에 코드 전달하기 sort를 처리하는 메서드를 통으로 파라미터로 전달하기 예3. 간결화된 코드(like ::) /*예시코드(파일 경로 찾기)*/ File[] hiddenFiles = new .. 이전 1 ··· 7 8 9 10 다음