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


728x90

주석 프로그래머가 참고할 내용을 기재, 실행하고는 무관하다.
//참고내용
/*  참고내용  */

개행문자
  \n => new line (줄만 바꿈, 커서위치 그대로)
     ex)  kim
                lee
                    kook

  \r => carrgae return ( 커서를 그 줄의 처음으로 위치시킨다. )
  \t => 일정 간격을 띄운다 (보통 8칸)
   보통 \n\r을 같이 쓴다...

OOP의 4대특징
 1. 캡슐화 ({}) ,은닉화 (클래스 내용은 모르고 사용법만 아는것... 사용자는 복잡하게 알 필요가 없다.)
 2. 상속성(모든 클래스는 Object 클래스를 상속받는다.)  class Test8 extends Object
 3. 다형성
     overloading - 하나의 클래스 안에 같은 이름의 메소드가 여러개 존재하는것. ( 구분은 매개변수로 가능)
     overriding -  상속받은 메서드 내용을 재정의
 4. 추상화 : 복잡한 것(개발자 입장)을 단순화(사용자 입장) 시키는 것.

명령줄인수

  자바 응용프로그램에는 main()이라는 정적 메소드를 포함하고 있다.
  이 메서드는 String 객체배열 인수한개를 받는다. 
  이 객체들은 사용자가 명령줄에 입력할 수 있는 모든 인수를 표현한다.
  명령줄 인수의 갯수는 int형으로 args.length 를 통해 구할 수 있다.
  인수는 args[0]args[1] args[2] 순으로 읽어 들여 진다.
--------------------------------------------------------------
class CmdLineArg_1
{
 public static void main(String args[])
 {
  System.out.println("인수갯수 : " + args.length);
  System.out.println("args[0] =>"  + args[0]);
  System.out.println("args[1] =>"  + args[1]);
  System.out.println("args[2] =>"  + args[2]);
 }
}
-------------------------------------------------------------
  실행(도스창에서) C:\_java\01_java\02>java CmdLineArg_1 kim lee park
  실행(jpadpro)  실행버튼 누른후 using application parameters에 다가 인수를 넣어도 된다.
    인수갯수 : 3
     args[0] =>kim
     args[1] =>lee
     args[2] =>park

  이 방법은 매개변수에 숫자를 입력해도 숫자를 문자로 인식한다..

  문자를 숫자로 변환하는 방법
--------------------------------------------------------------------
class CmdLineArg_2
{
 public static void main(String args[])
 {
  int a = Integer.parseInt(args[0]);
  int b = Integer.parseInt(args[1]);

  
  System.out.println("a :"+a);
  System.out.println("b :"+b);
  System.out.println("합:"+(a+b));
 }
}
---------------------------------------------------------------------
실행결과
  C:\_java\01_java\02>java CmdLineArg_2 10 20
  a :10
  b :20
  합:30

 숫자를 문자로 변환하는 방법   ->    ""+7 

class

- class란 객체지향 프로그램에서 가장 기본이 되는 클래스를 정의하는 키워드(예약어)
- 자바프로그램은 클래스를 하나 이상 가지게 된다.
- 주 클래스는 main()이 포함되어 있는 것을 말한다.
- 주 클래스 이름이 프로그램 이름이 된다(저장이름)

main 메소드
 - 자바 프로그램 실행시 최초로 수행되는 메서드 이다.
 - 자바에서는 함수라는 이름대신 메서드라는 말을 사용한다.
 - public : 접근 제한자
 - static : 이 클래스 내에 main()를 소속시킨다.  static은 메인함수 메모리 해제시에 같이 헤제된다.
 - main() 호출은 java.exe 실행시 JVM이 호출한다.
 - main()는 항상 다음과 같은 형식으로 써야 한다. 
    public static void main(String args[]) {}

접근 제한자
----------------------------------------------------------------
접근 제한자      같은 클래스      같은 패키지     상속관계    관련없는클래스 
---------------------------------------------------------------- 
 public                0                     0                0                  0         // 어디서나 접근가능
 protected           0                     0                0                  x         //자신의 클래스와, 파생클래스에서만 접근가능
 생략할경우           0                     0                x                  x         //같은 패키지 내에서, 같은 폴더에서만 사용가능함
 private               0                     x                x                  x         //자산의 클래스 내에서만 사용가능
----------------------------------------------------------------
    * 변수는 private으로 메서드는 public 으로 선언을 권유한다.

 1.private      :  자신의 클래스 내에서만 접근 가능
 2.생략(packge) : 같은 패키지 내에서 접근 가능
 3.protected    : 자신의 클래스와 파생 클래스 에서만 접근 가능
 4.public       : 어디서나 접근 가능

  전역변수 : 메서드 외부, 클래스 내부에 선언된 변수
  지역변수 : 메서드 내부에서 선언한 변수

---전역변수에서 ---
  은폐필드 : private 으로 선언된 필드(변수)
  보호필드 : protected  으로 선언된 필드
  공개필드 : public 으로 선언된 필드

예제 1
-----------------------------------------------------------
class VariScope
{
 static int global;// 전역변수
 
 public static void mm(){
  int local = 123;
  global = 456;
  System.out.println(local);
  System.out.println(global);
  
 }
 public static void main(String argsp[])
 {
  int local = 100;
  
  mm();
  
  System.out.println(local); // local -> 100; mm함수의 지역변수랑 혼동 하지 말것.
  System.out.println(global);
 }
}
-----------------------------------------------------------
예제 2
-----------------------------------------------------------
class PanMae
{
 public String pum;  //어디서나 사용가능
 int su; //생략은 같은 패키지(폴더) 내에서만 접근 가능
 private int dan; // 은폐필드, 자신의 클래스 에서만 사용가능
 
 public PanMae(String pum, int su, int dan){   //생성자  
  this.pum= pum;
  this.su = su;
  this.dan = dan;
 }
 public void disp(){
  System.out.println(pum + "~~~~" + su + "~~~~" + dan);
 }
}

class VariScope_2
{
 public static void main(String args[])
 {
  PanMae A =new PanMae("사과",2, 2000);  //객체 생성시 생성자 호출
  A.disp();
  
  A.pum = "감"; //공개필드에서는 서로 무관한 클래스에서도 사용가능
  A.disp();
  
  A.su = 100; //같은 패키지라서 접근 가능하다.

  A.disp();
  
  // A.dan = 500; // Error!!!    private 이라서 접근 불가

  A.disp();  
 }
}
-----------------------------------------------------------


자료형

기본 자료형     - 수치 자료형 - 정수 자료형 byte -> 1byte
                                                        char -> 1byte
                                                        short -> 2byte
                                                        int -> 4byte
                                                        long -> 8byte

                                      - 실수 자료형 float -> 4byte
                                                        double -> 8byte

                    - 논리 자료형 - boolen  - true or false

레퍼런스 자료형  - 클래스    ex) String은 원래 클래스이나.. 자료형처럼 사용가능..
                       - 인터페이스
                       - 배열
  byte < short  = char < int < long < float < double

식별자 Identifier

식별자는 변수명, 메서드명, 클래스명, 상수명 등을 말한다.
변수명 : 데이터를 넣을 기억장소

 *변수이름을 만드는 규칙
   1. 영문자, 숫자 조합하여 사용 (첫문자가 숫자불가능)
   2. 키워드(예약어)는 사용할 수 없다.
   3. 공백사용 불가.
   4. 특수문자 사용불가 (단, _,$ 는 사용가능)
       예)  int $a = 20;
             int _a = 30;
  Literal 상수 ==> 데이터
   1. 정수상수 ( 10 , 10L, 0xA, 014)  default - int형
   2. 실수상수 ( 12.4, 12.5f, 12.E+01) default  - double형
   3. 문자상수 ( 'A', '1', '\n')
   4. 문자열상수 ("A", "ABC")

int i =10;
i+"" =>문자열로 변환됨
i+'' =>code값으로 변환됨
i+'A' =>code값으로 변환됨

형변환

자동 형변환
  double d = 12.5f;
  long a =10;
  큰 자료형으로 변환된다.

강제 형변환(casting)
  float b = (float)12.5;   //double형 12.5을  float 으로 강제 형변환
  char ch = (char)65; 

전역변수와 지역변수
  전역변수 : 클래스안, 메서드 밖에서 선언된 변수   ->  값을 안넣어주면 자동으로 1로 초기화
  지역변수 : 메서드 안에서 선언된 변수                ->  자동초기화 안됨

--------------------------------전역변수----------------------------------
class Test{
 int a;
 char ch;
 double d;
 String str;
 Boolean b;
 //전역변수 초기화 x
 public void disp()
 {
  System.out.println("a:" +a);
  System.out.println("ch:" +ch);
  System.out.println("d:" +d);
  System.out.println("b:" +b);
  System.out.println("str:" +str);
 }
}

class VarTest_5
{
 public static void main(String args[])
 {
  Test A = new Test();
  A.disp();
 }//end main
}// end class
-------------------------------------------------------------------------

결과값:  a:0
           ch:
           d:0.0
           b:null
           str:null



----------------------------지역변수--------------------------------------
class Test2
{
 public void disp()
 {
  //지역변수 초기값 x
  int a;
  double d;
  String str;

  System.out.println("a:"+a);
  System.out.println("d:"+d);
  System.out.println("str:"+str);
 }
}
class VarTest_6
{
 public static void main(String []args)
 {
  
 }
}
---------------------------------------------------------------------------

오류메시지 : 
     variable a might not have been initialized
     variable d might not have been initialized
     variable str might not have been initialized


+ Recent posts