11. class(추상화)
11.1 객체지향 프로그래밍의 4대 특성
11.2 추상화
11.2.1 객체에서 공통된 속성과 행위를 추출하는 것
11.2.2 자바 프로그램에서의 추상화
11.2.2.1 추상클래스
1개 이상의 추상 메서드
11.2.2.2 인터페이스
모두 추상 멤버
11.3 추상 클래스(abstract class)
11.3.1 abstract method(미완성 메서드)를 포함하고 있는 클래스
abstract method: 선언부만 있고 구현부(body)가 없는 메서드
11.3.2 추상클래스는 인스턴스를 생성할 수 없다.
추상클래스를 상속받는 자식클래스에서 abstract method를 완성해야 함
11.3.4 코드의 공통적인 부분을 제시하고 표준화하기 위한 용도로 활용됨
abstract class Player {
// 현재 Play되고 있는 위치를 저장하기 위한 변수
int currentPos;
Player() {
currentPos = 0;
}
abstract void play(int pos); // 추상 메서드
abstract void stop(); // 추상 메서드
void play() {
// 추상 메서드를 사용할 수 있다.
play(currentPos);
}
// (...)
}
11.4 인터페이스(interface)
11.4.1 추상메서드와 상수만을 멤버로 가질 수 있다.
추상클래스보다 추상화 정도가 높다.
11.4.2 인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.
미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.
이벤트처리 등에 활용됨
11.4.4 유연한 설계가 가능하고 유지보수가 쉬워진다.
11.4.5 인터페이스의 구현(implements)
11.4.5.1 문법
class 클래스이름 extends 부모클래스 implements 인터페이스
11.4.5.2 인터페이스에 정의된 추상메서드를 완성해야 한다.
11.4.6 인터페이스의 장점
인터페이스를 활용하면 유연한 개발이 가능해진다.
A는 B의 method만 호출하면 된다.
A는 C의 존재와 내용을 몰라도 B를 통해 기능을 사용할 수 있다.
C의 변경이 A에 영향을 미치지 않는다(느슨한 결합이 가능해짐)
C의 핵심적인 기능을 자유롭게 변경할 수 있게 된다.
A(class) → B(interface) → C(interface를 구현한 클래스)
11.4.7 인터페이스의 사용 예
class PersonUse {
Person p;
void connect() {
p = new PersonImpl();
p.login(); // 인터페이스를 구현한 클래스의 method가 호출됨
}
public interface Person() {
void login();
}
class PersonImpl implements Person {
public void login() { }
}
}
11.4.8 의존 관계
11.4.8.1 의존 관계
B의 코드가 변경되면 A의 코드도 변경되는 경우
A와 B는 의존관계가 있다.
A는 B에 의존한다.
A B
코드 변경 발생 유연한 확장이 어려움
11.4.8.2 강한 결합과 느슨한 결합
B의 코드 변경이 A에 영향을 미치지 않도록 느슨하게 설계
A B
코드 변경 불필요 유연한 확장이 가능함
핵심 기능의 변경이 쉬워짐
11.4.8.3 강한 결합은(결합도가 높으면) 유지보수를 어렵게 함
한 곳의 수정 → 나비효과
11.4.8.4 강한 결합과 느슨한 결합
// 생성자가 private으로 바뀌면 // MemberUse 클래스도 수정해야 함 class MemberUse { public MemberUse() { Member m = new Member(); } } public class Member { String userid; String passwd; String name; public → private Member() {
} } |
// 생성자가 private으로 바뀌워도 // 영향을 받지 않음 class MemberUse { public MemberUse(Member m) {
} } public class Member { String userid; String passwd; String name; private Member() {
} } |