Class & Method 심화

Implements 다중 구현

interface InterA {
	public void draw();
	public void write();
}

interface InterB {
	public void play();
}
  • interface 두 개를 정의
class Impl implements InterA,InterB{ //2개의 인터페이스를 구현하는 클래스

	@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];
		//각각의 sub로 생성
		game[0]=new SungHyeon();
		game[1]=new SunYeong();
		game[2]=new SunBum();
		//for(증가)
		for(int i=0;i<game.length;i++)
			game[i].play();
		//for(감소)
		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;
					//System.exit(0); //억지로 종료
				default:
					System.out.println("잘못입력했어요");
					//break;
			}
			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();  //Inner내부 클래스\n이민규,22\nInner2내부 클래스\n이민규,22
		
		//다른클래스 통하지 않고 직접 내부클래스 메소드 호출하려면
		Outer.Inner in1=new Outer().new Inner();
		in1.disp();     //Inner내부 클래스\n이민규,22
		
		Outer.Inner2 in2=outer.new Inner2();
		in2.disp2();                                //Inner2내부 클래스\n이민규,22
	}
}
  • 내부 클래스의 method 선언은 외부를 통해서만 가능
  • 선언 command #1 : (외부class).(내부class) (참조변수)=new (외부class)( ).new (내부class)( );
  • 선언 command #2 : 참조변수를 통해 외부 class 생성 후
                                  (외부class).(내부class) (참조변수)=(외부 참조변수).new (내부class)( );

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();
	}
}
  • 외부 클래스를 통해 내부 클래스에 진입 후 메서드를 호출
  • command : 참조변수를 통해 외부 class 생성 후
                    (외부 참조변수).(익명 내부 class의 참조변수).(익명 내부 class의 method);

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

		//setDesign(); //디자인 구현

		setVisible(true);
	}
	
	public static void main(String[] args) {

		new SwingLay_09("레이아웃 이벤트");
	}
}
profile
초보개발자

0개의 댓글