국비 15-2

냐아암·2023년 5월 4일
0

국비

목록 보기
20/114
  • 추상클래스
  1. 미완성 메소드(추상 메소드)를 보유하고 있는 클래스
  2. (추상 메소드는 없지만)객체로 만들면 안 되는 클래스
  • 추상 메소드
    몸체 없는 메소드
    --> 미완성 상태로 두어 상속받은 자식이 해당 메소드를 정의하도록 오버라이딩을 강제화시킴

    추상 클래스는 객체로 만들 수 없다. 하지만 추상 클래스를 상속받아 미완성된 부분을 구현한 자식 클래스를 이용해 객체를 생성한다.

Animal

package edu.kh.poly.ex2.model.vo;

public abstract class Animal {
	
	// 추상클래스(Abstract class)
	//1. 미완성 메소드(추상 메소드)를 보유사고 있는 클래스
	
	//2. (추상 메소드는 없지만) 객체로 만들면 안되는 클래스
	
	//필드
	private String type; // 종/과 구분
	private String eatType; //식성(초식 육식 잡식)
	
	//생성자
	// -추상 클래스는 new 연산자를 이용해 직접적인 객체 생성은 불가능하지만
	//	상속받은 객체 생성 시 부모 부분이 생성될 때 사용된다.
	// == super() 생성자
	
	public Animal() {
		super(); //생략 시 컴파일러가 추
	} //기본 생성자
	

	public Animal(String type, String eatType) {
		super();
		this.type = type;
		this.eatType = eatType;
	}




	//메소드
	public String getType() {
		return type;
	}
	
	public void setType(String type) {
		this.type = type;
	}

	public String getEatType() {
		return eatType;
	}

	public void setEatType(String eatType) {
		this.eatType = eatType;
	}

	//toString 오버라이딩
	@Override //오버라이딩 되었음을 컴파일러에게 알려주는 어노테이션
	public String toString() {
		return type + " / " + eatType;
	}
	
	//동물의 공통 기능 추출 (추상화)
	// -> 동물은 공통적으로 먹고 숨쉬지만,
	//	  어떤 동물이냐에 따라 그 방법이 다름
	
	// --> 미완성 상태로 두어 상속받은 자식이 해당 메소드를 정의하도록
	//	   오버라이딩을 강제화 시킴-> 추상(abstract)메소드로 작성
	
	//먹다
	public abstract void eat();
	
	//숨쉬다
	public abstract void breath();
	
	
	
}

Person

package edu.kh.poly.ex2.model.vo;

public class Person extends Animal{
			//Animal의 추상 메소드를 오버라이딩하지 않으면 오류 발생
	
	private String name;

	//생성자
	public Person() { //기본 생성자
		super(); // == Animal의 기본 생성자
	}
	
	public Person(String type, String eatType, String name) { //매개변수 생성자
		super(type, eatType);
		this.name = name;
	}

	//getter setter
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	//추상 메소드 오버라이딩
	@Override
	public void eat() {
		System.out.println("숟가락, 젓가락, 나이프, 포크 등을 이용해서 먹는다.");
	}

	@Override
	public void breath() {
		System.out.println("코와 입으로 숨을 쉰다.");
	}

	//toString
	@Override
	public String toString() {
//		return "Person: " + getType() + getEatType() + name;
		return "Person: " + super.toString() + " / " + name;
	}
	

}

Fish

package edu.kh.poly.ex2.model.vo;

public class Fish extends Animal {
	
	//생성자
	// -> 생성자 미작성 시 컴파일러가 자동으로 기본 생성자 추가
	
	public Fish() {
		super();
	}
	
	public Fish(String type, String eatType) {
		super(type, eatType);
	}
	

	//추상 메소드는 상속 받으면 오버라이딩이 강제된다.
	//모두 오버라이딩 해줘야 함(하나라도 빠뜨리면 오류)
	@Override
	public void eat() {
		System.out.println("입을 뻐끔뻐끔 거리며 먹는다.");
	}

	@Override
	public void breath() {
		System.out.println("숨을 쉴 때 아가미 호흡을 한다.");
	}
	
	//toString
	@Override
	public String toString() {
		return "Fish: " + super.toString();
	}

}

AbstractionService

package edu.kh.poly.ex2.model.service;

import edu.kh.poly.ex2.model.vo.Animal;
import edu.kh.poly.ex2.model.vo.Fish;
import edu.kh.poly.ex2.model.vo.Person;

public class AbstractService {
	
	public void ex1() {
		
		//추상 클래스는 객체로 만들 수 있을까? (X)
		/*Animal a1 = new Animal();*/
		//Cannot instantiate the type Animal (객체화 할 수 없다.)
		
		//클래스: 객체의 속성과 기능을 정의한 것(설계도)
		//추상 클래스: 미완성 메소드를 포함한 클래스(미완성 설계도)
		//-> 미완성 설계도로는 객체를 만들 수 없다 -> 오류 발생
		
		
		//해결 방법: Animal을 상속받아 미완성 부분을 구현한 클래스를 이용해 객체 생성
		
		//추상 클래스를 상속받은 자식 객체 생성하기
		Person p1 = new Person();
		
		p1.setName("공유");
		
		//상속받은 기능 호출
		p1.setType("척추동물");
		p1.setEatType("잡식");
		
		//오버라이딩한 메소드 호출
		p1.eat();
		p1.breath();
		
		Fish f1 = new Fish();
		
		f1.eat();
		f1.breath();
		
	}
	
	public void ex2() {
		
		//*추상 클래스와 다형성 + 바인딩
		
		//-추상 클래스는 객체로 만들 수 없다.
		//--> 하지만 "참조 변수"로는 사용할 수 있다.
		
		//ex) 동물-> 사람? 물고기?
		//		Animal a1 = new Animal(); (X)
		
		//		사람 -> 동물 				  /		물고기 -> 동물
		//		Animal a1 = new Person();	Animal a2 = new Fish();
		
		Animal[] arr = new Animal[2];
		//Animal 참조 변수 배열 선언 및 할당
		
		
		//업캐스팅
		arr[0] = new Person("사람", "잡식", "김사랑");
		//Animal 부모 = Person 자식(다형성 중 업캐스팅)
		
		arr[1] = new Fish("물고기","잡식");
		//Animal 부모 = Fish 자식(다형성 중 업캐스팅)
		
		//바인딩 확인
		for (int i = 0; i<arr.length; i++) {
			//arr[i] == Animal 참조 변수
			arr[i].eat();
			arr[i].breath();
			System.out.println(arr[i]);
			//void edu.kh.poly.ex2.model.vo.Animal.eat() -정적 바인딩
			
			//프로그램 실행 시
			//참조하고 있는 자식 객체에 오버라이딩된 eat() 메소드 수행 - 동적 바인딩
			//(부모 타입 참조 변수로 메소드 호출했지만 자식 타입에 오버라이딩된 메소드 수행됨)
			
			//업캐스팅 상태(부모 참조 변수 = 자식 객체) 에서
			//부모 메소드 호출 시, 오버라이딩된 자식 메소드 수행
			
			System.out.println("------------------------------");
			
			
		}
		/*
		숟가락, 젓가락, 나이프, 포크 등을 이용해서 먹는다.
		코와 입으로 숨을 쉰다.
		Person: 사람 / 잡식 / 김사랑
		------------------------------
		입을 뻐끔뻐끔 거리며 먹는다.
		숨을 쉴 때 아가미 호흡을 한다.
		Fish: 물고기 / 잡식
		------------------------------
		*/
		
		
		
	}

}

AbstrationRun

package edu.kh.poly.ex2.run;

import edu.kh.poly.ex2.model.service.AbstractService;

public class AbstractRun {

	public static void main(String[] args) {
		
		AbstractService service = new AbstractService();
		
//		service.ex1();
		service.ex2();

	}

}
profile
개발 일지

0개의 댓글