클래스와 인터페이스2
6. 추상클래스 대신 인터페이스를 사용한다.
- 인터페이스의 필요성 : 자바는 다중상속이 불가능한 대신, 인터페이스를 이용하여 구현해야 할 메서드를 규정할 수 있다. 인터페이스는 다중 구현이 가능하다.
- 인터페이스의 장점
- 메인 자료형을 보조할 서브 자료형으로 이용가능하다.(상속관계에 상관없이 인터페이스를 추가할 수 있으므로)
- 상속에 얽매이지 않는 자료형을 구현할 수 있도록 한다.
- 추상클래스보다는 타입결합이 약하기 때문에 의존성 주입 관계에 적절하다.
- 인터페이스 사용시 주의점
- 인터페이스에서 정의되는 모든 접근권한은 public이기 때문에, API로써 한번 공개되면 수정이 거의 불가능하다.
- 추상 골격 구현 : 제공하고자 하는 인터페이스와, 그 인터페이스의 핵심 기능을 미리 구현한 추상클래스를 제공하는 방법으로, 개발자는 그 추상클래스에 부족한 부분만 채움으로써 완전한 기능을 하는 클래스를 구현할 수 있다.
- 자바 8버전부터는 인터페이스에
default 메서드
를 이용하면 메서드 구현부를 제공할 수 있다.
7.인터페이스는 자료형을 정의할 때만 사용한다.
- 인터페이스를 사용하는 목적 : 해당 클래스의 객체가 어떤 일을 수행하는지를 클라이언트에게 알리기 위한 목적
- 잘못된 인터페이스 사용의 예
- 상수 인터페이스 - 인터페이스 내부에 static final 필드만 존재하는 인터페이스
8.태그 달린 클래스 대신 클래스 상속을 활용한다.
- 태그 달린 클래스? : 하나의 클래스가 2가지 이상의 기능으로 동작할 때, 어떤 기능으로 동작할지를 필드값으로 구분하는 클래스
- 태그 달린 클래스의 단점
- 여러 기능이 혼합되어 있어서 코드 가독성이 떨어진다.
- 여러 기능을 위해 많은 필드가 존재하기 때문에, 한 객체가 자신의 기능에 불필요한 필드를 가지므로 메모리 낭비다.
- 새로운 기능을 추가하려면 소스파일을 수정해야 한다.
- 클래스 상속을 통해 기능단위로 클래스를 분리하면 태그 클래스의 모든 단점을 제거할 수 있다.
9.전략을 표현하고 싶을 때는 함수 객체를 사용한다.
- 자바에서는 함수포인터의 역할을 객체가 대신한다.
- 필요한 메서드를 정의한 인터페이스를 준비하고, 그 인터페이스를 구현한 객체를 전달
- 전략 패턴 : 어떤 기능을 구현할 때, 중요한 메인 로직을 상황에 따라 변경할 수 있도록 함수(메서드)를 전달받아 그 함수에게 메인 로직을 위임하는 패턴
- ex : 배열의 정렬방법을 compare라는 메서드에 위임
Arrays.sort(stringArray, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
10.중첩 클래스는 가능하면 static으로 선언한다.
- 외부 클래스에 종속되는 중첩 클래스가 아니라면 static으로 선언해야 한다.
- non-static 중첩 클래스는 외부 클래스의 참조를 유지해야 하기 때문에, 성능&공간 측면에서 static 중첩 클래스보다 안좋다.
- ex 외부클래스 참조 예시
class A {
class B {
public void test() {
A.this.print();
}
}
void print() {
System.out.println("class A");
}
}
댓글 없음:
댓글 쓰기