이펙티브 자바 (61) 썸네일형 리스트형 [이펙티브 자바] 아이템 21. 인터페이스는 구현하는 쪽을 생각해 설계하라 디폴트 메서드 : 인터페이스 내에서 구현 코드를 가진 메서드 추상 메서드 : 선언만 있고 구현이 없는 메서드 예시 : interface MyInterface { // 추상 메서드 void abstractMethod(); // 디폴트 메서드 default void defaultMethod() { System.out.println("This is a default method."); } } // MyInterface를 구현하는 클래스 class MyClass implements MyInterface { @Override public void abstractMethod() { System.out.println("Abstract method implementation."); } } public class Mai.. [이펙티브 자바] 아이템 20. 추상 클래스보다는 인터페이스를 우선하라 자바가 제공하는 다중 구현 메커니즘은 인터페이스와 추상 클래스 두가지이다. 둘의 가장 큰 차이는 추상 클래스가 정의한 타입을 구현하는 클래스는 반드시 추상 클래스의 하위 클래스가 되어야 한다는 점이다. 자바는 단일 상속만 지원하니, 추상 클래스 방식은 새로운 타입을 정의하는데 큰 제약을 안게되는 셈이다. 반면 인터페이스가 선언한 메서드를 모두 정의하고 그 일반 규약을 잘 지킨 클래스라면 다른 어떤 클래스를 상속했든 같은 타입으로 취급된다. 다중 구현 메커니즘 : 한 클래스가 둘 이상의 인터페이스를 구현할 수 있는 기능 인터페이스의 장점 : - 인터페이스는 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해 넣을 수 있다. - 인터페이스로는 계층구조가 없는 타입 프레임워크를 만들 수 있다. - 인터페이스는 .. [이펙티브 자바] 아이템 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라 메서드를 재정의하면 어떤 일이 일어나는지를 정확히 정리하여 문서로 남겨야 한다. 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기 사용 패턴) 문서로 남겨야 한다. 자기 사용 패턴 : 클래스 내부의 한 메서드가 같은 클래스의 다른 메서드를 호출하는 패턴. 자기 사용 패턴이 상속과 결합될 때 문제가 발생할 수 있다. 슈퍼클래스가 자신의 메서드를 호출할 때 실제로 실행되는 메서드가 서브클래스에서 오버라이드된 메서드일 수 있다. 아래는 API 문서의 메서드 설명 예시이다. 설명 끝 부분에 "Implementation Requirements"로 시작되는 부분은 그 메서드의 내부 동작 방식을 설명하는 곳이다. public boolean remove(Object o) 주어진 원소가 이 .. [이펙티브 자바] 아이템 18. 상속보다는 컴포지션을 사용하라 상속 : 한 클래스가 다른 클래스의 속성과 메서드를 확장 혹은 재정의할 수 있도록 해주는 매커니즘 // 상속의 예시 : // 부모 클래스: 동물 class Animal { public void eat() { System.out.println("이 동물은 먹는다."); } } // 자식 클래스: 개 // Dog 클래스는 Animal 클래스를 상속받음으로써 "개는 동물이다"라는 Is-a 관계를 형성합니다. class Dog extends Animal { public void bark() { System.out.println("개는 짖는다."); } } 컴포지션 : 하나의 클래스가 다른 클래스의 인스턴스를 포함하여, 그 인스턴스의 메서드를 활용하는 방식 // 컴포지션의 예시 : // 독립된 기능을 가진 클래스.. [이펙티브 자바] 아이템 17. 변경 가능성을 최소화하라 불변 클래스 : 인스턴스의 내부 값을 수정할 수 없는 클래스 클래스를 불변으로 설계하는 이유 : 가변 클래스보다 설계하고 구현하고 사용하기 쉽고 오류가 생길 여지가 적어 안전하다. 클래스를 불변으로 만드는 규칙 : 객체의 상태를 변경하는 메서드(변경자)를 제공하지 않는다. setter 메서드를 제공하지 않아야한다. 객체의 상태는 생성 시점에만 설정되고, 이후에는 변경될 수 없다. 클래스를 확장할 수 없도록 한다. 상속을 통해 하위 클래스에서 부주의하게 객체의 상태를 변경하는 사태를 막아준다. 모든 필드를 final로 선언한다. 필드가 생성자에서 한 번만 할당될 수 있고, 이후에는 그 값이 변경될 수 없다. 모든 필드를 private으로 선언한다. private으로 선언함으로써 클래스 외부에서 직접 접근할.. [이펙티브 자바] 아이템 16. public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 캡슐화는 객체의 데이터(필드)와 그 데이터를 조작하는 메서드를 하나의 단위로 묶는 것을 의미한다. 이를 통해 객체의 상태를 보호하고 외부에서 직접 접근하는 것을 제한하여 객체의 유지보수와 확장성을 향상시킬 수 있다. // 좋지 않은 예: public 필드를 직접 사용 class PersonBadExample { public String name; public int age; public PersonBadExample(String name, int age) { this.name = name; this.age = age; } } // 좋은 예: private 필드와 public 접근자/설정자 메서드를 사용 class PersonGoodExample { private String name; private in.. [이펙티브 자바] 아이템 15. 클래스와 멤버의 접근 권한을 최소화하라 "클래스와 멤버의 접근권한을 최소화하라"는 원칙은 정보 은닉(Encapsulation)과 관련된 개념으로, 코드를 작성할 때 클래스와 그 내부 멤버에 대한 접근 권한을 가능한 한 제한하는 것을 권장하는 원칙이다. 이렇게 함으로써 코드의 유지 보수성과 안정성을 높일 수 있다. 정보은닉의 기본 원칙 : 모든 클래스와 멤버의 접근성을 가능한 한 좁혀야 한다. 소프트웨어가 올바르게 동작하는 한 항상 가장 낮은 접근 수준을 부여해야 한다. 멤버에 부여할 수 있는 접근 수준 : public: 이 접근 수준을 가진 멤버는 어디서든 접근할 수 있다. 즉, 해당 멤버는 외부 클래스, 패키지, 심지어 다른 모듈에서도 접근할 수 있다. protected: 이 접근 수준을 가진 멤버는 동일한 패키지 내의 클래스 및 해당 클래.. [이펙티브 자바] 아이템 14. Comparable을 구현할지 고려하라 Comparable 인터페이스는 객체들을 순서대로 정렬할 수 있도록 한다. 이 인터페이스를 구현하는 클래스는 compareTo 메서드를 오버라이드 해야하며, 이 메서드는 객체 자신과 다른 객체를비교하여 정렬 순서를 결정하는데사용된다. compareTo 메서드의 일반 규약 1. 호출 결과의 부호는 첫 번째 객체가 두 번째 객체보다 작은지, 같은지, 큰지를 나타낸다. compareTo가 반환하는 값이 0보다 작으면, 첫 번째 객체가 두 번째 객체보다 작다는 것을 의미합니다. compareTo가 반환하는 값이 0이면, 두 객체는 동일하다는 것을 의미합니다. compareTo가 반환하는 값이 0보다 크면, 첫 번째 객체가 두 번째 객체보다 크다는 것을 의미합니다. 2. 두 객체 참조의 순서를 바꿔 비교해도 예상.. 이전 1 ··· 3 4 5 6 7 8 다음