Object의 기본 메서드 toStringJava의 Object 클래스는 기본적으로 toString 메서드를 제공하며, 이는 기본적으로 클래스_이름@16진수_해시코드 형식의 문자열을 반환합니다.public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode());}기본 toString 예제인스턴스를 출력하면 자동으로 toString 메서드가 호출됨public class Foo { private String name; private int code; public Foo(String name, int code) { this.name = name; this.code..
Programming Language/Java
hashCode 를 재정의하지 않으면 일반 규약을 어기게 되어 해당 클래스의 인스턴스를 HashMap이나 HashSet 같은 컬렉션의 원소로 사용할 때 문제가 발생할 수 있다.equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다. 단, 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없다.equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다.equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시 ..
equals 재정의를 비추천하는 상황각 인스턴스가 본질적으로 고유한 상황 (예시: Thread)논리적으로 동치성 검사를 할 필요가 없을 때 (예시: 여러 정규식 간의 비교)상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는 경우클래스가 private이거나 package-private(default)이고 equals 메서드를 호출할 일이 없는 경우 같은 클래스같은 패키지같은 패키지의 상속 클래스다른 패키지의 상속 클래스전체 클래스publicOOOOOprotectedOOOO defaultOOO privateO 언제 equals를 재정의해야할까?객체 식별성이 아니라 (두 객체 물리적으로 같은지) 논리적 동치성을 확인해야 하는데, 상위 클래스의 equals가 논리적 동치성을 비교하도록 재..
일반적으로 try-finally 기반으로 해당 처리를 해왔다.그러나 처리해야할 리소스가 많아질수록 코드 퀄리티 가 떨어진다.그리고 close 는 자원을 반납하는 것인데, 실수로 close 를 놓치는 경우도 있다.대표적인 메서드로는 InputStream, OutputStream, java.sql.connection 등이 있다.아래 코드에서는 두 로직 다 예외상황이 생길 경우두 번째 예외가 첫 번째 예외까지 덮어버린다.static void copy(String src, String dst) throws IOException { InputStream in = new FileInputStream(src); try { OutputStream out = new FileOutputS..
JAVA 메모리 누수가 발생하는 현상메모리가 회수되지 않으면 Full GC가 발생해도, Heap Memory의 변화가 없을 것이다.1. 무분별한 static 필드 사용java에서 static 변수의 라이프 사이클은 애플리케이션 종료 되기 전까지 살아있다.main 메서드가 아니라 만약 Spring 같은 애플리케이션이었다면 GC가 되지 않고 list 는 살아있을 것이다.public class StaticTest { private static List list; public static List populateList() { if (list == null) { list = new ArrayList() } for (int i = ..
Stack의 pop으로 문제상황 재현stack은 후입선출로서, 일반적으로 pop() 메서드를 통해 후입선출 시 마지막 값을 return 하는 기능을 가지고 있다.참고로 아래 기능은 실제 Stack과 다르다. 해당 주제의 예시를 보여주기 위해 따로 만든 것이다.public class chapter7 { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public chapter7() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public String ..
동일 객체 생생보다는 기존 객체 재사용 이 문장은 실행될 때마다 String 인스턴스를 새로 만든다. 생성자에 넘겨진 "bikini" 자체가 이 생성자로 만들어내려는 String과 기능적으로 완전히 똑같다. 이 문장이 반목문이나 빈번히 호출되는 메소드에 있다면 쓸데없는 String 인스턴스가 수백만 개 만들어질 수도 있다. String s = new String("bikini"); 이 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다. 나아가 JVM 안에서 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. String s = "bikini"; 생성 비용이 아주 비싼 객체의 경우 캐싱하여 재사용을 권한다. 아래 케이스에서도 isRomanNumer..
많은 클래스가 하나 이상의 자원에 의존한다. 가령 맞춤법 검사기는 사전에 의존하는 데, 이런 클래스를 정적 유틸리티 클래스로 구현한 모습을 드물지 않게 볼수 있다. static 필드와 static 메소드로만 이루어진 클래스 아래 케이스 모두 유연하지 않고 테스트하기 어렵다. 정적 유틸리티를 잘못 사용한 예 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) {...} public static List suggestions(String typo) {...} } 싱글턴을 잘못 사용한 ..
static 메서드와 static 필드만을 담은 유틸리티 클래스는 객체 지향과 거리도 멀지만, 쓰임새가 있다. 하지만, 해당 클래스를 abstract로 만들어도, 상속 받아서 인스턴스를 만들 수 있기 때문에 인스턴스를 만드는 걸 막을 순 없다. 아무런 생성자를 만들지 않은 경우에도 컴파일러가 기본적으로 아무 인자가 없는 public 생성자를 만들어주기 때문에 그런 경우에도 인스턴스를 만들 수 있다. 따라서 인스턴스화를 막기 위해선 명시적으로 private 생성자를 추가해야 한다. static method와 static field를 담은 유틸리티 클래스의 예시 java.lang.Math, java.util.Arrays ,java.util.Collections특정 인터페이스를 구현하는 객체를 생성해주는 정적..
특정 클래스 내에는 오직 하나의 인스턴스만 만드는 클래스를 싱글턴이라 부른다. 싱글톤으로 만드는 두가지 방법이 있는데, 두 방법 모두 생성자를 private 으로 만들고 public static 멤버를 사용해서 유일한 인스턴스를 제공한다. 1. public static 멤버가 final 필드인 방식 public class Singleton1 { public static final Singleton1 instance = new Singleton1(); private Singleton1() {} public void leaveTheBuilding() {} } private 생성자는 Singleton1.INSTACE를 초기화 할때 딱 한번 호출 된다. public이나 protected 생성자가 없어서 초기화 ..