어제에 이어서
***추상 클래스 Abstract Class***
실체 클래스들의 공통되는 필드와 메소드를 정의한 클래스로, 실체(구현) 클래스의 부모 클래스 역할
(실체(구현) 클래스: 객체를 만들어 사용할 수 있는 클래스) --> 추상 클래스는 자체적으로 객체를 만들 수 없음
ex) 새, 물고기, 곤충 (실체) -> 동물 (추상)

abstract class AbsClass{       //abstract 붙은게 추상 클래스
}

* 추상 클래스 용도
- 실체 클래스의 공통된 필드, 메소드명 통일하려는 목적
- 실체 클래스 작성 시 시간 절약 -> 추가적인 필드, 메소드만 선언하면 되니까
- 설계 규격 만들때 -> 실체 클래스가 가져야할 필드, 메소드를 추상클래스에 미리 정의하고 추상클래스를 상속받아 작성함

* 일반 클래스가 extends로 추상 클래스를 상속받으면 반드시 추상메소드를 오버라이딩해야함
 -> 메소드명만 있고 내용이 없으니까, 자식클래스가 내용을 정의해서 구현해줘야 함
       애초에 이걸 쓰려고 추상클래스를 상속받은 건데 안 하면 안 됨
+) 추상클래스도 단일 상속만 가능 (java는 다중상속 허용하지 않음 추상클래스도 예외 없음)
 
구성요소
추상 메소드, 일반 메소드, 멤버변수
추상메소드: 메소드명만 있고 내용은 가지고 있지 않은 메소드

   abstract class AbsClass{
       int a=10;                                  //멤버변수
       void Method02(){                    //일반 메소드 -> {} 있음
       abstract void Method01();          //추상메소드 -> {} 없음 = 내용 없음
       abstract int Method03(int a);
      //추상메소드도 매개변수 있고 자료형 지정할수 있음.
      //하지만 내용 없는 건 똑같고, int형 메소드를 만들면 메소드 오버라이딩 시 return 반드시 해야함 당연함
       }
   }

+) 얘도 생성자를 만들수는 있지만, 추상 클래스는 자체적으로 객체를 생성할 수 없어서 만들어도 사용하지 않음!
    보통 자식클래스가 객체 생성하면 부모클래스의 기본생성자를 호출할 수 있고 추상클래스도 똑같음
    하지만 사용하지 않음! 추상클래스는 사용하는 목적이 명확해서, 그 용도로만 사용함
    생성자를 호출해서 사용할거라면 굳이? 추상클래스를 사용할 필요가 없기 때문에... 안 쓴다고 생각하면 됨


* 다형성
같은 타입에 여러 객체를 대입해 다양한 실행 결과가 나올 수 있게 하는 성질

이미지 출처  http://www.devkuma.com/books/pages/15


-> 부모클래스가 되는 추상클래스의 추상메소드 하나를 여러 일반클래스에서 각자 메소드오버라이딩해 사용
--> 같은 메소드 하나로 다양한 실행 결과가 나올 수 있게 함 = 다형성

효과: 객체를 부품화 가능


 

 

 


***인터페이스Interface***
: 개발 코드가 객체와 서로 통신하는 접점 -> 개발 코드는 인터페이스의 메소드만 알고 있으면 되는 것

1. 인터페이스= 상수 + 추상메소드 (대부분 추상메소드를 이용함)
    자바8부터 디폴터 메소드, 정적 메소드 도 사용가능함 (쓸순 있지만 잘 사용하진 않는)
   cf.추상클래스(멤버변수, 일반메소드, 추상메소드 )
    -> 추상 클래스처럼 인터페이스도 자체적으로 객체를 만들 수 없음!!

   public interface Inter01{ // class가 아니에요 interface 입니다
      int a = 10;  //상수 (public static final생략가능) -> 수정/변경 불가
// static이라 클래스명으로 바로 접근 가능!
      void check(); //추상메소드 (public abstract 생략가능) -> 메소드 오버라이딩 필수
   }

2. 인터페이스를 상속 받을때는 implements로 상속을 받는다.
   class S  implements  A{}

3. 인터페이스를 상속받은 일반 클래스는 인터페이스 안에 들어 있는 추상메소드를 반드시 Method Overriding
 
   interface A{ //인터페이스
      public abstract void check(); //추상메소드 (public abstract 생략해도 ㄱㅊ)
   } 
   class S  implements  A{ //일반 클래스가 인터페이스 상속
    public void check(){   //public을 생략할수 (강조)없다.
        } //구현클래스에서 추상메소드 오버라이딩할땐 public 꼭 써야함!
   }

※ 인터페이스가 인터페이스를 상속받았을 때
   자식 인터페이스는 부모 인터페이스의 추상 메소드를 오버라이딩할 수 없음
   인터페이스는 오로지 추상 메소드만 추가 가능상속받은게 있어도 오버라이딩 불가능!

4. 인터페이스는 다중상속을 허용한다.
   interface A{}
   interface B{}
   class S implements A, B{
   }

5. 추상클래스와 인터페이스를 모두 상속받아야 하는 경우,
   추상클래스를 먼저 상속을 받고, 인터페이스는 그 다음 상속 받아야 한다. (순서 바뀌면 안 됨!)

   interface A{}
   abstract class B{}

   class S extends B implements A{} //상속받는 순서 중요! 반드시 extends 다음 implements

※인터페이스끼리 상속 규칙
  interface A{}
  interface B{}

  interface C   extends  A, B{} // interface가 interface를 상속하면 extends
  class S  implements  C{} // class가 interface를 상속하면 implements
//같은 속성끼리 상속이면 extends (ex.class-class , interface-interface )
//속성 다른 둘이 상속이면 implements (ex. interface-class)

*상속, 추상... 주로 API, 그래픽에서 많이 사용함 특히 인터페이스

※ 추상 클래스와 인터페이스의 공통점과 차이점을 기억합쉬다!

+)오버라이딩 방법



***레퍼런스 형변환***
 :(=강제 타입 변환Casting) 부모 타입을 자식 타입으로 변환하는 것
  - 조건: 두개의 클래스 사이에 상속관계가 있어야 하고
            자식 타입을 부모 타입으로 자동 변환 후 다시 자식 타입으로 변환해야 할 때.

 
업캐스팅(자동 형변환)
   1. 서브클래스에서 슈퍼클래스로 형변환
   2. 참조 가능한 영역이 축소됨
   3. 컴파일러에 의해 암시적 형변환(자동 형변환) -> 강제형변환 할 필요 없음

   Parent p;
   Child c = new Child();
   p = c;  //업캐스팅(자동 형변환)
  ↓코드 줄이면 이런 형태
   Parent p = (Parent)new Child();

+ Recent posts