추상화

 

1. Abstract Methods 추상 메소드  (Override의 강제성을 주기위해 사용한다)

 1) 바디를 정의하지않는 메소드로 상속해 줄 수 있으며 이를 상속 받은 클래스는 반드시 재 정의 해야한다.(Overriding)

 public class AbstractDemo {
 public static void main(String[] args) {
  Jasic j = new Jasic();
  j.display();
 }
}

abstract class Bumo{  // abstract 메소드를 가지고있는 클래스 역시 absract로 선언.
 abstract void display(); // 바디를 정의하지않는 메소드는 앞에 abstract를 선언해야한다.
}
class Jasic extends Bumo{
 void display(){
  System.out.println("son");
 }
}

 

2. Abstract Class 추상 클래스

 1) new로 생성할 수 없다. (인스턴스화 할 수 없다, 메모리에 올릴 수 없다)

 2) abstract 메소드가 없는 정상적인 Class  역시 Abstract로 선언 할 수 있다.

 

3. Interface : implements로 상속(구현한다)받는다.

 1) public abstract static 을 생략한 클래스라고 생각하면된다.

 2) interface속의 변수는 public static final이 생략되어있다. 따라서 모두 초기화를 해야한다.

 3) interface의 메소드는 public abstract가 생략되어있다.

 4) interface의 하위클래스는 반드시 메소드 재정의 해야한다.

 5) extends를 먼저 선언한후 implements를 쓴다. 

 6) 하위 클래스에서 인터페이스의 메소드를 재정의할 때 반드시 public을 써야한다.

 7) Interface Type의 레퍼런스변수는 해당 인터페이스 리소스만 접근가능.

 8) Interface Type의 배열을 생성할 수 있는데, 이는 interface자식들의 주소를 받을 수 있는 수첩이다.

 9) Interface속에있는 변수는 클래스변수이기 때문에 interface이름으로 접근한다.

 

4. flag interface : 멤버가 하나도 없는 인터페이스

 1) ex : clone() 사용.

   - Cloneable : 모든 클래스가 값을 복사 할 수 있는 권한이 없다. 그래서 권환을 확인하는 인터페이스.

 public class CloneDemo {
 public static void main(String[] args) {
  Demo original = new Demo(5);
 // Demo copy = original; //주소복사
 // Demo copy = (Demo)original.clone(); //사용할 수 없음.
  Demo copy = original.copy();
 }
}
class Demo implements Cloneable{ // 멤버가 없는 인터페이스 이지만 상속 받을 경우 copy권한을 얻게된다.
 private int su;
 public Demo(int su){
  this.su = su;
 }
 public void set(int su){
  this.su = su;
 }
 public int get(){
  return this.su;
 }
 public Demo copy(){
  Object obj = null;
  try {
   obj=clone();
  } catch (CloneNotSupportedException e) {
   System.out.println("복제 실패함");
  }
  return (Demo)obj;
 } 
}

 

 

5. Package

 1) class를 묶는 단위. (보통 도메인을 사용하여 com.javasoft.lib.Demo 형식으로 작성한다)

 2) cmd 에서 컴파일 할 때 -d 옵션으로 경로를 설정해야한다.

 javac–d D:\project\first Employee.java

 3) 클래스 패스 설정 : 변경되지 않는 경로를 가지고있다면 환경변수에서 지정하면된다.

 4) jar 파일 만들기. (유닉스의 tar과 같다.)

   - 압축 상태의 클래스파일들을 사용할 수 있다.

   - jar파일의 경로를  import하여 사용 할 수 있다.

 5) eclipse 에서 외부 jar 가져오기.

   - 프로젝트 선택 마우스오른쪽 -> build path -> add Archive..

 6) 도스와 eclipse 환경에서의 Package 접근이 약간 다르다. (

 public class Resume {
 private int a =5;
 int b = 10; // default는 하위 클래스도 접근 불가능
 protected int c = 100;  //상속되며 하위 클래스를 통해 접근이 가능
 public int d =5000; //다른 패키지에서도 접근 가능.
}

 

 

6. Import static

import static java.lang.System.*;
import static java.lang.Math.*;  //or import static java.lang.Math.random    메소드뒤에 ()까지 쓰면 안된다.

public class StaticImportDemo {
 public static void main(String[] args) {
  out.println("hello,world");  //System 클래스를 import했기때문에 쓰지않아도 된다.
  int r = (int)(random()*10+1);
 }
}

 

 

  

 

 

 

ps-------------------------------------------------------------------------------------

1. absract 와 final은 상극

2. this()와 super()는 상극

3. shallow copy : 주소복사 / deep copy : 값복사

1. 객체지향의 주요 특성.
 1) 추상화 (Abstraction)
 2) 캡슐화 (Encapsulation)
 3) 상속화 (Inheritance)
 
 4) 다형성 (Polymorphism)
     1. Primitive Type
      1) implicit conversion
      2) explicit conversion
     2. Reference Type
      1) 서로 다른 객체는 강제적, 암시적 형변환 안된다.

 public class CastDemo {
 public static void main(String[] args) {
  Test td = new Test();
  Demo d = new Demo();
  td = (Test)d;  // 오류
 }
}

class Test{
 int su = 5;
}
class Demo{
 String name = "taehyung";
}


      2) 자식 --> 부모로 형변환 : 강제적, 암시적 모두 성공한다.
      3) 부모 --> 자식으로 형변환 : 강제적 형변환만 가능하고, 런타임 때 오류발생가능 (반드시 instanceof()로 검증해야한다.)

 public class CastDemo {
 public static void main(String[] args) {
  Test t = new Test();
  Demo d = new Demo();
  t = d;   //자동 형변환
  t = (Test)d;  // 강제 형변환
 }
}
class Test{
 int su = 5;
}
class Demo extends Test{  // 상속
 String name = "taehyung";
}

 public class CastDemo {
 public static void main(String[] args) {
  Test t = new Test();
  Demo d = new Demo();
  d = t;  // 자동 형변환 오류
  d = (Demo)t;  //강제 형변환은 된다
 }
}
class Test{
 int su = 5;
}
class Demo extends Test{
 String name = "taehyung";
}
 public class CastDemo {
 public static void main(String[] args) {
  Test t = new Test();
  Demo d = new Demo();
  if (t instanceof Demo) d = (Demo)t;
  else System.out.println("cannot");
 }
}
class Test{
 int su = 5;
}
class Demo extends Test{
 String name = "taehyung";
}
 자식 --> 부모  부모 -->자식  부모 --> 자식(instanceof())
 
 
 
 
ex) 포유류 형을 상속받은 개나 고양이 들의 형태를 다시 포유류로 형변환이 된다.

 void display(int choice){
  Mammal m = null;   // 경우에 따라 자식의 형태가 부모형으로 변환되어 들어간다.
  switch (choice) {
  case 1: m = new Dog();   break;
  case 2: m = new Cat();  break;
  case 3: m = new Korean();  break;
  case 4: m = new American();  break;
  default:System.out.println("누구냐 넌,"); break;
  }
  m.saySomething();  // 각 종족에 따른 울음소리를 실행하는 메소드

 

ex2) 카센터 자동차 수리

 public class CarCentar {
 public static void main(String[] args) {
  CarCentar cc = new CarCentar();
  Matiz m = new Matiz("마티즈");
  Carnival c = new Carnival("카니발");
  Sonata s = new Sonata("소나타");
  cc.repair(m);
 }
 void repair(Car c){   //부모형 변수에 자식들의 입력을 자동으로 받는다.
  if (c instanceof Sonata) { // 형태를 검사한다.
   System.out.println("현대차 ");
  }else if(c instanceof Matiz){
   System.out.println("대우차 ");
  }else if(c instanceof Carnival){
   System.out.println("기아차 ");
  }  
  System.out.println(c.getName()+" 수리완료!"); //들어온 형태에 상관없이 getName메소드를 사용할수있다.
 }
}

 

 

 

 

 

 

ps -------------------------------------------------------------------------------     

1. 1) tightly coupled(Early Binding) : 컴파일 때.

   2) loosely coupled(Late binding) : 런타임 때

 

 

2. Overriding 할 때 자식은 부모보다 권한이 작으면 안된다.

 private < default < protected < public

 

1. 객체지향의 주요 특성.
 1) 추상화 (Abstraction)
 2) 캡슐화 (Encapsulation)

 3) 상속화 (Inheritance)
  - 자바는 단일 상속으로 1개의 상위 클래스로부터 상속받을 수 있다. (역학 조사로 Maintanance에 좋지만 현실적으로 단일 상속을 사용하지 않는다. extends는 한번 사용하지만, 인터페이스(가상클래스)를 활용한다.)

 

C++ 

Java 

C# 

부모

 Base

Super 

base 

 표현

  :

 extends 

 

 자식

 Derived

 다중상속

 sub

단일상속

 

 

 
  - TwoD extends ThreeD : 생성자로 TwoD를 생성할때 먼저 부모클래스인 ThreeD를 메모리 heap에 올린다.
  - 자식 주소로 부모를 접근하면 상속, 부모 주소로 자식을 접근하면 다형성 이다.
  - class와 class, interface와 interface 간에는 extends, class와 inteface는 implements(동종간에는 extends,이종간에는 implements)
  - 관계    
    i) "is a"  : ex) 오토바이 -> 탈것
    ii) "has a"  ex) 주방 -> 냉장고
  - 상속이 되지 않는 것.
    i) private 선언 된 것은 상속되지않는다.
    ii) static 역시 상속되지 않는다.
    iii) 생성자는 상속되지 않는다.
       - 자식이 부모를 생성하려면 this메소드와 같은 형식의 super()를 사용한다. (마찬가지로 첫줄에 쓴다)
    iV) Overshadow 변수(클래스 변수와 같은 이름의 변수를 사용), Override 메소드 는 상속되지않는다. 자식 것을 쓴다.
       - super()를 사용하여 해결 할 수 있다.
       - String 형은 자체적으로 static 이기 때문에 this()나 super()이용해 접근할 수 없다.
 4) 다형성 (Polymorphism)

 
 
 
ps.----------------------------------------------------------------------------------------
- Object는 모든 객체들의 필수 요소의 집합이다. (원형이다.)
 
- 객체 비교에 대하여
   1. ==, !=
     1) value type -> 값비교, (su==num)
     2) Reference type -> 주소비교
     3) String type --> 값비교(new 없을 때), 주소비교(new 사용) //보통 String은 equals()를 사용한다.
   2. equals()
     1) value type --> 해당없음 (su.equals(num))
     2) Reference type --> 주소비교
     3) String type --> new와 관계없이 값비교
 

1. class

 1) 분류라는 의미의 Classification에서 왔다.

 2) Data와 Functions을 가지고있는 데이터 구조(Data structure)이다.


2. object

 1) 속성(property, state, attribute) : variable constants

 2) 행위(behavior) : method


3. 객체지향의 주요 특성.
 1) 추상화 (Abstraction) : 모델링 과정

 2) 캡슐화 (Encapsulation) : 중요한 부분을 외부로인한 접근과 변경으로부터 보호하기위함.
  - MS : Visibility(은닉)
  - Java : Accessibility(접근) : public / private
  - get/set : private 변수에 접근하기 위해 셋터와 겟터를 이용한다.
  - this : 멤버변수를 사용 (지역변수와 멤버변수명이 같을 때 멤버변수를 지칭하기위해 사용한다.)
 


 3) 상속화 (Inheritance)
 4) 다형성 (Polymorphism)

4. 생성자 : Allocating memory 
 1) 멤버 변수의 초기화는 생성자가 해야 한다.
 2) 특별한 메소드이다. : 기본적으로 생성자 메소드는 생략되어있다. : 
  - 리턴타입이 없다. 
  - 이름이 정해져있다(클래스이름)
  - new 와 함께만 사용할 수 있다.
 3) 정의 된 기본 생성자를 새로 정의 하는것 : 오버라이딩 (Overriding) 

public class ConstructorDemo2 {

public static void main(String[] args) {

Person1 p = new Person1("김태형", 27, 100.0);

Person1 p1 = new Person1("마이클", 28);

}

}

 public class Person1 {

private String name;

private int age;

private double salary;

public Person1(String name, int age, double salary){ // 기본 생성자의 오버라이딩.

this.name = name;

this.age = age;

this.salary = salary;

}

public Person1(String name, int age){ // 오버로딩

this.name = name;

this.age = age;

}

}

 기본 생성자의 경우는 오버라이딩(Overriding)과 오버로딩(Overloading) 모두 다 필요할 때가 있다.



4) this메소드

  - 생성자 내부에서 생성자를 호출 할 때 사용하는 것으로, this메소드는 생성자 안에서만 사용해야하며 블록의 첫줄에 써야한다.

 public class Person2 {

private String name;

private int age;

public Person2(){

//System.out.println("나 기본생성자.");

this("unknown",19);

}

public Person2(String name){this(name,19);}

public Person2(int age){this("unknown",age);}

public Person2(String name, int age){

this.name = name; this.age = age;

}

publi void main(String[] args){

Person2 p = new Person2();

}

}

 생성자 내에서 생성을 하면 또다른 주소가 생성되기 때문에 사용 할 수 없다. 그래서 this메소드를 사용한다.

ex)






ps.-------------------------------------------------------------
- main 함수가 없는 클래스는 스스로 단위 test(JUnit)를 통해 문제가 있는지 검사하게 된다. 
- 터미널에서 직접 컴파일을 할 경우 main 함수가 없는 클래스 부터 컴파일을 해야했지만 현재는 main함수가 포함된  클래스만 컴파일 해도 자동으로 모든 클래스 들을 컴파일을 해 준다.
- System.exit(-1);  //자바 프로그램 강제종료
- Java SE 에서 String Parsing 하는 방법 3가지
  1) String.split();
    - 
  2) java.util.StringTokienizer class
  3) Scanner class

 for (int i = 0; i < this.array.length; i++) {

String line = this.scan.nextLine().trim();

String [] array = line.split("\\s+");  //+는 1번 스페이스가 1개 이상이면 짜른다. ?는 0또는 1개, *는 0번 또는 1번이상(모두) 


'Programming > JAVA' 카테고리의 다른 글

자바 객체지향의 특징3 (다형성,Overriding)  (0) 2011.03.24
자바 객체지향의 특징2 (상속화)  (1) 2011.03.24
자바 메소드(method)  (3) 2011.03.24
자바 배열이란?  (2) 2011.03.24
자바 제어문(조건/반복/분기)  (2) 2011.03.24

+ Recent posts