예외처리, 인터페이스, 추상화 차이

이소연's avatar
Aug 05, 2024
예외처리, 인터페이스, 추상화 차이
-runtime exception
-코딩 exception?
 
타입검사
notion image
타입을 검사해서 다운캐스팅하여 함?!
 
 
package ex06.example6; class Protoss{ } class Zealot extends Protoss{ public void attack(){ System.out.println("질럿이 공격합니다."); } } class Dragoon extends Protoss{ public void attack(){ System.out.println("드라군이 공격합니다."); } } public class CastingEx01 { public static void start(Protoss p){ if(p instanceof Zealot){ Zealot u = (Zealot) p; //부모를 자식에게 대입할 수 없다.(반대는 됨.) u.attack(); } if(p instanceof Dragoon){ Dragoon u = (Dragoon) p; u.attack(); } } public static void main(String[] args) { start(new Zealot()); start(new Dragoon()); } }
 
💡
코드를 어떻게든 만들어내고 뜯어 고쳐보기
 
OCP -오버로딩?! (추상화)
 
객체프로그램
💡
상태는 행태를 통해 변경
💡
프로그램을 추상화시켜야 한다.
 
Inpa Dev(블로그)
 
추상클래스
abstract class 탈 것 abstract run(); //밑에 니들 알아서 해 // 그냥 클래스도 되는데 추상만들면 (new x, 추상 만들 수 있음) 자동차 extends 탈 것 run(){달린다} 비행기 extends 탈 것 run(){난다}
 
class : 구체적인 것 ,object
ex) 엔진 클래스 만듦 → 자동차 만들고 싶어
자동차는 엔진이 아님. 그래서 이 관계는 has의 관계이다.
자동차는 엔진을 가지고 있다.
(자동차는 엔진을 상속 x) (생성자로 전달해야 한다?!)
 
⇒ class 자동차, class 탈 것
상속 = is
자동차는 탈것인가요? yes
 
구체적인 것 class
질럿, 드라군, 리버를 따로 만듦, 그리고 attack이라는 메서드를 하나씩 다 들고 있음
그리고 각각은 쉴드회복()이라는 공통 메서드가 있음
공격스타일 ) Z원거리 d 근거리 R 미사일 ⇒ 추상화시켜야 함.
→protoss 상속
⇒ PROTOSS attack() 껍데기 만듦. 내부를 미리 정할 수 없음→ 추상메서드
껍데기, 추상적 → 추상적-v
구체적 → 클래스
그리고 각각은 쉴드회복()이라는 공통 메서드가 있음
⇒ protoss-attack() -쉴드회복( ){ 구현} → z,d,r에는 ,쉴드회복 구체적으로 적을 필요x
A키 + 마우스 클릭
 
ex) 추상메서드가 없다고 해도 추상으로 안 만듦. 구지 new안할거니까
포켓몬스터-피카츄 // 포켓몬스터가 실제로 애니에 존재(나오는 건)하는 건 아니니까.
 

인터페이스(교차로에서 직면)

 
ex) 갈 수 있는 길은 3개 있고 강제되어 있음.
notion image
⇒ 내가 할 수 있는 게 제한되어 있음
💡
인터페이스 : 약속(3갈래 중 1나만 갈 수 있음) / 수직적 관계 //메서드 강제 가능-v
인터페이스 : 약속(3갈래 중 1나만 갈 수 있음) / 수직적 관계
⇒일방적으로 약속이 정해져 있음 (정부가 일방적으로 고속도로를 만들어 놓음)
→ 갑(약속 마음대로, 일방적으로) / 을(지켜야 함) 관계
ex) 5시에 오면 100원 줄게
 
💡
프로토콜 : 약속 / 수평적 관계_힘이 없음
프로토콜 : 약속 / 수평적 관계
ex) 제 3가 와서 100만원 여기에 둘게(둘이서 협의점을 찾음)
 
컨테이너(인터페이스)_컨테이너에 맞춰 트럭을 만듦
 
인터페이스 : 갑의 명령.
 
짐 ) 항구 ) 배에 싣고
그래서 컨테이너 만듦
 
원래 실세계에서는 프로토콜 > 인터페이스 되는 거지만(배달의 민족)
코드상에서는 바로 인터페이스 적어서 만들 수 있음.-v
package ex07.example; interface Remocon { public abstract void on(); public abstract void off(); } class SamsungRemocon implements Remocon { @Override public void on() { } @Override public void off() { } } class LgRemocon implements Remocon { @Override public void on() { } @Override public void off() { } } public class InterEx01 { public static void on(Remocon s) { s.on(); } public static void main(String[] args) { } }
 
 
문법은 같음, 용도가 다름
만드는 시점이 다름
  • 추상적
구체적 >> 추상화 만들면 됨(아래에서 위로 감)
만들었더니 비슷하네-v
  • interface _(+ implements)
구체적으로 만들기 전, 이 메서드 반드시 필요해서 강제 시킬 때 만듦
만들기 전, 이 규칙에 맞춰 만들어.
package ex07.example; interface Remocon { (public abstract) void on(); 생략가능 public abstract void off(); } class SamsungRemocon implements Remocon { @Override public void on() { } @Override public void off() { } } class LgRemocon implements Remocon { @Override public void on() { } @Override public void off() { } } public class InterEx01 { public static void main(String[] args) { } }
package ex07.example; interface Remocon { void on(); void off(); } class SamsungRemocon implements Remocon { @Override public void on() { System.out.println("삼성 리모컨 on"); } @Override public void off() { System.out.println("삼성 리모컨 off"); } } class LgRemocon implements Remocon { @Override public void on() { System.out.println("엘지 리모컨 on"); } @Override public void off() { System.out.println("엘지 리모컨 off"); } } class CommonRemocon{ private Remocon r; public CommonRemocon(Remocon r) { this.r = r; } public void on(){ r.on(); } public void off(){ r.off(); } } public class InterEx01 { public static void main(String[] args) { Remocon samsung = new SamsungRemocon(); //[리모컨,삼성 리모컨 메모리에 2개 뜸] samsung.on(); } }
new remote x→ object가 아님
 
컴퍼지션(결합)
 
💡
문법
💡
사용할 줄 알아야 함. 이해
package ex07.example; interface Remocon { void on(); void off(); } class SamsungRemocon implements Remocon { @Override public void on() { System.out.println("삼성 리모컨 on"); } @Override public void off() { System.out.println("삼성 리모컨 off"); } } class LgRemocon implements Remocon { @Override public void on() { System.out.println("엘지 리모컨 on"); } @Override public void off() { System.out.println("엘지 리모컨 off"); } } /** * 작성자 : 홍길동 * 날짜 : 2023.12.26 * 구현체 : SamsungRemocon, LgRemocon */ class CommonRemocon{ //[Remocon <- samsungRemocon] //[Remocon <- LgRemocon] private Remocon r; // 인터페이스 or 추상클래스 public CommonRemocon(Remocon r) { this.r = r; } public void on(){ r.on(); } public void off(){ r.off(); } } public class InterEx01 { public static void main(String[] args) { CommonRemocon cr = new CommonRemocon(new SamsungRemocon()); cr.on(); } }
  • 이벤트_리스너와 관련
알고 있는 이벤트는 lisetner 필요x
예정에 없는 이벤트는 lisetner 필요.(계속 지켜보고 있음. 데몬.)
 
  • lisenter 규칙(데몬, 몇 초에 한 번씩 감지)
-딜레이를 줘야 함. ( full로 하면 감지는 빠르지만 cpu 피곤)
→장점) 리소스를 적게
단점)이벤트 감지 느림
 
-if 빨리 잡으면
→ 감지 빠르지만 리소스 많이 먹음.
package ex07.example; //라이브러리 판매 interface EventListener{ void action(); } //라이브러리 판매자가 생성 class MyApp{ public void click(EventListener l){ l.action(); } } //개발자인 내가 구현 class Button implements EventListener{ @Override public void action() { System.out.println("회원가입 로직이 실행됩니다"); } } public class InterEx02 { public static void main(String[] args) { MyApp app = new MyApp(); app.click(new Button()); } }
람다로직법?( )→{ }
package ex07.example; //라이브러리 판매 interface EventListener{ void action(); } //라이브러리 판매자가 생성 class MyApp{ public void click(EventListener l){ l.action(); } } //개발자인 내가 구현 public class InterEx02 { public static void main(String[] args) { MyApp app = new MyApp(); app.click(() -> { System.out.println("회원가입 로직이 실행됩니다"); }); //그럼 구현체를 만들지 않아도 됨. } }
 
윈도우 프로그램
package ex07.example; import javax.swing.*; import java.awt.*; class BasicFrame extends JFrame{ public BasicFrame(){ } } public class MyFrameEx01 { static int num = 1; public static void main(String[] args) { JFrame jf = new JFrame(); //jf.setLayout(new BorderLayout()); jf.setSize(300,500); JButton btn1 = new JButton("더하기"); JButton btn2 = new JButton("빼기"); JLabel la1 = new JLabel(num+ ""); jf.add("North", btn1); jf.add("South", btn2); jf.add("Center",la1); btn1.addActionListener(e -> { num++; la1.setText(num + ""); }); btn2.addActionListener(e -> { num--; if(num < 0){ num = 0; } la1.setText(num + ""); }); jf.setVisible(true); } }
 
마우스 on? : 마우스 가져다 대기만 해도 뜸
스윙으로 연습하면 자바 실력 help
 

제네릭

컬렉션

스레드

스트림

버퍼

채팅 만들기 가능

 
 
💡
생성자/함수의 차이
생성자 : 동일한 클래스 명, 초기값을 정해주는 것.자료형 없는 것
 
함수 - 자료형이 있는 것.
Share article

Coding's note