자바의 상속과 구현의 차이점
- 각각의 상자는 객체 (object)이고, 자바에서는 클래스라 부름
- 하위 객체가 상위 객체를 상속받아 사용하는데, 이때 상위객체의 특징(메소드, 변수 등)을 받아오게 됨
- 이때에,
- 부모의 특징(메소드, 변수 등)을 새롭게 구현 -> 구현 (implements, interface 구현)
- 부모의 특징을 그대로 사용 -> 상속 (extends)
상속 extends
- 자식이 부모의 특징을 상속받아서 사용 가능한 것으로, 코드의 재사용성 높아지고 중복성을 최소화 할 수 있음
- 부모에서 선언/정의를 모두 하고, 자식은 오버라이딩 할 필요 없이 부모의 메소드, 변수를 그대로 사용할 수 있음
- 자식은 부모의 특징을 상속받아 필요한 부분을 그대로 사용하는 것으로 코드의 효율을 올리고, 또 필요한 특징은 추가하여 기능을 확장하여 사용할 수 있음
- 필요에 따라 오버라이딩하여 사용도 가능
- 일반적인 상속의 대표적 예
구현 implements
- 특정 인터페이스를 클래스에서 구현한다는 것을 의미
- 부모 객체는 선언만 하고, 정의는 자식이 오버라이딩해서 사용
- 인터페이스에서 정의한 메서드에 강제력이 생김으로서, 해당 인터페이스를 구현한 클래스에서는 인터페이스의 메 서드를 재정의 하는 것으로 구현을 해야 함
특징
- 클래스에서 클래스에 다중상속은 불가능
- 인터페이스에서 인터페이스에 다중 상속 가능
- 클래스에 여러 인터페이스 다중 구현 가능
데코레이터 패턴의 장단점
장점
- 기존 코드를 수정하지 않고도 데코레이터 패턴을 통해 행동을 확장시킬 수 있음
- 구성과 위임을 통해 실행중에 새로운 행동을 추가할 수 있음
단점
- 의미없는 객체들이 너무 많이 추가될 수 있음
- 데코레이터를 너무 많이 사용하면 코드가 필요 이상으로 복잡해질 수 있음
- 특정 구소요소인지 확인 후 작업을 처리해야하는 경우에 데코레이터 패턴 사용이 힘들 수 있음
- 구성요소 초기화하는 코드 복잡해짐
데코레이터 패턴 사용이 좋은 경우
- 클래스 요소들을 계속 수정하면서 사용하는 구조가 필요한 경우
- 여러 요소들을 조합해서 사용하는 클래스 구조인 경우
예제 1
- 자바의 입출력 스트림은 데코레이터 패턴을 사용
- 실제 입출력 기능을 가진 객체(컴포넌트)와 그 외 다양한 기능을 제공하는 데코레이터(보조스트림)을
사용하여 다양한 입출력 기능을 구현
- 상속보다 유연한 확장성을 가짐
- 지속적인 서비스의 증가와 제거가 용이함
package others;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileTest {
public static void main(String[] args) throws IOException {
RandomAccessFile rf = new RandomAccessFile("random.txt","rw");
rf.writeInt(100);
System.out.println(rf.getFilePointer());
rf.writeDouble(3.14);
rf.writeUTF("안녕하세요");
//처음위치로 변경
rf.seek(0);
int i = rf.readInt();
double d = rf.readDouble();
String str = rf.readUTF();
System.out.println(i);
System.out.println(d);
System.out.println(str);
rf.close();
}
}
예제 2
https://incheol-jung.gitbook.io/docs/study/undefined/undefined-2/undefined-3
references