Android/자바 특강.

특강 4일차 - 상속과 다형성 대해서.

gandus 2010. 7. 1. 11:58

상속


class Car{}
class SportCar extends Car {}    - > Car 를 상속받게 된다.


하지만 부모 클래스가 서브 클래스 보다 더 상위에 존재한다. -> 다형성을 이용할때 중요한 개념이다.


클래스를 만들기전에 먼저, 공통이 되는 부분을 먼저 만들어 주고, 그 하위에
추가적으로 만들어 주는게 좋다     -> 확장성이 좋아진다.


매소드 재정의 (오버라이딩)
 - Car 클래스에 매소드를  SportCar 에서 바꿔준다.  헝태는 동일하게 해야한다.

동물 클래스에선 public void makeSound(){}
- > 개 클래스에서 오버라이딩 하면  public void makeSound(){ System.out.println("멍멍"); }
 반드시 함수의 형식은 동일해야한다.     - > 재정의 해도 원본은 감춰져있다. 개 클래스에선 매소드를 2개를 가짐.


Super 키워드 - > 부모의 멤버를 가져온다.


접근 지정자
Protected
   - >  자식에게만 허용을 한다. 
하지만 자식도 부모의 private 에는 접근을 할수가 없다.

하지만
매소드의 접근성은 하위 클래스에선 접근 범위를 늘일수는 있으나, 줄일수는 없다.
 - >  상위 클래스 protected {}    -> 이걸 상속 받아서,  하위 클래스 private {}  이것이 불가능하다.


상속과 생성자.
자식 생성자에서 생성자를 호출하면, 부모 생성자(인자값이 있다면, 인자가 있는, 없다면 기본생성자) 가 호출이 되고
다음에 자식의 생성자가 호출이 된다.

자식객체 생성 할시에
 - > 부모객체 생성 - > 부모 생성자 호출  - > 자식객체 생성 - > 자식 생정자 호출


__________________________________________________________________________________________________________________

다형성

추상 클래스
  : 몸체가 구현되지 않은 메소드를 가지고 있는 클래스 

 - > abstract class     - >  추상적인 개념을 표현하는데 적당하다.
abstract 함수명   하면 추상 함수를 만들수 있다.  - > 추상클래스가 있다면 반드시 재정의를 해줘야 한다.


인터페이스
 :
객체와 객체 사이의 상호작용을 위한 인터페이스다.
 - > 모든  것들이 추상화 되어야 한다.  -> 재정의 필수.

public interface Remote  { 
      public void trunon();
      public void trunoff();  
}

public class TV  implements Remote { 재정으로 해줘야 한다. }


다중 상속
- > 여러개의 수퍼클래스로 부터 상속받는것, 하지만 모호성 때문에 자바는 지원하지 않는다.
- > 하지만 interface 는 가능하기 때문에 인터페이스로 간접적으로 다중상속을 하라.

class Shape{ protected int x, y; }
interface draw {}
public class r extends Shape implements drar {}


상수 공유
interface Days{
    public static final int s=1 , a= 2 
}
public class day implements Days{
    pubic static void main [] {
          출력 a
     }
}



다형성
-다형성은 다양한 객체들을 하나의 코드로 처리한다. - > 가장 상위 부모 객체를 이용하여서.
 - > 멤버는 자식이 더 많지만 범주는 부모클래스가 가장 상위에 존재한다.

자식객체를 부모클래스에 대입가능 - > upcasting
      Shape 부모 = new 자식(1,2,)      작은 타입을 큰타입에 대입하는것이니 된다

Shape s = new 자식()
s. draw();    - > 실제로 자식의 클래스를 생성했으니  자식 클래스의 draw 함수를 가져온다.
- > 계층 구조여야 하며, 똑같은 매소드를 모두 재정의 되어 있어야 한다, 그리고 upcasting .


객체의 실제 타입을 알아내는 방법.
 s instanceof Rectangle


형변환.

Shape s = new Retangle();   - > 이것은   재 정의된 매소드 만이 호출 가능하다.

((Rectangle) s). setWidth(100);    - > 자식 클래스 매소드를 호출하려면 형 변환이 필요하다.




오늘의 예제


Employee Rablem

설계도 ......
 
             부모  :   Employee                                < -   포함관계                   Departement

Permanent (정규)                 Temporary(비저유)      

1 SalesPerson


       Employee Test 클래스. (Main)    - >  요구사항은  
                                                          순번   이름   급여    구분
                                                            1    홍길동  200    정규직       - > 이런식으로 출력이 되도록 한다.



 추상클래스 Employee   -  name : string    + getName() : string
                                  -   pay  :               + getSal()   : abstract double


Permanet    - sal : double      + getPay() : double       , 생성자

SalesPerson   - sales(판매 실적) : double     + getPay() : double      sal / 12 * sales

Temporary     - time : int  -  pay : double (시급)   + getPay () :double   시간 *  급여   생성자.

Depatrtment       -  Emplist(직원 리스트)  : Employee[]     - index(직원 숫자) : int      
                        + Addemp( Employee e)    + PayList () : void  (전체 직원의  월급을 호출)


메인 함수에서    1 .  Department 객체 생성. 
                       2.   Addemp() 호출해서 5명 정도 추가.
                       3.   Paylist( )  호출해서 직원의 급여를 출력