JAVA(248)
-
[Java][Effective Java] item 10. equals는 일반 규약을 지켜 재정의하라 (일관성)
1. equals 메서드 재정의시 지켜야 하는 일반 규약 : 일관성(consistency) 일관성은 두 객체가 같다면(어느 하나 혹은 두 객체 모두가 수정되지 않는 한) 앞으로도 영원히 같아야 한다는 의미입니다. 가변 객체(mutable object)는 비교 시점에 따라 서로 다를수도 혹은 같을 수도 있는 반면, 불변 객체(immutable object)는 한번 다르면 끝까지 달라야 합니다. 따라서 불변 클래스로 만들기로 했다면 equals가 한번 같다고 한 객체와는 영원히 같다고 답하고, 다르다고 한 객체와는 영원히 다르다고 답하도록 만들어야 합니다. 일관성 조건을 만족시키지 않는 조건 클래스가 불변 또는 가변이든 equals의 판단에 신뢰할 수 없는 자원이 끼어드는 경우 예를 들어 java.net.U..
2022.06.07 -
[Java][Effective Java] item 10. equals는 일반 규약을 지켜 재정의하라 (대칭성, 추이성)
1. equals를 재정의하지 않아도 되는 상황 각 인스턴스가 본질적으로 고유한 경우 인스턴스의 '논리적 동치성(logical equality)'을 검사할 일이 없는 경우 상위 클래스에서 재정의한 equals가 하위 클래스에도 딱 들어맞는 경우 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없는 경우 equals를 호출하는 것을 막고 싶다면 다음과 같이 재정의할 수 있습니다. @Override public boolean equals(Object o){ throw new AssertionError();// 호출금지 } 2. equals를 재정의해야 하는 상황 equals를 재정의해야 할때는 객체 식별성(object identity; 두 객체가 물리적으로 같은..
2022.06.07 -
[Java][Effective Java] item 9. try-finally 보다 try-with-resources를 사용하라
1. try-finally 방식의 용도 자바 라이브러리에는 InputStream, OutputStream, java.sql.Connection 등과 같은 입출력 클래스는 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많습니다. 전통적으로 자원이 제대로 닫힘을 보장하는 수단으로 try-finally 방식을 사용하여 인스턴스가 실행 도중 예외가 발생하거나 메서드에서 반환되는 경우를 포함하여 자원을 안정적으로 회수할 수 있도록 합니다. 다음 예제는 try-finally 방식을 사용하여 일반적으로 자원을 회수하는 방식입니다. // try-finally 구문을 활용한 일반적인 자원 회수 static String firstLineOfFile(String path) throws IOException { // ..
2022.06.03 -
[Java] 메서드를 종료하는 방법 : finalizer
1. Finalizer의 사용 finalize() 메서드는 finalizer에 의해 호출됩니다. Finalizer는 JVM이 특정 인스턴스를 회수해야 한다고 판달될 때 호출합니다. 이러한 finalizer는 인스턴스를 되살리는 것을 포함하여 임의의 동작을 수행할 수 있습니다. finalizer의 주목적은 인스턴스가 사용하는 자원을 메모리에서 제거하기 전에 해제하는 것입니다. finalizer는 자원 해제 작업을 위한 주요한 메커니즘을 작동하거나 다른 메서드들이 실패할 경우 안전망으로써 작동할 수 있습니다. finalizer 작업이 어떻게 수행되는지 이해하기 위해서 다음 클래스 정의를 볼 수 있습니다. public class Finalizable { private BufferedReader reader; ..
2022.06.03 -
[Java][Effective Java] item 7. 다 쓴 객체 참조를 해제하라
C, C++언어 같은 경우 인스턴스를 전부 사용한다음 수동으로 해제를 해주어야 합니다. 하지만 Java 언어 같은 경우는 가비지 컬렉터가 있기 때문에 해제를 명시하지 않아도 인스턴스가 영역 밖으로 나가게 되면 가비지 컬렉터는 자동으로 회수해갑니다. 하지만 이러한 가비지 컬렉터도 객체를 회수하지 못하고 메모리 누수가 발생할 수 있습니다. 1. 메모리 누수 사례 : Stack public class Stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 10; public Stack() { elements = new Object[DEFAULT_INITIAL_CAPACIT..
2022.05.24 -
[Java] 7. 객체지향 프로그래밍 2 #8 내부 클래스(Inner Class)
1. 내부 클래스란 무엇인가? 내부 클래스란 클래스 안에 선언된 클래스 내부 클래스를 정의하는 이유는 무엇인가? 한 클래스를 다른 클래스의 내부 클래스로 선언하면 두 클래스의 멤버들 간에 서로 쉽게 접근할 수 있다는 장점과 외부에는 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있기 때문입니다. 내부 클래스의 장점 내부 클래스에서 외부 클래스의 멤버(필드멤버, 메서드)들을 쉽게 접근할 수 있음 외부에 내부 클래스 자체를 감추어 코드의 복잡성을 줄일 수 있음 (캡슐화) // before class A{ ... } class B{ ... } // after class A{ // 외부 클래스 class B{ // 내부 클래스 } } 2. 내부 클래스의 종류와 특징 내부 클래스 종류와 특징 인스턴스 클래..
2022.05.23