본문 바로가기
JAVA

JAVA | 추상클래스, 인터페이스

by 개발송이 2022. 2. 10.

6. 추상클래스 abstract class

 

6.1 추상클래스란

 

-미완성 설계도. 미완성 메스드(추상 메서드)를 갖고 있는 클래스

-abstract를 붙이면 됨

abstract class 클래스이름 { 
    '''
}
abstract class Player {  //추상클래스(미완성 클래스)
    abstract void play(int pos);  //추상메서드(몸통이 없는 미완성 메서드)
    abstract void stop(); //추상메서드
}

-다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가

(미완성 설계도기 때문에 제품 생성 불가)

-상속을 통해 추상 메서드를 완성해야 인스턴스 생성가능

class AudioPlayer extends Player{  //완성된 설계도
    void paly(int pos) { /* */ }  //추상메서드를 구현함(추상메서드 몸통 만들기)
    void stop() { /* */ } //추상메서드 구현
}
//더이상 추상메서드가 아니고 추상클래스가 아니니까 abstract안붙임

AudioPlayer ap = new AudioPlayer(); //인스턴스 생성가능

추상메서드를 포함하고 있다는 것을 제외하면 일반클래스와 다르지 않아서 생성자 있고 멤버변수 메서드 가질 수 있다.

 

 

6.2 추상메서드

 

-미완성 메서드. 구현부(몸통)가 없는 메서드

-꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우 사용

-구현부가 없으니 { }대신 문장의 끝인 ;를 붙인다

abstract 리턴타입 메서드이름();
abstract class Player {  //추상클래스
    abstract void play(int pos);  //추상메서드
    abstract void stop();
}

class AudioPlayer extends Player{  //완성된 설계도
    void paly(int pos) { /* */ }  //추상메서드를 구현함(추상메서드 몸통 만들기)
    void stop() { /* */ } //추상메서드 구현
}
//더이상 추상메서드가 아니고 추상클래스가 아니니까 abstract안붙임

abstract class AbstractPlayer extends PlayerP{
   void play(int pos) { /* */ } 
}  //하나만 구현부를 완성했으니 아직 추상클래스임

-추상 메서드 호출 가능(호출할 때는 선언부만 필요)

나중에 상속을 통해 자손이 완성할 수 있으니까  

인스턴스 메서드는 객체생성 후 호출 가능함

상속을 통해 자손이 완성, 자손 객체 생성 후 

 

 

6.3 추상클래스의 작성

-여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다.

class Marine {
	int x, y;
	void move(int x, int y) {}
	void stop() {}
	void stimPack() {}
}

class Tank {
	int x, y;
	void move(int x, int y) {}
	void stop() {}
	void changeMode() {}
}

class Dropship {
	int x, y;
	void move(int x, int y) {}
	void stop() {}
	void load() {}
	void unload() {}
}
//기존의 클래스에서 공통된 부분을 뽑아내어 추상클래스로 만들면 아래와 같음

abstract class Unit {
	int x, y;
	abstract void move(int x, int y);
	void stop() {}
}
class Marine extends Unit {
	void move(int x, int y) {}
	void stimPack() {}
}

class Tank extends Unit {
	void move(int x, int y) {}
	void changeMode() {}
}

class Dropship extends Unit {
	void move(int x, int y) {}
	void load() {}
	void unload() {}
}

추상화<->구체화

추상화된 코드는 구체화된 코드보다 유연하다(변경에 유리함)

 

 

7.인터페이스 interface

 

7.1 인터페이스란

-추상 메서드의 집합

-구현된 것이 전혀 없는 설계도. 껍데기 (모든 멤버가 public)

(public 접근 제한이 전혀 없는 접근 제어자)

 

추상클래스는 일반 클래스인데 추상 메서드를 가지고 있는것(생성자, iv가짐)

인터페이스는 추상 메서드외에 아무것도 가질 수 없음(멤버변수를 가질 수 없음)

interface 인터페이스이름{
    public static final 타입 상수이름 = 값;  //상수 (변수는 가질 수 없음)
    public abstract 메서드이름(매개변수목록); //추상메서드
}
interface PlayingCard {
    public static final int SPADE = 4; 
    final int DIAMOND = 3;
    statuc int HEART = 2;
    int CLOVER = 1; 
    //항상 public static final 이라서 생략가능
    
    public abstract String getCardNumber();
    String getCardKind();  //public abstract String getCardKind();
}   //인터페이스는 추상메서드만 가지고 무조건public이라 생략가능

-모든 멤버변수는 public static final 이어야 하며, 생략 가능

-모든 메서드는 public abstract이어야 하고 생략가능

 

7.3 인터페이스의 상속

-인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상이 아님!)

-다중 상속 가능(추상메서드는 충돌해도 문제 없음)

interface Fightable Movable, Attackable { }  //멤버2개됨

interface Movable {
	void move(int x, int y);
}

interface Attackable {
	void attack(Unit u);
}

 

7.4 인터페이스의 구현

-인터페이스에 정의된 추상 메서드를 완성하는 것(인터페이스 구현)

class 클래스이름 implements 인터페이스이름 {
	//인터페이스에 정의도니 추상메서드를 모두 구현해야 한다.
}

-일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함

 

Q.인터페이스란?

A.추상메서드의 집합

Q.인터페이스의 구현이란?

A.인터페이스의 추상메서드 몸통{ } 만들기 (미완성 설계도 완성하기)

Q.추상클래스와 인터페이스의 공통점은?

A.추상 메서드를 가지고 있다. (미완성 메서드)

Q.추상클래스와 인터페이스의 차이점은?

A.인터페이스는 iv를 가질 수 없다. 

 

 

7.5 인터페이스를 이용한 다중상속

 

7.6 인터페이스를 이용한 다형성

다형성

Tv t = new SmartTv();

조상 참조변수로 자손 객체 가리키는 것

 

그렇다면 인터페이스도 구현 클래스의 부모로 치는건가? Yes