*이 글은 개인적인 공부/기록 목적으로 올립니다.
부족하다고 느껴질 수 있는 글이니 양해 부탁드립니다.*
참고도서
http://www.yes24.com/Product/Goods/24259565
Java의 정석 - YES24
최근 7년동안 자바 분야의 베스트 셀러 1위를 지켜온 `자바의 정석`의 최신판. 저자가 카페에서 12년간 직접 독자들에게 답변을 해오면서 초보자가 어려워하는 부분을 잘 파악하고 쓴 책. 뿐만 아
www.yes24.com
■ 추상 클래스(abstract class)
추상 클래스란 클래스가 설계도라고 비유하면
추상 클래스는 미완성 클래스라고 생각하면 쉽다.
추상 메서드(미완성 메서드)를 포함하고 있는 클래스라고 알고 있으면 되고
일반 메서드가 추상 메서드를 호출할 수 있다.
추상 클래스는 완성된 설계도 아니기 때문에 인스턴스를 생성할 수 없으며
다른 클래스를 작성하는데 도움을 주는 목적의 클래스이다.
■ 추상 메서드(abstract method)
추상 메서드는 선언부만 있고 구현부가 없는 메서드를 말한다.
꼭 필요하지만 자식마다 다르게 구현될 것으로 예상되는 경우에 사용되며,
추상 클래스를 상속받는 자식 클래스에서 추상 메서드의 구현부를
완성해야 한다.
// 일반 클래스 구현
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() {...}
}
여러 클래스에 공통적으로 사영될 수 있는 추상 클래스를
바로 작성하거나 기존에 있는 클래스의 공통적인 부분을 추려서
추상 클래스로 만들면 구현해야 되는 클래스에 공통으로 모두 쓰일 수 있다.
■ 인터페이스(interface)
인터페이스란 추상 클래스와 비슷하지만 추상 클래스보다 추상화 정도가 높다.
실제로 구현된 것이 전혀 없는 기본 설계도라고 보면 되는데
추상 메서드와 상수만을 멤버로 가질 수 있다.
인터페이스는 두 대상(객체) 간의 연결을 돕는 '중간 다리' 역할을 한다.
선언과 구현을 분리시키는 것을 가능하게 한다.
인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.
미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.
인터페이스를 생성할 때 'class'가 아닌 'interface'로 작성해야 한다.
interface 인터페이스이름 {
public static final 타입 상수이름 = 값;
public abstract 메서드이름();
}
// 모든 멤버변수는 public static final 이여야 하며, 이를 생략할 수 있다.
// 모든 메서드는 public abstract 이여야 하며, 이를 생략할 수 있다.
인터페이스는 클래스처럼 상속도 가능하다.(클래스와 달리 다중 상속 허용)
interface Movable {
void move(int x, int y);
}
interface Attackable {
void attack(Unit u);
}
interface Fightable extends Movable, Attackable {}
인터페이스는 Object 클래스와 같은 최고 부모가 없다.
■ 인터페이스의 구현
인터페이스를 구현하는 것은 클래스를 상속받는 것과 똑같다.
다만, 'extends'가 아닌 'implements'를 사용해야 한다.
그리고 인터페이스에 정의된 추상 메서드를 완성해야 하며,상속과 구현이 동시에 가능하다.
class Fighter extends Unit implements Fightable {}
인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있으며,
인터페이스를 메서드의 매개변수 타입으로 지정할 수도 있다.
또한, 인터페이스를 메서드의 리턴 타입으로 지정할 수 있다.
■ 인터페이스의 장점
- 개발시간을 단축시킬 수 있다.
-> 일단 인터페이스가 작성되면, 이를 사용해서 프로그램을 작성하는 것이 가능하다.
메서드를 호출하는 쪽에서는 메서드의 내용에 관계없이 선언부만 알면 되기 때문이다.
그리고 동시에 다른 한 쪽에서는 인터페이스를 구현하는 클래스를 작성하도록 하여,
인터페이스를 구현하는 클래스가 작성될 때까지 기다리지 않고도 양쪽에서 동시에
개발을 진행할 수 있다. - 표준화가 가능하다.
->프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음,
개발자들에게 인터페이스를 구현하여 프로그램을 작성하도록 함으로써
보다 일관되고 정형화된 프로그램의 개발이 가능하다. - 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.
->서로 상속관계에 있지도 않고, 같은 조상클래스를 가지고 있지 않은
서로 아무런 관계도 없는 클래스들에게 하나의 인터페이스를 공통적으로
구현하도록 함으로써 관계를 맺어 줄 수 있다. - 독립적인 프로그래밍이 가능하다.
->인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에
실제구현에 독립적인 프로그램을 작성하는 것이 가능하다.
클래스와 클래스간의 직접적인 관계를 인터페이스를 이용해서
간접적인 관계로 변경하면, 한 클래스의 변경이 관련된 다른 클래스에
영향을 미치지 않는 독립적인 프로그래밍이 가능하다.
'코딩공부 > 자바' 카테고리의 다른 글
자바의 정석 - 자바의 열세 번째 이야기, 예외처리 (0) | 2023.03.13 |
---|---|
자바의 정석 - 자바의 열두 번째 이야기, 객체지향(8) (0) | 2023.03.09 |
자바의 정석 - 자바의 열 번째 이야기, 객체지향(6) (0) | 2023.03.07 |
자바의 정석(9) - 자바의 아홉 번째 이야기, 객체지향(5) (0) | 2023.03.06 |
자바의 정석(8) - 자바의 여덟 번째 이야기, 객체지향(4) (0) | 2023.02.22 |