Programming/JAVA (22) 썸네일형 리스트형 [Effective JAVA] item 20 : 추상 클래스 보다는 인터페이스를 우선하라 서론 자바의 다중 구현 메커니즘: 인터페이스, 추상 클래스 둘의 차이 - 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 함 - 자바는 단일 상속만 지원하기 때문 인터페이스 기존 클래스에 쉽게 새로운 인터페이스 구현 가능 인터페이스가 요구하는 메서드를 추가하고, 클래스 선언에 implements 구문만 추가하면 됨 인터페이스는 믹스인(mixin) 정의에 안성맞춤 믹스인(mixin) 대상 타입의 주된 기능에 선택적 기능을 혼합(mix in)하는 것 클래스가 구현할 수 있는 타입 원래 주된 타입 외에 특정 선택적 행위를 제공하다고 선언하는 효과를 줌 추상 클래스는 기존 클래스에 덧씌울 수 없어 믹스인 정의가 불가함 => 클래스는 두 개의 부모를 가질 수 없고, 클래스.. [Effective JAVA] 모든 객체의 공통 메서드 (2) equals의 재정의와 hashCode item 11. Equals를 재정의하려면 hashCode도 재정의 하라 equls를 재정의한 클래스 모두에서 hashCode도 재정의해야 함 그렇지 않으면 hashCode 일반 규약을 어겨 해당 클래스의 인스턴스를 HashMap이나 HashSet과 같은 컬렉션의 원소로 사용할 때 문제가 발생함 Object 명세의 규약 - equals 비교에 사용되는 정보가 변경되지 않는다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메서드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 함. 단, 애플리케이션을 다시 실행한다면 값이 달라져도 무관함. - equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 같은 값을 반환해야 함 - equals(Object)가 두 .. [Effective JAVA] 모든 객체의 공통 메서드 (1) Equals 메소드의 재정의 서론 Object 객체는 만들 수 있는 구체 클래스이나, 기본적으로 상속해 사용하도록 설계됨 Object에서 final이 아닌 메서드(equals, hashCode, toString, clone, finalize)는 모두 재정의(overriding)을 염두하고 설계됨 즉, 재정의를 위해 지켜야하는 일반 규약이 명확함 모든 클래스는 일반 규약에 맞게 재정의해야 함 만약 메서드 구현을 잘못 할 경우, HashMap, HashSet 등 이 규약을 준수한다고 가정하는 클래스에서 오동작이 발동함 고로 이번 장에서는 Object 메서드들을 언제 어떻게 재정의해야 하는지 다룸 Item 10. equals는 일반 규약을 지켜 재정의 해야 함 equals는 기본적으로 본인과 객체가 동일한지 여부를 판단해 true OR .. Java의 Enum 활용 Enum이란? 관련있는 상수들의 집합 Enum의 등장: 아래 사항들을 보완하고자 나타남 기존 클래스 내에 상수를 선언해 관리하였으나 네이밍이 겹치고, 불필요하게 상수가 많아지는 경우가 존재했음 IDE의 지원을 적극적으로 받을 수 없음 타입의 안정성이 떨어짐 1. 데이터간 연간관계 표현 각 테이블에서 [ 1, True, Y ], [ 0, False, N ]이 같은 의미라 했을 때 이를 구분할 필요가 있음 Enum을 적용하지 않는다면 해당 값을 인자로 받아 적절한 값을 return하는 형식의 메소드 구현이 가능함 장점 같은 의미의 값을 처리할 수 있음 단점 불필요한 코드량이 많음 Y와 N이 아닌 다른 문자가 추가될 경우 이를 추가로 구현해야함 동일 타입이 추가되는 데에 비해 같은 코드가 반복돼 생산성이 감소.. [Effective JAVA 3S/E] 객체 생성과 파괴 - item1 개요 객체를 만들어야 할 때와 만들지 말아야 할 때 구분 올바른 객체 생성 방법과 불필요한 생성 피하기 제때 파괴됨을 보장하며, 파괴 전 수행할 정리 작업 관리 요령 [1] 생성자 대신 정적 팩터리 메서드 고려하기 클래스의 인스턴스 생성 방법 public 생성자를 통한 생성 정적 팩터리 메서드(static factory method) - 클래스의 인스턴스를 반환하는 단순한 정적 메서드 임 - 디자인 패턴과 일치하는 패턴은 없음 정적 팩토리 메소드 — 소중한 나의 개발일기 (tistory.com) 정적 팩토리 메소드 이펙티브 자바 3판 아이템 1. 생성자 대신 정적 팩토리 메소드를 고려하라 인스턴스 생성법 보통 클래스의 인스턴스를 생성하기 위해서는 public 생성자를 이용합니다. 이 생성자를 이용하여 인.. 자바, this 키워드 this는 객체가 자기 자신을 지칭할 때 사용하는 키워드이다. this 키워드가 없고, 동일한 이름의 변수명이 있을 경우 지역 변수가 우선 순위에 존재한다. 하지만 this 키워드를 사용하여 객체 변수에 저장되어 있는 값을 이용할 수 있게 된다. T 메모리 구조상에서 본다면, 지역 변수는 메서드의 Stack Frame에 존재하지만, 객체 변수에 저장되어 있는 값은 객체가 생성되며 Heap 영역에 존재한다. 정리하겠다. 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 동일한 경우 지역 변수가 우선순위를 갖는다. 객체 변수와 이름이 같은 지역 변수가 있을 경우, 객체 변수를 사용하려면 this를 접두사로 사용한다. 정적 변수와 이름이 같은 지역 변수가 있을 경우, 정적 변수를 사용하려면 클래스명을 접두사.. 자바, interface 키워드와 implements 키워드 interface는 public 추상 메서드와 public 정적 상수만 가질 수 있다. 분명 인터페이스는 public 추상 메서드와 public 정적 상수만 가질 수 있다고 했다. 그런데 위 코드를 보면 그 어떠한 것도 명시되어 있지 않다. 하지만 에러는 발생하지 않는다. 그 이유는 인터페이스의 메서드에 public과 abstract, 속성에 public과 static, final을 붙이지 않아도 자동으로 자바가 붙여준다. 자바, instanceof 연산자 인스턴스(instance)는 클래스를 통해 만들어진 객체이다. instanceof 연산자는 객체가 만들어진 특정 클래스의 인스턴스인지 확인하는 연산자이다. 객체_참조_변수 instanceof 클래스명 instanceof는 객체 참조 변수의 타입이 아닌 실제 객체 타입에 의해 처리한다. 고로 아래와 같이 코드를 변경하여도 결과는 동일하다. 중요한 사실이 있다. instanceof는 LSP을 위반하는 코드에서 주로 나타나는 연산자이기에 리팩터링 대상이 아닌지 점검해봐야 한다. 리스코프 치환 원칙(LSP) 베이스 클래스가 서브 클래스로 치환 되어도 동일한 동작을 보장해야 한다는 원칙 이전 1 2 3 다음