728x90

상위 클래스 변수로 하위 객체 처리 할 수 있다.
------------------------------------------------------------------------
예제 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


+ Recent posts