티스토리 뷰
[자바의 정석] Ch 7-31 추상 클래스(abstract class)란? Ch 7-34 추상클래스의 작성법은? Ch 7-35 인터페이스(interface)란? Ch 7-36 인터페이스의 상속이란?
da_devel 2022. 6. 21. 08:21
🤔 추상 클래스(abstaract class)란?
✔ 미완성 설계도. 미완성 메서드를 갖고 있는 클래스
✔ 다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가
✔ 미완성 메서드. 구현부(몸통, {})이 없는 메서드
/* 주석을 통해 어떤 기능을 수행할 목적으로 작성하였는지 설명 */
다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성 불가
Player p = new player(); // 에러. 추상 클래스의 인스턴스 생성 불가
그럼 인스턴스 생성 불가한 클래스를 만드는 이유가 뭘까?
👉 다른 클래스 작성에 도움을 주기 위해서!!
abstract class Player { // 추상클래스(미완성 클래스)
abstract void play(int pos); // 추상메서드(몸통{}이 없는 미완성 메서드)
abstract void stop(); // 추상메서드
}
class AudioPlayer extends Player {
void play(int pos) { /* 내용 생략 */ } // 추상메서드를 구현
void stop() { /* 내용 생략 */ } // 추상메서드를 구현
}
AudioPlayer ap = new AudioPlayer(); // OK.
🤔 언제 추상 메서드를 사용할까?
꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용한다.
abstract class Player { // 추상클래스
abstract void play(int pos); // 추상메서드
abstract void stop(); // 추상메서드
}
class AudioPlayer extends Player {
void play(int pos) { /* 내용 생략 */ } // 추상메서드를 구현
void stop() { /* 내용 생략 */ } // 추상메서드를 구현
}
abstract class AbstractPlayer extends Player {
void play(int pos) { /* 내용 생략 */ } // 추상메서드를 구현
// 두개의 메서드 중 하나의 메서드만 구현했으므로 abstract 붙여줘야함.
// 안붙이면 에러!!
}
abstract class Player { // 추상클래스
boolean pause; // 일시정지 상태를 저장하기 위한 변수
int currentPos; // 현재 Play되고 있는 위치를 저장하기 위한 변수 // 현재 재생 위치
Player() { // 추상클래스도 생성자가 있어야 한다.
pause = false;
currentPos = 0;
}
/**
* 지정된 위치(pos)에서 재생을 시작하는 기능이 수행하도록 작성되어야 한다.
*/
abstract void play(int pos); // 추상메서드
/**
* 재생을 즉시 멈추는 기능을 수행하도록 작성되어야 한다.
*/
abstract void stop(); // 추상메서드
/*
인스턴스 메서드도 추상메서드를 사용할 수 있다.
왜냐? 인스턴스 메서드 객체 생성 후에 호출할 수 있으니까
아직 객체 생성안했으니까 play() 메서드 호출 안됨.
상속을 통해 자손이 추상메서드를 완성한 후에
자손 객체 생성하면 호출할 수 있다.
*/
void play() {
play(currentPos); // 추상메서드를 사용할 수 있다.
}
}
abstract class Player { // 추상클래스
abstract void play(int pos);
abstract void stop();
}
class AudioPlayer extends Player {
void play(int pos) {
System.out.println(pos + "위치부터 play합니다.");
}
void stop() {
System.out.println("재생을 멈춥니다.");
}
}
public class TT {
public static void main(String[] args) {
AudioPlayer ap = new AudioPlayer();
ap.play(100);
ap.stop();
Player ap2 = new AudioPlayer(); // 다형성
ap2.play(100);
ap2.stop();
}
}
🤔 추상클래스의 작성법은?
✔ 여러 클래스에 공통적으로 사용될 수 있는 추상 클래스를 바로 작성하거나
기존 클래스의 공통 부분을 뽑아서 추상클래스를 만든다.
public class TTTT {
public static void main(String[] args) {
Unit[] group = new Unit[3];
group[0] = new Marine();
group[1] = new Tank();
group[2] = new Dropship();
for (int i = 0; i < group.length; i++)
group[i].move(100, 200); // 가능
Object[] group2 = new Object[3];
group2[0] = new Marine();
group2[1] = new Tank();
group2[2] = new Dropship();
for (int i = 0; i < group2.length; i++)
group2[i].move(100, 200); // 불가능 // 왜냐? Object에는 move없으니까
}
}
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) {
System.out.println("Marine[x=" + x + ",y=" + y + "]");
}
void stimPack() { /* 스팀팩을 사용한다 */ }
}
class Tank extends Unit {
void move(int x, int y) {
System.out.println("Tank[x=" + x + ",y=" + y + "]");
}
void changeMode() { /* 공격모드를 변환한다. */ }
}
class Dropship extends Unit { // 수송선
void move(int x, int y) {
System.out.println("Dropship[x=" + x + ",y=" + y + "]");
}
void load() { /* 선택된 대상을 태운다. */ }
void unload() { /* 선택된 대상을 내린다. */ }
}
🤔 인터페이스(interface)란?
✔ 추상 메서드의 집합
✔ 구현된 것이 전혀 없는 설계도(껍데기(모든 멤버가 public))
✅ 추상 클래스(abstract class)와 인터페이스(interface)의 차이는?
✔ 추상클래스 : 일반 클래스(추상 메서드를 가지는 일반 클래스), IV 가짐
✔ 인터페이스 : 추상 메서드 말고 아무것도 못가짐. IV 못가짐
🤔 인터페이스의 상속?
✔ 인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상 아님)
✔ 다중 상속이 가능(부모 여러 개) (추상메서드는 충돌해도 문제 없음.)
🤔 인터페이스의 구현
✔ 인터페이스에 정의된 추상 메서드를 완성하는 것
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 추상메서드를 모두 구현해야 한다.
}
✔ 일부만 구현하는 경우, 클래스 앞에 abstract를 붙여야 함.
public class P implements Fightable {
public void move(int x, int y) { /* 내용 생략 */ }
public void attack(Unit u) { /* 내용 생략 */ }
}
interface Fightable {
void move(int x, int y);
void attack(Unit unit);
// Fighter 클래스는 Fightable 인터페이스를 구현했다.
}
🤔 인터페이스란?
추상메서드의 집합!
🤔 인터페이스의 구현이란?
인터페이스의 추상메서드 몸통{} 만들기!(미완성 설계도 완성하기)
abstract class Player { // 추상클래스(미완성 클래스)
abstract void play(int pos);
abstract void stop();
}
class AudioPlayer extends Player {
/*
상속을 통해 미완성 설계도(Player)를 완성시킴(AudioPlayer)
*/
void play(int pos) { /* 내용 생략 */ } // 추상메서드를 구현
void stop() { /* 내용 생략 */ } // 추상메서드를 구현
}
interface Fightable {
/*
interface(Fightable)를 구현해서 설계도를 완성(Fighter)시킴.
*/
void move(int x, int y);
void attack(Unit u);
}
class Fighter implements Fightable {
public void move(int x, int y) { /* 내용 생략 */ }
public void attack(Unit u) { /* 내용 생략 */ }
}
✅ 추상클래스와 인터페이스의 공통점은?
✔ 추상 메서드를 가지고 있다.(미완성 설계도)
✅ 추상 클래스와 인터페이스의 차이점은?
✔ 인터페이스는 iv를 가질 수 없다.
다음 포스팅은 자바의 정석 Ch7 마지막 포스팅이 될 것 같다.
열심히 공부하자. 📙
얼마 안남았다! 더 열심히 공부하자. 🔥
'프로그래밍 > 자바' 카테고리의 다른 글
- Total
- Today
- Yesterday
- Java
- 해커랭크 챌린지
- 자바의 정석
- 디버깅
- hackerrank
- ORM
- 풀이
- JPA
- 정보처리산업기사
- 22 정보처리산업기사
- challenges
- 챌린지
- 개발자
- 백준
- 정보처리산업기사 공부법
- 자바
- 해커랭크
- 소스코드
- 코드
- BAEKJOON
- queue
- 해커랭크 자바 챌린지
- LinkedList
- stack
- 해커랭크 자바
- 그리디
- 22 정보처리 산업기사
- 강의
- 정보처리 산업기사
- hackerrank challenges
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |