-runtime exception
-코딩 exception?
타입검사

타입을 검사해서 다운캐스팅하여 함?!
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개 있고 강제되어 있음.

⇒ 내가 할 수 있는 게 제한되어 있음
인터페이스 : 약속(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