6월 4일 복습하기
진짜..남궁성 쌤 강의는 들으면 들을수록 내공이 장난아닌 쌤이구나 생각듬
1.추상클래스
미완성 설계도 , 미완성 메서드를 갖고있음
추상클래스와 추상메서드에는 abstract를 붙임
인스턴스 생성 불가->왜? 미완성 설계도 이기 때문
다른 클래스 작성에 도움을 주기위함.
추상클래스를 가져다가 몸통을 구현해주면 완성된 설계도가 되어 객체생성이 가능하다.
2.추상메서드
미완성 메서드,구현부 몸통{}이 없는 메서드
abstract 리턴타입 메서드이름();
꼭필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우
추상메서드가 2개있을때 2개 모두 구현해줘야 하는데, 1개만 구현해줬을경우 클래스가 미완성이므로 클래스에는 abstract를 붙여줘야함
Player ap = new AudioPlayer();
로 선언할때 Player가 추상클래스인 부모타입이지만 에러가 안나는이유는
Player를 상속받은 AudioPlayer 클래스가 구현하여 완성클래스가 되어 new AudioPlayer();로 객체생성 되었기 때문
실체객체가 기능을 가지고 있으므로 부모타입 리모컨은 상관이 없당!!!
즉!!실제객체가 생성되었는지 멤버변수는 몇개인지가 중요하다!!!
3.추상클래스 작성
여러 클래스에 공통적으로 사용 될 수 있는 부분을 추상클래스로 만든다.
선언부는 동일하나 안에 구현부분이 다를때 추상메서드를 만든다.
추상클래스에 추상메서드를 쓰는 이유는
구현부가 다르기 때문이기도 하지만
같은 부모(공통적인 속성과 메서드가 있을때)를 상속받게하여
부모타입으로 묶어서 부모타입리모컨으로 각각의 자식 타입메서드를 한번에 바꿔주고 싶거나 동작시켜주고싶을때 쓰인다.
package study_0604;
abstract class Unit{
int x,y;
abstract void move(int x, int y);
void stop() { /*현재 위치에서 정지*/ }
}
class Marine extends Unit{
@Override
void move(int x, int y) {
System.out.println("Marine이"+x+"와"+y+"만큼 움직였다.");
}
void stimPack() {
System.out.println("Marine 고유 메서드");
}
}
class Tank extends Unit{
@Override
void move(int x, int y) {
System.out.println("Tank가"+x+"와"+y+"만큼 움직였다.");
}
void changeMode() {
System.out.println("Tank 고유 메서드");
}
}
public class Exam {
public static void main(String[] args) {
Unit u[]= {new Marine(),new Tank()};
for(int i=0;i<u.length;i++) {
u[i].move(100,200);
}
}
}
객체배열은 참조변수의 묶음 이다.
4.추상클래스 장점
설계도의 중복을 제거할수 있다.
즉, 설계도 의 일부만 A,B,C로 바꿀경우 원래대로라면 A,B,C에 맞게 3개가 필요하고 공통적인 부분도 불필요하게 적어줘야하나,
추상클래스로 상속받아 다른 부분만 A,B,C 특징에 맞게 구현하면 되므로 코드의 중복이 없다
변경이 있을시 관리가 용이하다.
추상클래스를 의미있는 단계별로 나눠놓으면 필요에 따라 중간단계부터 다시 수정시 수정이 용이하다.
추상화된 코드는 구체적인 코드보다 유연하다. 즉, 변경에 유리하다.
5.인터페이스
추상메서드의 집합
구현된 것이 전혀 없는 설계도.
껍데기(모든 멤버가 public)
(1)인터페이스와 추상클래스의 다른점이 무엇인가?
추상클래스는 추상메서드를 가지고 있는 점은 인터페이스와 동일하나 추가적으로 iv나cv, 생성자를 가질수 있음
인터페이스는 오직 추상메서드로만 이루어짐
(2)인터페이스안에 추상메서드는 public abstract 생략 가능하다.
왜? 인터페이스는 항상 public abstract 메서드만 가지고 있기때문.
상수또한 public static final 이기 때문 생략 가능
(3)인터페이스 조상은 인터페이스만 가능하다.
(4)다중상속이 가능
왜??추상메서드는 선언부만 같기때문에 충돌문제가 없다.
(5)인터페이스도 미완성 설계도인데,
인터페이스에 정의된 추상메서드를 완성 하는것을 인터페이스의 구현이다.
미완성 인터페이스를 상속받아서 추상메서드를 구현해줘야 객체생성가능
class 클래스이름 implements 인터페이스이름{...추상메서드 구현...}
6.인터페이스를 이용한 다형성
인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능
인터페이스를 메서드의 반환타입으로 지정할수 있다.
이럴경우 반환타입으로 지정한인터페이스를 상속받아구현한 클래스의 인스턴스를 반환한다. 추가로 자동 형변환이 가능한 객체도 가능!!!
7.인터페이스의 장점
(1)두 대상간의 연결,대화,소통을 돕는 중간역할을 한다.
사람이 기계를 직접다루는 것보다 껍데기를 씌어서 버튼으로 작동하게끔 중간에서 소통하는역할을함.
예)GUI프로그램인 윈도우
사용자의 편의성이 증가하고, 기계가 바껴도 인터페이스가 동일하다면 사용자는 다루는데 크게문제가 되지 않음.
(2)선언(설계)와 구현을 분리 시킬수 있다.
선언부를 인터페이스 추상메서드로 분리하고,
인터페이스를 상속받아 구현부를 덧붙이면 껕데기와 알맹이가 분리된것
필요에 따라 알맹이를 변경할수 있어 유연성이 증가한다.
(3)느슨한 결합이 가능함
A-직접소통->B 강한 결합(A나 B가 바뀌면 서로 영향이 있어 바꿔야함)
A-I-간전소통->B 느슨한 결합(A는 인터페이스I와 소통을 하기 때문에 B가바껴도 영향을 미치지 아니함,A변경불필요.)
(4)개발시간 단축
(5)변경에 유리한 설계가 가능하다.
(6)표준화가 가능
(7)서로관계 없는 클래스들을 관계를 맺어줄수 있다.
위에 그림을 보면 서로 관계 없는 SCV와 Tank,Dropship을 Repairable이라는 인터페이스로 묶어줘서
void repair(Repairable r){...}메서드를 만들때 매개변수에서 Repairable 을 구현한 객체만 들어올수 있음