추상클래스: 객체를 직접 생성할 수 있는 클래스 = 실체클래스라고 하면 이 클래스들의 공통적인 특성(필드, 메소드)을 추출해서 선언한 클래스 즉 상속의관계를 가지고 있음
exe public abstract class Phone{
}
추상메서드: 추상클래스에서만 선언할수있고 메소드의 선언부만 있는 메소드, 자식클래스에서 재정의(오버라이딩)되어 실행내용을 결정해야함, 실행블록이 없음
재정의하지 않으면 자식클래스도 추상클래스가 되어야함 ((할아버지 아버지가 추상클래스가되면 자식은 무조건 재정의해야함)
Animal animal = new Animal(); 컴파일 에러 = (실체에서 공통의 필드와 메소드를 추출했기때문에 추상클래스는 객체를 직접생성불가)
추상클래스는 새로운 실체클래스를 만들기위해 부모클래스로만 사용됨. 즉 extends 뒤에만 올수있는 클래스
public abstract void sound(); //추상 메소드면 실체크래스가 무조건 상속 받아야함 아니면 컴파일에러
공통된 필드와 메소드의 이름을 통일한 목적 : 실체 클래스를 설계하는사람이 여러명이면 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있음.
Phone+SmartPhone+Test 추상클래스예제
package ex06;
public abstract class Phone {
//필드
String owner;
//생성자
public Phone(String owner) {
this.owner = owner;
}
//메소드
public void turnOn() {
System.out.println("폰 전원을 켭니다.");
}
public void turnOff() {
System.out.println("폰 전원을 끕니다.");
}
}
package ex06;
public class SmartPhone extends Phone {
//생성자
public SmartPhone(String owner) {
super(owner); //부모 생성자의 영향을 받아...매개변수1개처리
}
//메소드
public void internetSearch(){
System.out.println("인터넷 검색을 합니다.");
}
}
package ex06;
public class Test {
public static void main(String[] args) {
//Phone p = new Phone();
SmartPhone s = new SmartPhone("홍길동");
s.turnOn();
s.internetSearch();
s.turnOff();
}
}
Animal (추상) + Dog (실체) + Cat(실체) + E(양서류)+ Test 361
package ex07;
public abstract class A {
public String kind = "포유류"; //e클래스가 if개념 else 개념 초기화값이 포유류가아니면 /* */처리한곳해제 상속받은 실체에서 this써서 써야함
public void breathe() {
System.out.println("숨을 쉽니다.");
}
public abstract void sound(); //추상 메소드면 무조건 상송받아야함
}
package ex07;
public class D extends A {
/*public D() {
this.kind = "포유류";
}*/
@Override
public void sound() {
System.out.println("멍멍");
}
}
package ex07;
public class C extends A {
/*public C() {
this.kind = "포유류";
}*/
@Override
public void sound() {
System.out.println("야옹");
}
}
package ex07;
public class E extends A {
public E() {
this.kind = "양서류"; //if양서류
}
@Override
public void sound() {
System.out.println("개구리");
}
}
package ex07;
public class Test {
public static void main(String[] args) {
D d1 = new D();
C c1 = new C();
E e1 = new E();
d1.sound();
c1.sound();
e1.sound();
System.out.println("----");
//변수의 자동타입변환
A a1 = null;
a1 = new D();
System.out.println(a1.kind);
a1.sound();
a1 = new C();
a1.sound();
a1 = new E();
System.out.println(a1.kind);
a1.sound();
System.out.println("----");
//메소드의 다형성
anas(new D());
anas(new C());
}
public static void anas(A a1) { //Main 메서드 안에 또 메서드를 써서 오류났었던것 밖으로 꺼내야함. 부모가 자식의 특성을 가지고있으니 부모객체를통해서 사용 (자동타입변환)
a1.sound();
}
}
'강의' 카테고리의 다른 글
0113 Java lec07 chap09~ (0) | 2023.01.13 |
---|---|
0113 Java lec07 chap08[인터페이스]인터페이스+타입 변환과 다형성p369~403 (0) | 2023.01.13 |
0112 Java lec06 chap07[상속]상속 + 타입 변환과 다형성 p310~356 (0) | 2023.01.11 |
0111 Java lec05 chap06[클래스]메소드+인스턴스멤버와 정적멤버 (singleton)+패키지와 접근 제한자 p268~307 (0) | 2023.01.11 |
0111 Java lec05 chap06[클래스]메소드 p247~page267 (0) | 2023.01.11 |
댓글