상위 클래스 변수로 하위 객체 처리 할 수 있다.
------------------------------------------------------------------------
예제 1
------------------------------------------------------------------------
import java.awt.*;
import java.awt.event.*;
class Extends_5 extends Frame
{
public Extends_5()
{
super("연습");
addWindowListener(new MyWin()); //이벤트 등록
}
//inner 클래스---------------------------------
class MyWin extends WindowAdapter
{
public void windowClosing(WindowEvent w) // WindowAdpater를 상속해서 오버라이딩
{
System.exit(0);// 프로그램 종료
}
}
//inner 클래스----------------------------------
public static void main(String args[])
{
Frame f = new Extends_5(); // 상위 클래스 변수로 하위 객체 처리 가능
f.setBounds(200,200,300,300);//창 위치, 크기
f.setVisible(true);
}//main
}// Extends_5
------------------------------------------------------------------------
예제 2
------------------------------------------------------------------------
class PanMae
{
protected String pum;
protected int su;
protected int dan;
public PanMae(String p, int s, int d)
{
pum = p;
su = s;
dan = d;
}
public void disp()
{
System.out.println(pum + " "+ su +" "+ dan);
}
}
class SalePanmae extends PanMae
{
private double rate; //할인율
public SalePanmae(String pum, int su, int dan, double rate)
{
super(pum,su,dan);
this.rate = rate;
}
//Overriding
public void disp()
{
System.out.println(pum + " " + su + " " + dan + " " + (int)(dan*(1-rate)));
}
}
class Extends_6
{
public static void main(String args[])
{
PanMae p[] = new PanMae[4];
p[0] = new PanMae("사과",3,200);
p[1] = new SalePanmae("수박",5,10000, 0.02);
p[2] = new PanMae("it's",7,1000);
p[3] = new SalePanmae("새우깡",10,700,0.03);
for(int i = 0; i<4; i++)
{
p[i].disp();
}
}
}
------------------------------------------------------------------------
클래스 형변환(casting)
------------------------------------------------------------------------
예제 1
------------------------------------------------------------------------
/*
상위 클래스 변수로 하위 객체 처리
클래스 캐스팅
*/
class PanMaeSuper
{
protected String pum;
protected int su;
protected int dan;
//public PanMaeSuper(){}
public PanMaeSuper(String p, int s, int d)
{
pum = p;
su = s;
dan = d;
}
public void disp()
{
System.out.println(pum + " " + su + " " + dan);
}
}
class SalePane extends PanMaeSuper
{
private double rate;
//public SalePane(){}
public SalePane(String pum, int su, int dan, double rate)// constructor
{
super(pum,su,dan);
this.rate = rate;
}
public void disp() // Overriding
{
System.out.println(pum + " " + su + " " + dan + " " + dan*(1-rate));
}
public void halinAk()
{
System.out.println("할인액 : " + dan*rate);
}
}
class CastingTest_2
{
public static void main(String args[])
{
PanMaeSuper p[]= new PanMaeSuper[4];
p[0] = new PanMaeSuper("감자깡",10,700);
p[1] = new SalePane("새우깡",12,700,0.02);
p[2] = new PanMaeSuper("It's",3,1000);
p[3] = new SalePane("틴틴",5,1000,0.03);
//p[1],[3]의 자료형이 PanMaeSuper 이므로 SalePane 생성자를 PanMaeSuper에서 찾는다.
//그러므로 오류메시지가 can not find symbol
for(int i = 0 ; i<p.length ; i++)
{
p[i].disp();
if(p[i] instanceof SalePane) // SalePane클래스 객체 일때 캐스팅
{
((SalePane)p[i]).halinAk();
}
}
}
}
------------------------------------------------------------------------
인터페이스와 추상클래스
인터페이스
- 인터페이스는 추상클래스의 일종이다.
- 추상클래스는 일부 내용 있는 메서드를 포함하고 있지만, 인터페이스는 모든 메서드가 추상이다.
- 인터페이스의 메서드는 항상 public 이다, 접근 제한자를 생략하더라도 public 이다.
- 인터페이스의 필드는 항상 final static 으로 상수만이 허용된다.
- 추상클래스는 추상메서드가 하나 이상 존재해야 한다.
- 추상클래스는 일반 메서드와 추상메서드가 함께 있는 경우
- 생성자, static 메서드, private 메서드, 는 추상화 될 수 없다.
ex) 추상 메서드
-> public void aa(); // 내용이 없고 선언만 되어 있는 것.
- final 변수 : 변수를 상수화 시킨다( 값 변경 불가능)
- final 메서드 : 재정의 불가능
- final 클래스 : 확장(상속)이 불가능
- final 클래스의 모든 메서드는 final을 명시하지 않아도 묵시적으로 final로 인식한다.
- 추상클래스는 객체 생성할 수 없다. 왜냐면 호출될 메서드가 구현되지 않은 것일 수 도 있기 때문에(추상 메서드)
interface 와 abstract 클래스 비교
---------------------------------------------------------------------------------
interface abstrict
-------------------------------------------------------
키워드 interface abstrict
---------------------------------------------------------------------------------
메서드 public 리턴형 메서드명(); 일반메서드 : public 리턴형 메서드명(){내용}
추상메서드 : public 리턴형 메서드명()
---------------------------------------------------------------------------------
다중상속 가능 불가
---------------------------------------------------------------------------------
변수 final static 프로그래머 마음대로 사용가능
(상수형 변수)
----------------------------------------------------------------------------------
인터페이스 정의 형식
---------------------
interface 인터페이스명
{
final static 변수
추상메서드();
}
---------------------
- interface를 클래스에서 상속받아, 메서드 재정의(Overriding)를 한다.
------------------------------------------
class 클래스명 implements 인터페이스명
{
재정의(Overridnig)
}
------------------------------------------
상수형 변수는 대문자로 쓴다.
ex) MAX_VALUE
------------------------------------------------------------------------
예제 1
------------------------------------------------------------------------
interface AA
{
int a = 100;// final static
int aa();// 추상 메서드
}// 인터페이스
interface BB
{
double b = 300.0; // final static
double bb();// 추상 메서드
}
interface CC extends AA, BB
{
boolean cc(); // abstruct method
}
class DD implements CC
{
//인터페이스 메서드는 모두 오버라이딩 해야함.
// 왜? 모두가 추상 메서드라서
public int aa()
{
return 1000;
}
public double bb()
{
return 200.7;
}
public boolean cc()
{
return true;
}
}
class InterfaceTest_1
{
public static void main(String args[])
{
DD D = new DD();
System.out.println(D.a);
System.out.println(D.b);
System.out.println(D.aa());
System.out.println(D.bb());
System.out.println(D.cc());
}// main
}// InterfaceTest_1
------------------------------------------------------------------------
예제 2
------------------------------------------------------------------------
/*
인터페이스 예제
*/
interface AA2
{
int aa();
}
class BB2 implements AA2
{
public int aa() //Overriding
{
return 100;
}
}
class CC2 implements AA2
{
public int aa()// Overriding
{
return 200;
}
}
class InterfaceTest_2
{
public static void main(String args[])
{
System.out.println(new BB2().aa());//객체 생성하고 바로 메서드 호출
System.out.println(new CC2().aa());
}
}
------------------------------------------------------------------------
예제 3
------------------------------------------------------------------------
/*
인터페이스 예제
*/
interface AA3
{
int a = 100;
int aa();
}
interface BB3 extends AA3
{
double b = 345.7;
double bb();
}
interface CC3 extends BB3
{
char ch = 'A';
char cc();
}
class InterfaceTest_3 implements CC3
{
// Overriding
public int aa() { return 1000;}
public double bb() {return 200.9;}
public char cc() { return 'B';}
public static void main(String args[])
{
CC3 C = new InterfaceTest_3(); //상위 클래스 변수로 하위 객체 처리
if(C instanceof AA3)
{
System.out.println(C.a);
System.out.println(C.b);
System.out.println(C.ch);
System.out.println(C.aa());
}
}
}
추상클래스
------------------------------------------------------------------------
예제 1
------------------------------------------------------------------------
abstract class Abs
{
abstract int aa();
public void disp()
{
System.out.println("추상 클래스 내의 일반 매서드");
}
}
class BB extends Abs
{
public int aa()// Overriding
{
return 100;
}
}
class CC extends Abs
{
public int aa()
{
return 200;
}
}
class AbstractTest_1
{
public static void main(String args[])
{
System.out.println(new BB().aa());
System.out.println(new CC().aa());
new BB().disp();
new CC().disp();
}
}
------------------------------------------------------------------------
예제 2
------------------------------------------------------------------------
abstract class Abs2
{
String name;
public Abs2(String na)
{
name =na;
}
abstract public void disp();// 추상 메서드..
// 인터페이스 안에 있는 메서드는 모두 추상 메서드라 메서드 앞에 abstract 안 붙여도 됨
public void kk()
{
System.out.println("추상 클래스 내의 일반 메소드");
}
}
class AbstractTest_2 extends Abs2
{
public AbstractTest_2(String na)
{
super(na);
}
// Overriding
public void disp()
{
System.out.println("추상 메서드 오버라이딩");
System.out.println("Name:" + name);
}
public static void main(String args[])
{
AbstractTest_2 A = new AbstractTest_2("길동");
A.disp();
A.kk();
}
}
------------------------------------------------------------------------
패키지(package)
- 기능이 유사한 class나 interface를 모아 놓은것.
- class 이름상 충돌을 방지 시켜준다.
- 패키지는 여러 클래스, 인터페이스의 집합체로서 package문으로 선언한다.
- 패키지 이름은 소문자
------------------------------------------------------------------------
예제 (패키지 만들기)
------------------------------------------------------------------------
Product.java
package prod;
public class Product //클래스 public선언 안그러면 ProductTest 클래스에서 접근 못함..
{
double displacement = 1000.0;
int price = 1500;
public void disp()
{
String str = "자동차 정보 입니다 ";
System.out.println(str);
System.out.println("배기량 :"+displacement+ "cc");
System.out.println("가격 :"+price);
}
}
------------------------------------------------------------------------
저장하고
- 도스창에서 javac -d *.java //-d 자동패키지 만드는 명령
그러면 해당 폴더에 prod 폴더가 생성되고 그 곳에 Product.class 파일이 생긴다.
------------------------------------------------------------------------
ProductTest.java
import prod.Product;
class ProductTest
{
public static void main(String args[])
{
Product A = new Product();
A.disp();
}
}
------------------------------------------------------------------------
실행결과 : 자동차 정보 입니다
배기량 :1000.0cc
가격 :1500
------------------------------------------------------------------------
예제2
------------------------------------------------------------------------
Product2.java
package cc.dd;
public class Product2
{
public void disp()
{
System.out.println("product2 하하");
}
}
------------------------------------------------------------------------
javac -d . Product2.java
그러면 해당 폴더에 cc 폴더가 생성되고 cc폴더 안에 dd 폴더 생성 dd폴더에 Product.class 파일이 생긴다.
------------------------------------------------------------------------
ProductTest_2.java
import cc.dd.Product2;
class ProductTest_2
{
public static void main(String args[])
{
Product2 A = new Product2();
A.disp();
}
}
------------------------------------------------------------------------
실행결과 : product2 하하
------------------------------------------------------------------------
예제3 (protected)
------------------------------------------------------------------------
PanMae.java
package cc.dd.panmae;
public class PanMae
{
//필드
protected String pum; //protected
protected int su;
protected int dan;
public PanMae(String p, int s, int d)
{
pum = p;
su = s;
dan = d;
}
public void disp()
{
System.out.println(pum+"~~"+dan);
}
}
------------------------------------------------------------------------
javac -d . PanMae.java
cc\dd\panmae 폴더에 PanMae.class 파일 확인
------------------------------------------------------------------------
SalePanMae.java
package cc.dd.panmae;
public class SalePanMae extends PanMae
{
private double rate;
public SalePanMae(String p, int s, int d, double rate)
{
super(p,s,d);
this.rate = rate;
}
public void disp()
{
System.out.println( pum + " " + su + " " + dan + " " + dan*(1-rate));
}
}
------------------------------------------------------------------------
javac -d . PanMae.java
cc\dd\panmae 폴더에 SalePanMae.class 파일 확인
------------------------------------------------------------------------
PanMaeTest.java
import cc.dd.panmae.PanMae;
import cc.dd.panmae.SalePanMae;
class PanMaeTest
{
public static void main(String args[])
{
SalePanMae A = new SalePanMae("새우깡",5,700,0.02);
A.disp();
}
}
------------------------------------------------------------------------
실행결과 : 새우깡 5 700 686.0