728x90
1. 학습주제 : 싱글톤 패턴, 업캐스팅, 다운캐스팅 이해하기
✔️싱글톤 패턴
2023.12.18 - [프로그래밍 언어/Java] - [Java] 싱글톤 패턴 개념 및 구현방법
[Java] 싱글톤 패턴 개념 및 구현방법
1. 싱글톤 패턴 개념 싱글톤 패턴은 객체 지향 디자인 패턴 중 하나로, 특정 클래스의 인스턴스가 단 하나만 생성되도록 보장하는 패턴이다. 이 패턴을 사용하면 전역적으로 접근 가능한 객체를
ururuwave.tistory.com
✔️ 업캐스팅, 다운캐스팅
2023.12.18 - [프로그래밍 언어/Java] - [Java] 업캐스팅(Upcasting)과 다운캐스팅(Downcasting)
[Java] 업캐스팅(Upcasting)과 다운캐스팅(Downcasting)
1. 개념 1) 업캐스팅 : 서브클래스(하위클래스)의 인스턴스를 슈퍼클래스(상위클래스)의 참조로 형변환하는 것. Parent pobj = new Child(); ✔ 서브클래스에서 정의된 메서드 슈퍼클래스와 동일한 메서
ururuwave.tistory.com
2. 과제 : UML에 맞게 Final Duck을 구현하시오.
3. 해결과정
클래스의 역할과 관계를 정리해봅니다.
- Main - 진입점 역할
- MyFrame - awt라이브러리의 Frame클래스를 상속받아 -> 그래픽을 그려주는 역할
- DuckManager - 싱글톤 객체를 사용하여 Duck객체를 생성하고 Duck의 행동을 일괄적으로 관리하는 역할
- Duck - 오리 객체의 공통된 특성과 행동을 정의하는 추상 클래스
- MallardDuck, RedDuck, RubberDuck, DecoyDuck - Duck의 서브클래스, 각자의 스타일대로 함수를 재정의한다.
- Flyable, Quackable - 오리의 행동 인터페이스
4. 결과
/*Main 시작시점*/
package Day09_Singletone;
public class Main {
public static void main(String[] args) {
MyFrame frame = new MyFrame();
}
}
/*Main 종료시점*/
/*MyFrame 시작시점*/
package Day09_Singletone;
import java.awt.*;
public class MyFrame extends Frame{
public static final int FRAME_WIDTH = 800;
public static final int FRAME_HEIGHT = 600;
public MyFrame(){
super();
this.setSize(FRAME_WIDTH,FRAME_HEIGHT);
this.setVisible(true);
}
DuckManager mgr = DuckManager.getInstance(); //인스턴스 객체 가져옴
@Override
public void paint(Graphics g){
if(mgr!=null){ //null체크
mgr.displayAllDucks(g);
// mgr.swimAllDucks(g);
// mgr.flyAllDucks(g);
// mgr.quackAllDucks(g);
}
}
}
/*MyFrame 종료시점*/
/*DuckManager 시작시점*/
package Day09_Singletone;
import java.awt.*;
import java.util.Random;
public class DuckManager { //싱글톤패턴 구현, makeDucks메서드 추가
private Duck[] arr = new Duck[20];
private static DuckManager instance;
private DuckManager() {makeDucks();}
public static DuckManager getInstance() { //접근제어자 public static으로
if(instance == null){
synchronized (DuckManager.class){
if(instance == null){
instance = new DuckManager();
}
}
}
return instance;
}
public void makeDucks(){
Random rnd = new Random();
int type = 0;
for(int i = 0; i < arr.length; i++){
type = rnd.nextInt(4);
switch (type) {
case 0:
arr[i] = new MallardDuck(); //업캐스팅
break;
case 1:
arr[i] = new RedDuck(); //업캐스팅
break;
case 2:
arr[i] = new RubberDuck(); //업캐스팅
break;
case 3:
arr[i] = new DecoyDuck(); //업캐스팅
break;
default:
arr[i] = new MallardDuck(); //업캐스팅
}
}
}
public void displayAllDucks(Graphics g){
for (Duck d:arr) {
d.display(g);
}
}
public void swimAllDucks(Graphics g){
for(Duck d:arr){
d.swim(g);
}
}
public void flyAllDucks(Graphics g) {
for(Duck d:arr){
if(d instanceof Flyable){
((Flyable) d).fly(g); //다운캐스팅
}
}
}
public void quackAllDucks(Graphics g){
for(Duck d : arr){
if(d instanceof Quackable){
((Quackable)d).quack(g);
}
}
}
}
/*DuckManager 종료시점*/
/*Duck 시작시점*/
package Day09_Singletone;
import java.awt.*;
import java.util.*;
public abstract class Duck { //4가지 스타일 Duck의 공통된 스타일을 정의한다.
protected int x;
protected int y;
public static final int DUCK_SIZE = 30;
public Duck(){
Random rnd = new Random();
x = rnd.nextInt(MyFrame.FRAME_WIDTH-100)+50;
y = rnd.nextInt(MyFrame.FRAME_HEIGHT-140)+70;
}
public Duck(int x, int y){
this.x = x;
this.y = y;
}
public abstract void display(Graphics g);
public final void swim(Graphics g){
g.drawString("수영",x-20,y-1);
}
}
/*Duck 종료시점*/
/*MallardDuck 시작시점*/
package Day09_Singletone;
import java.awt.*;
public class MallardDuck extends Duck implements Flyable, Quackable{
public MallardDuck(){
super();
}
public MallardDuck(int x, int y){
super(x,y);
}
@Override
public void display(Graphics g){
g.setColor(Color.BLUE);
g.fillOval(x,y,DUCK_SIZE,DUCK_SIZE);
swim(g);
fly(g);
quack(g);
}
@Override
public void fly(Graphics g){
g.setColor(Color.BLUE);
g.drawString("날다",x-25,y+DUCK_SIZE);
}
@Override
public void quack(Graphics g){
g.setColor(Color.BLUE);
g.drawString("꽥꽥",x+DUCK_SIZE,y-1);
}
}
/*MallardDuck 종료시점*/
//나머지 Duck들은 비슷한 반복이라 생략한다.
/*interface 시작시점*/
//인터페이스는 제어를 위한 껍데기다.
package Day09_Singletone;
import java.awt.*;
public interface Flyable {
void fly(Graphics g);
}
package Day09_Singletone;
import java.awt.*;
public interface Quackable {
void quack(Graphics g);
}
/*interface 종료시점*/
5. 오늘의 회고
매일 메이플 하는 기분이다.
만렙찍으려고 강사님 NPC가 주는 퀘스트를 수행하는 느낌.
728x90
'프로그래밍 언어 > Java' 카테고리의 다른 글
[과제] 경마게임 만들기 | Thread 활용 (1) | 2023.12.20 |
---|---|
[Java] 제네릭(generic)의 개념과 활용법 (1) | 2023.12.19 |
[Java] 싱글톤 패턴 개념 및 구현방법 (0) | 2023.12.18 |
[Java] 업캐스팅(Upcasting)과 다운캐스팅(Downcasting) (0) | 2023.12.18 |
[Java] StringBuilder 사용 이유 & 주요 메서드 (0) | 2023.12.17 |