수업

+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);
	}
}