반응형
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 |