프로그래밍

    이펙티브 자바 규칙 9 - equal 메소드를 재정의 할 때 hashCode()도 재정의 하자

    이펙티브 자바 규칙 9 - equal 메소드를 재정의 할 때 hashCode()도 재정의 하자

    Object 클래스의 명세를 보면 hashCode의 일반 규약은 아래와 같습니다. 어플리케이션 실행 중 같은 객체의 hashCode를 여러 번 호출하는 경우, equals가 사용하는 정보들이 변경되지 않았다면, 언제나 동일한 정수가 반환되어야한다. 다만 프로그램이 종료되었다가 다시 실행되어도 같은 값이 나올 필요는 없다.equals(Object) 메소드가 같다고 판정한 두 객체의 hashCode 값은 같아야 한다.equals(Object) 메소드가 다르다고 판정한 두 객체의 hashCode 값은 꼭 다를 필요는 없다. 그러나 서로 다른 hashCode 값이 나오면 해시 테이블의 성능이 향상될 수 있다는 점은 이해하고 있어야 한다. 저번 포스트에서 equals 메소드를 재수정 했습니다. 내부의 중요 필드를..

    스프링 프레임워크 - Junit Test

    스프링 프레임워크 - Junit Test

    개발 상황에서 테스트의 중요성을 부인할 사람은 없을 것이라 생각합니다. 그것도 처음부터 자잘하게 꾸준히 테스트하는 게 나중에 생각해보면 시간을 많이 절약해주죠. 이 포스트에서는 간단하게 Junit에 대해 다룹니다. Junit은 클래스의 제어권한을 넘겨받아 어플리케이션의 흐름을 제어하는 프레임워크입니다. 테스트에서 Junit 프레임워크가 요구하는 조건은 두가지입니다. 메소드가 public이로 사용되어야하고, @Test 라는 어노테이션이 붙어야합니다. Junit은 어노테이션을 적극적으로 활용하죠. 1번의 @Runwith은 Junit의 기능을 확장해서 스프링과 관련된 기능을 사용하게끔 해주는 어노테이션입니다.모든 클래스는 클래스의 작업을 실행해주는 main 클래스가 있습니다. Junit의 경우 그 main 클..

    이펙티브 자바 규칙 8 - equals 재정의 / 오버라이드 방법

    이펙티브 자바 규칙 8 - equals 재정의 / 오버라이드 방법

    참조 객체를 다룰 때 가장 많이 사용되는 메소드중 하나가 equals 메소드일 것입니다. 이 메소드는 객체간의 관계를 다루는만큼 재정의 시 주의를 요합니다. 이펙티브 자바 규칙 8 에서는 이 메소드를 정의할 때의 규약을 다루가 있습니다. 먼저 equals 메소드를 재정의 하지 않아도 되는 경우는 1. 각각의 개체가 고유한 값을 가질 때 기본형 값(value)로 이루어진 변수 대신 활성개체(active entity)를 나타내는 스레드로 이루어진 클래스는 단순한 실행단위이기 때문에 . 이런 클래스는 Object의 equals 메소드를 그대로 사용해도 됩니다. 2. 클래스에서 논리적 동일성 검사를 요구하지 않는다. 예로 java.util.Random 클래스가 있다. 이 클래스에서 equals 는 랜덤 객체가 ..

    이펙티브 자바 규칙 7 - 종료자 사용을 피하라

    저번 포스팅에서도 다루었지만 C,C++과 JAVA의 많은 차이 중 두드러지는 것 하나가 쓰레기 수집가(GC)입니다. C,C++ 에서는 잘 다루면 어마어마한 효율을 보여주지만, 못다루면 주된 버그의 원인이 되는주소값 관리를 자바에서는 GC 알고리즘을 통해 다루어 줍니다. 과거에는 자바의 쓰레기 수집가 알고리즘이 지금만큼 뛰어나지 못해문제가 된 적이 있지만, 지금은 많이 향상되었다고 합니다. public static void main(String[] args){ System.runFinalization(); System.gc(); }자바에서 GC를 호출하는 방법입니다. GC는 JVM마다 호출되는 시점이 다르고, 메모리의 여유상황에 영향을 받기 때문에제어하기 힘든데, 이 명령어를 쓰면 호출을 간접적으로 요청할..

    이펙티브 자바 규칙 6 - 유효기간이 지난 객체는 폐기하자

    이펙티브 자바 규칙 6 - 유효기간이 지난 객체는 폐기하자

    자바는 C나 C++과 다르게 쓰레기 수집가가 메모리를 관리해준다. 쓸모없어진 주소값을 자동으로 폐기해줘서 수동으로 관리해주는 C,C++ 보다 편하다고 할 수 있다. 하지만 자바에서도 간간히 주소값을 관리해주는 경우가 있다. public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } public O..

    이펙티브 자바 규칙 5 - 불필요한 객체 만들지 않기

    이펙티브 자바 규칙 5 - 불필요한 객체 만들지 않기

    객체를 관리하는 것은 메모리리를 효율적으로 사용하는 것으로 이어진다 때문에 불필요한 객체를 생성하지 않는 것이 좋다. String s = new String("이러지 말자"); String s = "이러자";위의 String은 스트링 객체를 생성하기 위해 문자열. 즉 스트링을 이용하고 있다. 객체를 생성하기 위해, 객체를 이용하고 있기에 메모리 낭비가 생긴다. 반복문 같은 곳에서 저런 코드를 사용하게 된다면 수백수천개의 객체가 생성될 수도 있다. 때문에 String 객체는 아래와 같은 방법으로 사용하는 것이 좋다. Boolean bool = new Boolean("true"); Boolean bool2 = Boolean.valueOf("true");Boolean 도 마찬가지이다. 생성자를 통하면 객체가 ..

    이펙티브 자바 규칙 4 - 객체 생성은 private 생성자로 막자

    때로는 정적 필드나 메소드로만 구성된 클래스를 설계할 때가 있다. 대표적 예로는 java.lang.Math나 java.util.Arrays 이런 클래스는 객체를 생성할 목적으로 만들어 진 것이 아니다. 때문에 객체 생성을 막을 필요가 있다. 추상클래스로 만들어놔도 소용이없다. 하위클래스에서 상속 할 시객체생성이 가능해지기 때문이다. 가장 확실한 방법이 생성자를 private 로 만드는 것이다. private NutrtionFacts{ throw new AssertionError(); }이런 방식으로 생성자를 설정해두면 클래스 객체 생성을 봉쇄할 수 있다.

    이펙티브 자바 규칙 3 - 싱글톤

    이펙티브 자바 규칙 3 - 싱글톤

    싱글톤이란? 클래스의 인스턴스를 단일화해서 언제 어떤 때에 불리더라도 인스턴스를 새로 만드는 일 없이 같은 주소를 리턴해주는 디자인 방법을 이야기 한다. 이펙티브 자바3에서는 싱글톤 패턴의 종류에 대해서 적고 있다. 1. Public final 필드 이용public class NutrtionFacts { private String name = "name"; public static final NutrtionFacts INSTANCE = new NutrtionFacts(); private NutrtionFacts(){} public void setName(String name) { this.name = name; } public String getName() { return name; } }public c..

    이펙티브 자바 규칙 2 - Builder 패턴

    클래스를 만들 때 가장 기본이 되는 건 생성자는 만드는 일일 것이다. 생성자로 객체를 만들어 전달하는 건 컴퓨터 자료관리의 기본이다. 여기 영양소를 관리하는 클래스를 만든다고 가정해보자 public class NutritionFacts { private int calories; private int fat; private int sodium; private int carbohydrate; . . . }이런 식으로 만들게 될 것이다. 가장 기본적인 방법은 그냥 생성자를 만드는 일이다. public NutritionFacts(int calories, int fat, int sodium, int carbohydrate) { this.calories = calories; this.fat = fat; this.s..

    이펙티브 자바 규칙 1 - 정적 팩토리 메소드

    이펙티브 자바 규칙 1 - 정적 팩토리 메소드

    자바에서 객체를 만들 때 가장 많이 사용하는 방법은 생성자를 부르는 것이다. 생성자 이외에도 인스턴스 정보를 보내주는 다른 방법이 있다. 책을 읽으면서 나름의 예제코드를 만들어보았다. 만든 예제코드로 한번 알아보자 먼저 예제로 이용할 클래스들이다. package homework; public class Tv { String screen;String audio;int button; public static Tv newInstance(String type){if (type.equals("SmartTv")) {return new SmartTv();} else if (type.equals( "NormalTv" )) {return new NormalTv();}return null;} public void test..