0408 | 객체지향 프로그래밍_강의 한줄요약 (3) // 팩토리메소드, 이벤트메소드, 추상과 인터페이스 차이
[1] 팩토리 메서드
: 추상메서드를 이용하는 대표적인 패턴
: 객체 생성하는 부분을 자식에게 위임해서, 자식이 객체생성을 책임지게 하는 메소드
: 생성하는 작업을 하기 때문에 공장메소드.
- 예. #makeExam() 추상메서드를 ExamConsole에 만들고, 이를 본뜬 NewlecExamConsole에서 #makeExam()을 구현하여 NewlecExam 객체가 생성되도록 한다
[2] 이벤트 메소드
: 어떤 사건에 의해 작동되는 함수.
- 예. 상속을 받은 자손클래스에서 기본으로 제공되는 값 외에 추가해야할 경우, ExamConsole에는 국어,수학,영어 외에 abstract onInput(); 을 설정하고, 자손클래스인 NewlecExam에서 추가되는 과목을 구현한다
[3] 코드분리와 인터페이스
: 인터페이스 = 코드분리를 하기 위해 나온 것. 집중화와는 또 다른 문제.
일반적인 방법으로 접근할 수 없을때(직접 사용할 수 없을때) 접근하게 해주는 도구 (다른공간으로 데려다주는 웜홀처럼, 소개자를 통해 다른사람을 만날 수 있는것 처럼)
: 부품의 분리를 생각할 때는, 일단 약속된 인터페이스로 제품을 만든다! 이는 분리된 객체를 사용할 수 있게 해주는 약속.
: 클래스가 무엇이든, 반드시 이것만큼은 해달라 라는 요구사항을 지켜야 함.
예. 배터리는 용량과 전압이 체크되어야한다 > interface Battery{ int getEnergy(); Boolean checkVolt();}
이후 인터페이스도 하나의 자료형으로 쓰일 수 있음.
실제 구현체는 인터페이스를 상속받아 구현
class NewlecBattery implements Battery{}
[4] 추상클래스와 인터페이스의 차이
👉 상속은 유전자를 물려받는 개념
👉 인터페이스는 사교적인 관계를 만들어내는 개념.
✔ 추상클래스
: 도구들. 속성이나 기능에 공통 분모가 있을 경우 > 뽑아내서 추상화
: 공통분모된 서비스를 집중화, 강제화 할 수 있음
: 추상화된걸 누가 쓰는지는 관심이 없음. 일단 추상화된 것들을 집중관리한다는게 목표.
: 클라이언트와 상관없이 도구로써 먼저 존재하게 됨. 클라이언트는 추상화를 구현한것중에 선택
✔ 인터페이스
: 인터페이스는 도구들이 공통 관계가 없음
: 인터페이스에 맞춰서 도구를 구현. set하여 사용. ▶ 해당 위치에 파일을 저장할수도, 이미지를 저장할수도 있게 됨.
: 그 위치가 메인이되어서 나한테 도구를 쓰려면 인터페이스를 구현해서 연결해. 라는게 핵심.
: 상속은 하나만 가능하므로 다중상속의 개념과는 또 다르다.
A는 인터페이스 X가 연결되는 도킹 역할, class B는 인터페이스를 구현하는 구조인데,
인터페이스는 기능만 맞으면 돌아간다는 말에 궁금해서, 인터페이스에 add(); 를 추가하고 클래스 C로 구현해서 연결해보았다.
변수 x가 B의 print()를 반환하고, 다시 C의 add()를 반환하는 구조라 말이 되나? 싶긴한데 (인터페이스 기능을 각각 다른클래스로 구현하기도하나? 클래스 B,C오류문구로 The type B must implement the inherited abstract method X.add() 이렇게 뜨는거 봐선 역시 한 클래스에서 다 구현하는게 맞는듯해서 둘다 B에 구현하고 고쳤다) 일단 '맞기만 하면 돌아간다' 라는게 궁금해서 추가해보았다.
[5] 객체단위로 분리/결합을 위한 인터페이스 구현하기
: 코드 결합력이 강한 구조는 어떤 부분도 대체가 불가하게 됨
- 개체 단위로 코드를 분리하는 경우 : 대체하기를 원하는 부분 > 캡슐
- 일부 기능 단위 코드를 분리하는 경우 : 대체하길 원하는 부분 > 일부 기능
- 메소드의 일부 코드를 분리하는 경우: 대체하길 원하는 부분 > 구현코드의 일부
- 소스코드를 통해서만 코드를 고칠수 있다 : 결합력이 강하다
- 소스코드가 아니더라도 코드를 고칠 수 있다: 결합력이 약하다
[6] 개체결합을 위한 인터페이스 구현하기
- 객체결합력을 낮추는 코드로 변경하기
* 인터페이스는 유전자가 달라도 기능만 맞으면 꽂아서 돌아갈 수 있음= 다양한 형질의 구조를 만들 수 있어서 다형성이라 이야기하기도 함
The method setX(X) in the type A is not applicable for the arguments (B)
B를 구현한 후 a.setX(b);로 인터페이스 setX에 연결시켰을때 뜨는 에러. 즉 B클래스는 만들었지만 인터페이스를 구현했다는 내용이 없으므로 적용 불가 메세지가 뜬다 ▶ class B implements X 기재 필요.
[7] 소스코드 없이 새로운 객체로 만들기 : 문자열을 읽어서 객체로 만들기
: 인터페이스를 구현한 클래스가 여러개일때, 일일히 소스코드에서 클래스타입을 바꿔주는게 아니라 해당 내용이 기재된 파일을 읽어서 적용될 수 있게 한다
(* 스트림으로 읽어들인 텍스트 파일에는 패키지명을 포함하여 클래스명이 적혀있다. part3.ex6.인터페이스.C)
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Scanner;
public class Program {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("src/part3/ex6/인터페이스/setting.txt");
Scanner scan = new Scanner(fis);
String className = scan.nextLine();
scan.close();
fis.close(); // stream과 스캔 닫아주기
Class clazz = Class.forName(className);
A a = new A();
X x = (X) clazz.getDeclaredConstructor().newInstance(); // 클래스 값을 읽어서 객체 생성
a.setX(x);
a.print();
}
}