수업
+22 super, this, 형변환, 추상클래스, 인터페이스
hs_developer
2022. 6. 2. 16:27
p375-387, 390
super, this
Super: 생성자 Call...
Sub: 생성자 Call...
Super.a = 100
Sub.a = 200
Super: display() Call..
Sub: display() Call...
class Super // extends Object
{
int a = 100;
public Super()
{
System.out.println("Super: 생성자 Call...");
}
public void display()
{
System.out.println("Super: display() Call..");
}
}
class Sub extends Super
{
int a = 200;
public Sub()
{
super(); // 첫 줄에 사용 → 사용 빈도 없다
System.out.println("Sub: 생성자 Call...");
}
public void display()
{
System.out.println("Sub: display() Call...");
}
public void print()
{
System.out.println("Super.a = " + super.a); // 100
System.out.println("Sub.a = " + this.a); // 200
super.display();
this.display();
}
}
public class MainClass {
public static void main(String[] args) {
Sub sub = new Sub(); // 상위 클래스 메모리 할당 → 하위 클래스 메모리 할당
sub.print();
}
}
형 변환
public static void main(String[] args) {
List list = new ArrayList();
list.add("Hello");
list.add(10);
String msg = (String)list.get(0); // Hello
int a = (int)list.get(1); // 10
}
public static void main(String[] args) {
Super1 s1 = new Super1();
Sub1 s2 = new Sub1();
Super1 s3 = new Sub1(); // UpCasting
Sub1 s4 = (Sub1)s3; // DownCasting → 형변환 필요
}
instanceof
public static void main(String[] args) {
Object obj = new Object();
String str = new String();
StringBuffer sb = new StringBuffer();
if(str instanceof Object) // str == Object
{
System.out.println("OK");
}
if(sb instanceof Object) // sb == Object
{
System.out.println("OK");
}
if(obj instanceof String) // obj != String → String이 더 작다
{
System.out.println("OK");
}
}
메소드
같은 기능 클래스 모을 때 사용
입력: detail
게시판 상세 출력
public class MainClass {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("입력: ");
String cmd = sc.next();
// list, insert, update, delete, detail
if(cmd.equals("list"))
{
// 사용자가 목록 요청
BoardList bl = new BoardList();
bl.boardList();
}
else if(cmd.equals("insert"))
{
// 사용자가 글쓰기 요청
BoardInsert bi = new BoardInsert();
bi.boardInsert();
}
else if(cmd.equals("detail"))
{
// 사용자가 상세보기 요청
BoardDetail bi = new BoardDetail();
bi.boardDetail();
}
else if(cmd.equals("update"))
{
// 사용자가 수정 요청
BoardUpdate bi = new BoardUpdate();
bi.boardUpdate();
}
else if(cmd.equals("delete"))
{
// 사용자가 삭제 요청
BoardDelete bi = new BoardDelete();
bi.boardDelete();
}
}
}
public class BoardDetail {
public void boardDetail()
{
System.out.println("게시판 상세 출력");
}
}
public class BoardDelete {
public void boardDelete()
{
System.out.println("게시판 삭제 기능");
}
}
.
.
추상화 클래스
p375
다른 기능 클래스 모을 때 사용
메뉴 선택:
food
맛집 구현 완료...
public class MainClass {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("메뉴 선택: ");
String cmd = sc.next();
Container c = new Container();
Command cc = (Command)c.getBean(cmd);
cc.execute();
}
}
// 추상 클래스
public abstract class Command {
public abstract void execute(); // 메서드 선언
public void display()
{
System.out.println("메서드 구현");
}
}
public class Container {
// 조립 라이브러리
private Map map = new HashMap();
public Container()
{
map.put("member", new Member());
map.put("board", new Board());
map.put("food", new Food());
map.put("notice", new Notice());
map.put("recipe", new Recipe());
}
public Object getBean(String id)
{
return map.get(id);
}
}
public class Food extends Command {
@Override
public void execute() {
System.out.println("맛집 구현 완료...");
}
}
public class Recipe extends Command {
@Override
public void execute() {
System.out.println("레시피 구현 완료...");
}
}
.
.
인터페이스
클래스 → 인터페이스 상속 하지 않음
class A
interface B extends A (X)
interface A
interface B extends A → A, B
interface C extends B → A, B, C
interface A
interface B
interface C extends A, B // 다중 상속 가능
예제
1.
원을 그린다..
사각형을 그린다...
삼각형을 그린다...
// 클래스를 여러 개 묶어서 한 개의 이름으로 제어하기 위함
interface 도형
{
public void draw();
}
class 원 implements 도형
{
@Override
public void draw() {
System.out.println("원을 그린다..");
}
}
class 삼각형 implements 도형
{
@Override
public void draw() {
System.out.println("삼각형을 그린다...");
}
}
class 사각형 implements 도형
{
@Override
public void draw() {
System.out.println("사각형을 그린다...");
}
}
public class MainClass {
public static void main(String[] args) {
도형 a = new 원();
a.draw();
a = new 사각형();
a.draw();
a = new 삼각형();
a.draw();
}
}
2.
// interface 문법은 모든 메서드와 변수에 public이 자동 추가 됨
interface A
{
void display1(); // public abstract 생략
public void display2(); // abstract 생략
abstract void display3(); // public 생략
protected void display4(); // Error!! 모든 메서드 선언은 public만 가능
int a = 10; // Error!! 상수는 값을 주어야 함 → public final static 생략
final int b = 20; // public static 생략
static int c = 30; // public final 생략
public int d = 40; // static final 생략
private int e = 50; // Error!!
protected int k = 60; // Error!!
public static final int k = 60; // 정석으로 작성
}
interface B
{
void display();
default void click() {} // 작성 안하면 기존 인터페이스 수정 시 에러 남
static void mouseOut() {}
}
class C implements B
{
@Override
public void display() {
}
}
class D implements B
{
@Override
public void display() {
}
}
3.
interface A
{
public void displayA();
}
interface B
{
public void displayB();
}
class C implements A, B
{
@Override
public void displayB() {
}
@Override
public void displayA() {
}
}
public class MainClass {
public static void main(String[] args) {
A a = new C(); // displayA()
// → A가 가지고 있는 모든 데이터 사용한다
// → 단 메서드는 C 클래스에서 오버라이딩 메서드 사용한다
B b = new C(); // displayB()
C c = new C(); // displayA(), displayB()
}
}
4. 다중 상속 : swing 이용한 게임
public class GameFrame extends JFrame implements KeyListener, MouseListener{
private GameView view = new GameView();
public GameFrame()
{
add("Center", view);
setSize(800, 640);
setVisible(true);
// view.setFocusable(true);
addKeyListener(this);
}
public static void main(String[] args) {
new GameFrame();
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode())
{
case KeyEvent.VK_LEFT:
view.x-=5;
if(view.x < 0)
view.x = 800;
view.repaint();
break;
case KeyEvent.VK_RIGHT:
view.x+=5;
if(view.x > 800)
view.x = 0;
view.repaint();
break;
case KeyEvent.VK_UP:
break;
case KeyEvent.VK_DOWN:
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}
public class GameView extends JPanel {
private Image back;
private Image move;
int x = 30;
int y = 150;
public GameView()
{
back = Toolkit.getDefaultToolkit().getImage("c:\\javaDev\\back.jpg");
move = Toolkit.getDefaultToolkit().getImage("c:\\javaDev\\move2.gif");
}
@Override
public void paint(Graphics g) {
g.drawImage(back, 0, 0, getWidth(), getHeight(), this);
g.drawImage(move, x, y, 150, 100, this);
}
}