Employee[] empArray = {new Employee("강감찬", 100), new Manager("지다솜", 6000, "인사"),
new Engineer("박현아", 6000, "JAVA"),
new Secretary("문지해", 6000), new Secretary("문지해2", 6000),
new Secretary("문지해3", 6000)};
for (Employee e : empArray ) {
if(e instanceof Secretary) {
System.out.println(e.getEmployee());
}
}
for (Employee e : empArray ) {
if(e instanceof Manager) {
// 형변환 - 부모에는 없고 자식에만 추가된 경우
Manager m = (Manager) e ;
System.out.println(m.getDepart());
}
}
@Override
public String toString() {
return "Test [num=" + num + ", num2=" + num2 + "]";
}
cf) 클래스 작성 구성 요소
1. 변수
2. 생성자
3. getter/setter
4. toString 오버라이딩 (안하면 값을 출력하는 메서드를 따로 만들어야됨)
5. 유효성체크 메서드 (옵션)
: 클래스간의 접근(참조)을 제한하는 방법
public abstract class 클래스명{
}
: {}를 가져서 기능이 정해짐
public void a() {
실행문;
}
: {} 지정 안함. 미지정된 상태, 나중에 지정됨.
public abstract void a();
-> abstract 키워드 필수 !
-> 추상 메서드를 가지면 반드시 추상 클래스로 만들어야 된다
// 부모클래스
public abstract class AAA {
}
AAA a = new AAA(); // 에러 발생 !!
// 자식 클래스
public class BBB extends AAA { // 부모의 변수, 메서드 사용 가능
// 부모의 추상메서드를 반드시 오버라이딩 해야된다 !!!!
}
: 부모의 추상메서드를 반드시 자식클래스에서 오버라이딩 해야되는 강제성을 주는 것
-> 부모의 추상 메서드 이름을 따라 자식 메서드가 통일되게 강제 할 수 있다
abstract Pet
-name, age
-abstract eat();
Cat Dog Bird
@Override @Override @Override
eat(){s.o.u("쩝쩝");} eat(){s.o.u("냠냠");} eat(){s.o.u("짹짹");}
public interface 인터페이스명 {
int N = 20; // public static final int N=20; 과 동일
abstract void a(); // 접근 지정자 default아니고 public임
} //인터페이스명.java로 저장됨
- final int NUM = 20;
- public static final 지정자가 자동으로 붙는다
- 접근은 인터페이스명.상수명 으로 사용
- public default 리턴타입 메서드명([변수,...]) { 실행문; }
- 클래스의 인스턴스 메서드처럼 동작 (객체 생성 후 사용)
- public static 리턴타입 메서드명([변수,...]) { 실행문; }
- 클래스의 static 메서드처럼 동작 (객체 생성 없이 클래스명.static메서드 로 사용 가능
- public abstract 리턴타입 메서드명([변수,...]);
- public abstract 지정자가 자동으로 붙는다 (인터페이스에서만 abstract 키워드 생략 가능)
// 하위 클래스
public class B implements A, A2 {
//준부모(인터페이스)의 상수 사용
//준부모의 default 메서드, static 메서드 사용
//준부모의 추상메서드를 반드시 오버라이딩(overriding)해야하는 제약이 붙는다.
만약에 추상메서드를 오버라이딩하지 않으면 에러가 발생된다.
}
(1) 인터페이스에서 지정된 추상 메서드명을 하위 클래스에서 사용하도록 강제
abstract Pet interface Flyer {
-name, age abstract fly();
-abstract eat(); }
Cat extends Pet Dog extends Pet
@Override @Override
eat(){s.o.u("쩝쩝");} eat(){s.o.u("냠냠");}
Bird extends Pet implements Flyer Bat extends Pet implements Flyer
@Override @Override
eat(){s.o.u("짹짹");} eat(){s.o.u("짹짹");}
@Override @Override
fly(){} fly(){}
(2) 클래스간의 의존성 감소 ★ (loosely coupling)
cf) 클래스, 추상 클래스, 인터페이스 비교