어제에 이어서
***추상 클래스 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 반드시 해야함 당연함
}
}
+) 얘도 생성자를 만들수는 있지만, 추상 클래스는 자체적으로 객체를 생성할 수 없어서 만들어도 사용하지 않음!
보통 자식클래스가 객체 생성하면 부모클래스의 기본생성자를 호출할 수 있고 추상클래스도 똑같음
하지만 사용하지 않음! 추상클래스는 사용하는 목적이 명확해서, 그 용도로만 사용함
생성자를 호출해서 사용할거라면 굳이? 추상클래스를 사용할 필요가 없기 때문에... 안 쓴다고 생각하면 됨
* 다형성
: 같은 타입에 여러 객체를 대입해 다양한 실행 결과가 나올 수 있게 하는 성질
-> 부모클래스가 되는 추상클래스의 추상메소드 하나를 여러 일반클래스에서 각자 메소드오버라이딩해 사용
--> 같은 메소드 하나로 다양한 실행 결과가 나올 수 있게 함 = 다형성
효과: 객체를 부품화 가능
***인터페이스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();
'수업 > 정리' 카테고리의 다른 글
220111 자료구조, Generic, 예외처리 (0) | 2022.01.11 |
---|---|
220110 Casting reference, Data structure- Set, List (0) | 2022.01.10 |
220106 Inheritance, Method Overriding, Abstract Class (0) | 2022.01.06 |
220105 calendar, wrapper, Inheritance (0) | 2022.01.05 |
220104 문자열, 날짜/시간, 형식 (0) | 2022.01.04 |