본문 바로가기
강의

0113 Java lec07 chap07[상속] 추상클래스 p357~

by IT새내기IM 2023. 1. 12.

추상클래스: 객체를 직접 생성할 수 있는 클래스 = 실체클래스라고 하면 이 클래스들의 공통적인 특성(필드, 메소드)을 추출해서 선언한 클래스 즉 상속의관계를 가지고 있음  

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();
	}
}

 

댓글