Class & Method 심화
Implements 다중 구현
interface InterA {
public void draw();
public void write();
}
interface InterB {
public void play();
}
class Impl implements InterA,InterB{
@Override
public void play() {
System.out.println("축구를 합니다");
}
@Override
public void draw() {
System.out.println("그림을 그립니다");
}
@Override
public void write() {
System.out.println("일기를 씁니다");
}
}
- implements는 다중 구현 가능 but 이 경우 부모 인터페이스가 많기 때문에 다형성의 효용 떨어짐
이중 상속
interface InterAA {
public void eat();
public void go();
}
interface InterBB extends InterAA{
public void ride();
class InterImpl2 implements InterBB{
@Override
public void eat() {
System.out.println("저녁을 먹어요");
}
@Override
public void go() {
System.out.println("롯데월드 가요");
}
@Override
public void ride() {
System.out.println("자전거 타고 놀아요");
}
}
- 이중 상속(interface → interface → class)
public class InterExtends_03 {
public static void main(String[] args) {
InterImpl2 inter=new InterImpl2();
inter.eat();
inter.go();
inter.ride();
InterBB inter1=new InterImpl2();
inter1.eat();
inter1.go();
inter1.ride();
}
}
- 최하위 class 생성 호출(일반 호출), 중간 부모 interface 생성 호출(다형성)
다형성 활용 #1(배열로 class 생성)
abstract class Game {
abstract void play();
abstract void stop();
}
class SungHyeon extends Game{
@Override
void play() {
System.out.println("성현이가 게임을 합니다");
}
@Override
void stop() {
System.out.println("성현이가 게임을 종료합니다");
}
}
class SunYeong extends Game{
@Override
void play() {
System.out.println("순영이가 게임을 합니다");
}
@Override
void stop() {
System.out.println("순영이가 게임을 종료합니다");
}
}
class SunBum extends Game{
@Override
void play() {
System.out.println("선범이가 게임을 합니다");
}
@Override
void stop() {
System.out.println("선범이가 게임을 종료합니다");
}
}
public class ArrConst_04 {
public static void main(String[] args) {
Game [] game=new Game[3];
game[0]=new SungHyeon();
game[1]=new SunYeong();
game[2]=new SunBum();
for(int i=0;i<game.length;i++)
game[i].play();
for(int i=game.length-1;i>=0;i--)
game[i].stop();
}
}
- 배열로 각 class 생성 & for로 각 method 호출
- 배열로 생성하기 위해서는 변수가 단일해야 하므로 다형성 생성이 적절함
- for문으로 정리하기 위해서는 배열변수가 하나여야 하므로 다형성 생성이 적절함
다형성 활용 #2(
import java.util.Scanner;
interface Board {
public void process();
}
class Insert implements Board{
@Override
public void process() {
System.out.println("게시판에 게시물을 추가합니다");
}
}
class Select implements Board{
@Override
public void process() {
System.out.println("게시판에 게시물을 조회합니다");
}
}
class Update implements Board{
@Override
public void process() {
System.out.println("게시판에 게시물을 수정합니다");
}
}
class Delete implements Board{
@Override
public void process() {
System.out.println("게시판에 게시물을 삭제합니다");
}
}
- 부모 interface Board로부터 4개의 class가 상속 받음
public class BoardCRUD_05 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Board board=null;
int n;
exit:while(true)
{
System.out.println("1.추가 2.조회 3.수정 4.삭제 9.종료");
n=sc.nextInt();
- 부모 interface Board로부터 호출하기 위해 참조변수 board 선언(초기값 배정을 위해 =null 선언)
switch(n)
{
case 1:
board=new Insert();
break;
case 2:
board=new Select();
break;
case 3:
board=new Update();
break;
case 4:
board=new Delete();
break;
case 9:
System.out.println("종료합니다");
break exit;
default:
System.out.println("잘못입력했어요");
}
if(n<=4)
board.process();
}
}
}
- case 9:의 경우 프로그램 종료를 위해 while(true)문을 빠져나가야 하므로 label(exit) 추가
- switch문의 각 case마다 변수를 따로 두어 각 class를 생성하지 않기 위해서 다형성이 적절함
Inner Class(내부 클래스)
class Outer {
String name="이민규";
int age=22;
class Inner {
public void disp() {
System.out.println("Inner내부 클래스");
System.out.println(name+","+age);
}
}
class Inner2 {
public void disp2() {
System.out.println("Inner2내부 클래스");
System.out.println(name+","+age);
}
}
public void write() {
Inner in1=new Inner();
in1.disp();
Inner2 in2=new Inner2();
in2.disp2();
}
}
- Inner Class에서 Outer Class의 변수 사용 가능 & Outer Class에서 Inner Class 선언 후 method 사용 가능
- 특정 class 내에 다른 class 정의
- 하나의 멤버처럼 사용 가능
- 상속은 하나밖에 못 받는 단점을 보완
public class InnerClass_12 {
public static void main(String[] args) {
Outer outer=new Outer();
outer.write();
Outer.Inner in1=new Outer().new Inner();
in1.disp();
Outer.Inner2 in2=outer.new Inner2();
in2.disp2();
}
}
Annoymous Inner Class(익명 내부 클래스)
abstract class AbstEx {
abstract public void show();
}
class OuterEx {
AbstEx ab=new AbstEx() {
@Override
public void show() {
System.out.println("익명내부 클래스");
}
};
}
- 익명 내부 클래스는 몸통부의 중괄호 뒤에 세미콜론 붙임( { }; )
public class Annonymous_13 {
public static void main(String[] args) {
OuterEx ex=new OuterEx();
ex.ab.show();
}
}
Swing
public class SwingLay_09 extends JFrame{
Container cp;
public SwingLay_09(String title) {
super(title);
cp=this.getContentPane();
this.setBounds(200, 100, 150, 290);
cp.setBackground(new Color(120,120,20));
setVisible(true);
}
public static void main(String[] args) {
new SwingLay_09("레이아웃 이벤트");
}
}