본문 바로가기
JAVA

[다형성] 추상클래스 & 인터페이스

by amoomar 2022. 1. 1.
반응형

1. 추상클래스 : abstract

 

  • 불완전한 클래스이다. 추상적인 내용만 정의하고 있는 클래스로, 구체적인 내용은 하위클래스에서 구현되도록 할 목적으로 사용한다.
  • 추상클래스는 자식클래스들의 공통요소들을 가상화 시켜놓는다.
  • 객체화는 가능하나, 목적에 어긋나므로 사용하지 않는다.
  • 자식클래스에서 재정의 할 메서드의 이름만 가지고 있고, 바디({})를 가지지 않는다. 이러한 메서드를 추상메서드라고 한다.
  • 일반 메서드도 사용 가능하다. 추상메서드를 상속받아 사용하면 무조건 재정의 해야하므로 강제성을 띈다고 표현한다.
  • 객체화를 제외하고는 모든 것을 할 수 있다. 변수, 상수, 메서드를 선언할 수 있고 여러개의 추상클래스를 생성할 수도 있다.
package class05;
//추상클래스 생성
abstract class Shape{
	double area;
	abstract void showArea(double w, double h); //추상메서드 생성
}

class Tri extends Shape{
	@Override //필수로 추상메서드를 재정의하도록 함
	void showArea(double w, double h) {
		this.area = w*h;
		System.out.println("넓이 : " + this.area + "cm²");
	}
}

class Rect extends Shape{
	@Override //필수로 추상메서드를 재정의하도록 함
	void showArea(double w, double h) {
		this.area = (w*h)/2;
		System.out.println("넓이 : " + this.area + "cm²");
	}
}
public class Test02 {
	public static void main(String[] args) {
		Tri t = new Tri();
		Rect r = new Rect();
		//각각 재정의된 메서드로 출력됨
		t.showArea(20, 6);
		r.showArea(4, 7);
	}
}

 

 


 

 

 

 

2. 인터페이스

 

1) 인터페이스

  • 추상클래스를 고도화 시킨 문법, 반드시 추상메서드와 상수(final:재정의 금지)만 선언해야한다.
  • 다른 클래스에서 인터페이스를 지정할때는 implements를 사용해야한다.
  • 인터페이스는 다중으로 사용이 가능하므로 모호성 주의가 필요하다.(동일한 메서드명, 동일한 변수명 등)
  • 지정된 인터페이스가 가지고 있는 추상메서드들을 반드시 재정의해야한다.
  • 메서드명을 강제시키기 위해 사용하기도 한다.
  • 구조상 인터페이스 내의 모든 메서드는 접근권한이 public일 수 밖에 없다. 부모의 공개범위는 자식의 공개범위보다 작거나 같아야하기 때문이다.

 

 


 

 

 

2) 어댑터

: 인터페이스의 내용을 필요한 부분만 골라서 사용해야할때 사용한다. 즉, 원하는 것만 재정의해서 사용할 수 있도록 한다.

package class05;

interface Soldier{
	int arms = 2; //final static이 생략되었다.
	int legs = 2;
	// 재정의 필수, 추상메서드 생성
	void eat();
	void salute();
	void work();
	void play();
	void sleep();
}
class Private implements Soldier{ //이등병은 솔져인터페이스를 사용한다.
	//재정의 필수의 메서드
	public void eat() {
		System.out.println("빠르게 먹는다.");
	}
	public void salute() {
		System.out.println("큰 목소리로 경례한다.");
	}
	public void work() {
		System.out.println("열심히 하지만 성과가 없다.");
	}
	public void play() {
		System.out.println("일 하는 것 처럼 논다.");
	}
	public void sleep() {
		System.out.println("잔다.");
	}
}
//adapter의 역할을 할 class생성
class Army implements Soldier{
	public void eat() {
		
	}
	public void salute() {
		
	}
	public void work() {
		
	}
	public void play() {
		
	}
	public void sleep() {
		
	}
}
class Sergeant extends Army{ //어댑터클래스를 상속받아 사용할 메서드만 재정의한다.
	public void eat() {
		System.out.println("잘 먹는다.");
	}
	public void play() {
		System.out.println("잘 논다.");
	}
	public void sleep() {
		System.out.println("잘 잔다.");
	}
}

 

 


 

 

 

3. 예제

: 티비와 리모콘 클래스를 생성한다. 두 클래스는 전원과 음량을 관리하는 기능이 있으며, 리모콘을 통해서도 티비 조작이 가능하다. 이때, 전원이 꺼져있을 경우 음량 조작이 불가능하며, 볼륨은 0~100까지만 조작이 가능하도록 할 것.

package TVasw;

import TVasw.Remote;
import TVasw.TV;
import TVasw.UseTV;

//1. TV 생성은 main()
//
//2. Remote생성시 TV필요함
//  -> TV tv=new TV();
//     == 리모콘생성할때마다
//   새 TV객체 생성

// 메서드명이 똑같아야하는구나!
// == 메서드명 강제
interface UseTV{ // [강제성] 부여
   int MAX=100;
   int MIN=0;
   void powerOnOff();
   void soundUp();
   void soundDown();
}
class Remote implements UseTV{
   
   TV tv;
   
   Remote(TV tv){ // 생성자: 멤버변수의 값을 초기화
      this.tv=tv;
   }
   
   @Override
   public void powerOnOff() {
      tv.powerOnOff();
   }
   
   @Override
   public void soundUp() {
      tv.soundUp();
   }
   
   @Override
   public void soundDown() {
      tv.soundDown();
   }
   
}
class TV implements UseTV{
   
   boolean power;
   int sound;
   
   TV(){ // 생성자: 멤버변수의 값을 초기화
      this.power=false;
      this.sound=50;
   }
   
   @Override
   public void powerOnOff() {
      if(power) {
         power=false;
         System.out.println("전원OFF");
      }
      else {
         power=true;
         System.out.println("전원ON");
      }
   }
   @Override
   public void soundUp() {
      if(!power) {
         System.out.println("전원OFF로 실행불가능!");
         return;
      }
      sound+=10;
      if(sound>MAX) {
         sound=MAX;
      }
   }
   @Override
   public void soundDown() {
      if(!power) {
         System.out.println("전원OFF로 실행불가능!");
         return;
      }
      sound-=10;
      if(sound<MIN) {
         sound=MIN;
      }
   }
}

public class T {
   public static void main(String[] args) {
	   TV t1 = new TV();
	   TV t2 = new TV();
	   Remote r1 = new Remote(t1);
	   Remote r2 = new Remote(t2);
	   
	   r1.soundUp(); //전원 off로 조작 불가능
	   
	   r1.powerOnOff(); //전원 on
	   r1.soundUp(); //소리조작
	   r1.soundUp();
   }
}

 

 

반응형

'JAVA' 카테고리의 다른 글

자판기 만들기_재고와 PK  (0) 2022.01.10
[최상위클래스] Object클래스  (0) 2022.01.03
[다형성] 클래스배열 & Casting  (0) 2022.01.01
[상속] 상속과 Overriding  (0) 2022.01.01
[클래스] 제어자 & 필드의 구분  (0) 2022.01.01