객체지향
28. 이벤트 메소드 구현하기
팩토리 메소드할때 com과목을 받지 못하는 문제가 생겻다.
그런데 새로 재정의하면 나눈이유가없다.
확장될 성적을 입력하는 것을 고민하면된다.
부모에 추상메소드를 만들고 자식이 구현한 후 부모에서 메소드를 꽃아넣으면된다.
protected abstract void onPrint(Exam exam);
protected abstract void onInput(Exam exam);public class NewlecExamConsole extends ExamConsole {
@Override
protected void onPrint(Exam exam) {
NewlecExam newlecExam = (NewlecExam) exam;
int com = newlecExam.getCom();
System.out.printf("컴퓨터: %3d\n", com);
}
@Override
protected void onInput(Exam exam) {
Scanner sc = new Scanner(System.in);
NewlecExam newlecExam = (NewlecExam) exam;
int com = newlecExam.getCom();
do {
System.out.printf("컴퓨터: ");
com = sc.nextInt();
if (com < 0 || 100 < com) {
System.out.println("컴퓨터성적은 0~100까지의 범위만 입력이 가능합니다.");
}
} while (com < 0 || 100 < com);
}
}29. 코드 분리와 인터페이스
추상클래스는 집중화이다.
인터페이스는 집중화가 아니다.
인터페이스는 무엇을 하나? 분리이다. 코드 분리를 위해 어쩔수 없이 나오는 것이다.
집중화로 보는 것은 근시안적인 것이다.
인터페이스는 두가지의 형태를 가지고 있다.
인터페이스는 무엇인가?
어떤곳 어떤장소 어떤시간을 접근할때 일반적인 방법으로
접근을 못할때 접근할 수 있게 해주는 도구가 인터페이스이다.
직접사용할 수 없고 분리된 대상을 사용하기 위해서
분리되있는 상대를 만날수 있는 접점이 인터페이스고 자바, 소프트웨어에서도 이게 필요하다.
인터페이스가 필요한가?
핸드폰 만들때 배터리를 분리형으로 만들가 일체형으로 만들까?
그냥 떼어내는 것이아니라 연결하기위한 도구, 접점이 필요하다.
분리하는 이유
1.배터리는 다른 업체들이 만들수있게 할까? 협업
2.배터리를 교체형으로 만들까? 다양한 형태로 바꿔끼면 다른 일을 하게
3.폰은 다양하지만 배터리를 표준으로 만들까? 일부부품 라이브러리가 표준
4.모둘별로 별도 업데이트할까?
등등 의 이유가 있다.
분리햇다가 낄때 아무런 약속없이 꽃을 수 없다.
이 약속, 규칙, 규약이 인터페이스 이다. 이걸 어떻게 구현할 것인가?
반드시 이것만큼은 서비스 목록으로 가져야한다를 구문으로 만들어 둔다.
interface Battery{
int getEnergy();
boolean checkVolt();
}
앞으로 꽃아질 배터리를 위한 간접적인 도구이다.
이 인터페이스를 나중에 setBattery로 객체를 꽃아 넣는다.
인터페이스를 이용한 변수를 선언한다. 그리고 set으로 꽃아넣고 자료형이다.
프로그램에선 일단 구현되지도 않은 것을 호출하는 것이다.
이 방식대로라면 일단 프로그램은 되지만 구현한 배터리가 있다면 프로그램이 실행되게 될 것이다.
실제적인 구현체는 구현하겟다고 implements인터페이스 상속을 해주면 된다.
분리된 객체를 사용할수잇게해주는 약속이다.
일상에서 사용하는 용어임을 기억하고 자바에서도 그렇게 생각해보자.
클래스상속과는다르게 책임만 지는 것이다.
인터페이스는 두가지 종류가있다.
1.부품이 분리되는 인터페이스
여러개 메소드가 있고 부품이 가지고잇는걸 구현하는 것처럼 생겼다.
2.부품이 아니라 코드의 일부분만 분리
메소드에서 일부분만 분리할때 사용한다.
30. 추상클래스와 인터페이스의 차이
공통분모 : 추상클래스? 인터페이스?
추상클래스는 개체들의 공통분모를 일반화한 이름이다.
공통화 일반화하는것이 추상화작업이고 그것이 추상클래스이다.
추상화가 좋은 점은 공통으로 잇다면 집중화할 수 있다.
기능적으로 같이 가지고 있어야할 서비스가 있다면 집중화하거나 강제화할 수 있다.
집중하겠다는 것이 첫번째 목표이다.
공통분모를 쓰겟다하면 밑에 있는 것을 아무거나 다쓸수있다.
추상클래스는 클라이언트와 상관없이 클래스가 만들어지고
클라이언트가 어떤걸 사용할 것인지를 정하는 것이다.
인터페이스는 이것과다르다. 추상클래스는 나중에 집중화를 통해 만들어지지만
인터페이스는 일단 정의 해두고 구현하지 않고 꽃아넣는다.
기능이 필요하다면 구현해서 꽃아넣어달라고 하는 것이다.
서비스 받고 싶다. 기능이 필요할 경우 공통된 것들이 없어도 꽃아 넣을 수 있는 것이다.
터페이스에서 필요로하는 것을 구현만 하면 넣을 수 있다.
인터페이스에서 주가 되는 것은 서비스를 부르는 클라이언트이다.
a기능을 하다가 b기능이 있다면 여러개 잇다면 그냥 꽃아서 사용을 할 수도 있다.
class상속은 유전자를 상속받는거라면
인터페이스 상속은 사교적으로 필요할때 가는 것이라고 생각하면 쉽다.
31. 객체 단위로 분리/결합을 위한 인터페이스 구현하기
중간의 코드가 대체 되거나 없어질경우에 중간에 캡슐로 인터페이스를 꽃으면 없어져도 프로그램이 돌아가게 된다.
더작은 단위로 인터페이스가 잇는 경우가 있다. 일부 기능만 대체 될 경우 만들어지기 위해 기다리고 마무리 져야하나?
인터페이스로 처리하고 일단 일하는게 맞다
구현코드의 일부가 그거라면 그부분도 인터페이스를 사용할 수 있다.
교체되거나 만들어지지않앗을때 대안으로 사용할 수 있는것이다.
기업에선 가장 기본이 된다.
public class Program {
public static void main(String[] args) {
A a = new A();
a.print();
}
}public class A {
private B b;
public A () {
b = new B();
}
public void print() {
int total = b.total();
System.out.println(total);
}
}public class B {
public int total() {
return 30;
}
}현재 이코드들은 결합력이 매우 강하게 이어져잇다. 한쪽 소스코드가 오류가나면 여기저기 다 고쳐야할 것이다.
소스코드를 통하지 않고 서로를 바꿀 수 있도로고 하는것이 인터페이스이다.
32. 개체 결합을 위한 인터페이스 구현하기
직접사용하는게 아닌 결합력을 낮춰보자.
객체결합을 위한 인터페이스를 구현해보자.
인터페이스는 코드를 분리되엇을때 중간에 이어주는 역할을 한다.
객체 결합력을 낮추는 코드로 변경해보자.
A와 B가 부품으로 사용함으로써 결합력이 강하다.
B가 없더래도 A가 만들어질 수 있도록 해야한다.
A - 인터페이스 - B의 순서를 가지게 하면 기능적인 것만 구현이 되엇다면 바꿔낄 수가 있다.
다양한 형질을 만들 수있어서 다형성이라고 한다.
사용하는 사람은 B를 볼 수 없는데 만약 B를 바꾸려면 A를 통채로 바꿔야 한다.
A가 생성할수있는 객체가 없다라고 생각해보자 이걸 대신할 수있는게 인터페이스이다.
인터페이스는 구현한게 아니기때문에 생성자에서 생성할 수 없다.
인터페이스를 가지고 참조라는 것을 가능하게 해야한다. 구현한객체라면 무조건 참조가 가능하게 한다.
그 객체가 포탈을 사용할 수 있게 해준다
public interface X {
int total();
}public class A {
private X x;
public A () {
//b = new B();
}
public void setX(X x) {
this.x = x;
}
public void print() {
int total = x.total();
System.out.println(total);
}
}public class B implements X {
public int total() {
return 30;
}
}원래는 a와 b가 일체형이엇는데 program에서 set을 통해 결합이 되엇다.
이 결합이 인터페이스를 이용하면 누구든지 결합이 될 수있다.
X인터페이스를 구현한다면 어떤 클래스이던 사용할 수 있다.
그런데 소스코드 없이 B를 만들지 않고 바꿔야한다.
새로운 클래스로 추가햇을 경우 바꾸는 방법을 다음강의에서 알아보자.
33. 새로운 객체로 바꾸기(문자열을 읽어서 객체로 만들기)
B객체를 만들어서 꽃아넣어는데 소스코드를 고쳐야만 바꿀 수 있다.
그런데 소스코드를 자꾸 고치는건 말이 안된다.
B클래스를 사용 C클래스사용 -> 설정파일로 빼서 하기 XML형태와 어노테이션을 사용하면된다.
나중가서 배우면 스프링이 DI를 도와준다.
setting.txt에 패키지명을 입력한다. 그리고 이 설정된것을 읽어오면된다.
외부파일의 에서 파일을 불러오고 경로가 문자로 온다.
이 경로의 주소를 통해 Class clazz = Class.forName(className);클래스 명을 가져온다.
그리고 이정보로 instacance를 얻을 수 있다.
public class Program {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("src/ch03객체지향2/sec06인터페이스/setting.txt");
Scanner sc = new Scanner(fis);
String className = sc.nextLine();
sc.close();
fis.close();
Class clazz = Class.forName(className);
A a = new A();
X x = (X) clazz.newInstance();
a.setX(x);
a.print();
}
}원래대로라면 xml로 정보를 얻어오는 것이다. 요즘에는 스프링으로 설정을 가져온다.
34. 일부 기능을 분리하는 인터페이스
https://youtu.be/BSEdMmBXKHg 영상참조
같은 계열의 클래스면 추상클래스로 하면되는데 완전다르다면 인터페이스로 하면된다.
개체 단위가 아니라 전체가 아닌 일부기능만 구현하려고 한다면 어떻게 해야할까? 약간의 커스터마이징을 하면된다.
frame.addwindowLister WindowLister가 인터페이스이다.
구현화해야하는 목록이 나온다.
없어도 문제가 안됫엇는데? WindowLisnter가 옵션이엇기 때문이다.
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JOptionPane;
public class gameWindowListner implements WindowListener {
@Override
public void windowClosing(WindowEvent e) {
JOptionPane.showMessageDialog(null, "GOOD BYE");
System.exit(0);
}인터페이스라는 것이 일부기능에 대해서 사용자에게 당신이 만들라고 미뤄둘때도 사용할 수잇음을 알게 되었다.
35. 인터페이스를 구현하는 위치는?
구현하는 위치가 새로운 클래스로 구현했었다. 아주 정상적인 방식이다.
그런데 지난시간 예제처럼 구현만 하고 객체로서의 역할이 크지 않을때 게임프레임이 알아서 구현햇어야하는 것이다.
별도의 클래스로 객체로 증가시키는 것은 좋지않다. 부품이 많아지면 좋지않다.
조금더 효과적인 방법은 안에 만드는 것이다.
public class GameFrame extends Frame implements WindowListener {
@Override
public void windowClosing(WindowEvent e) {
JOptionPane.showMessageDialog(this, "GOOD BYE");
System.exit(0);
}2023.02.28 후기
혼자 복습에서는 스트림을 끝냈는데 스트림을 많이 사용하지 않으니 항상 잊게 되는게 문제다. 프로그래머스 문제를 풀때 한두개씩 간단한 것을 작용시켜보면서 풀어보는 것이 좋을 것 같다.
영상을 공부하고 국비의 진도와 비슷한 것을 다시 보니 헷갈리지 않고 이해가 더 잘되는 것이 좋다.
문제들을 풀면서 다양한 개념들을 얻고 다양한 적용방법을 생각해보는 것이 가장 중요한 것 같다.
벌써 3월달이 다가온다. 해이해지지 않도록 주의하자.
'기초단계 > JAVA' 카테고리의 다른 글
| 2023.03.07 Java 복습 (0) | 2023.03.07 |
|---|---|
| 2023.03.03 Java 복습 (0) | 2023.03.06 |
| 2023.02.28 - 1 Java복습 (0) | 2023.02.28 |
| 2023.02.27 -2 Java복습 (0) | 2023.02.27 |
| 2023.02.27 Java복습 (0) | 2023.02.27 |