inblog logo
|
Coding's note
    JAVA

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

    이소연's avatar
    이소연
    Aug 05, 2024
    예외처리, 인터페이스, 추상화 차이
    Contents
    인터페이스(교차로에서 직면)제네릭컬렉션스레드스트림버퍼채팅 만들기 가능
    -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
    Contents
    인터페이스(교차로에서 직면)제네릭컬렉션스레드스트림버퍼채팅 만들기 가능

    Coding's note

    RSS·Powered by Inblog