본문 바로가기

JAVA

java #7 디폴트 메서드와 static 메서드, 추상 클래스와 인터페이스(복습)

1.추상 클래스
1)추상클래스란?
미완성 설계도(부족한), 미완성 메서드를 갖고 있는 클래스 
메소드 = 선언부 존재 + 구현부 존재
추상메소드 = 선언부 존재 + 구현부 존재하지 않음

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

-> 추상메서드를 갖고 있으면 추상 클래스

 

2)특징
a. 다른 클래스 작성에 도움을 주기 위한 것. 인스턴스 생성불가

ex) Player p = new Player(); // 에러 추상클래스의 인스턴스 생성불가


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

ex) class AudioPlayer extends Player {
	void play(int pos) { 내용 생략 } // 추상메서드 구현 -> 추상메서드 몸통{} 만들기
	void stop() { 내용 생략} // 추상메서드 구현 -> 추상메서드 몸통{} 만들기 (abstract 안붙임)
}
AudioPlayer ap = new AudioPlayer(); // 이건 Ok.

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

ex) 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) {} 
} // 추상클래스인 이유 : Player 클래스를 상속 받았는데 안에 메소드를 1개만 구현했기 때문에! 


4)추상클래스의 작성
여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존클래스의
공통 부분을 뽑아서 추상클래스를 만든다.
ex) 각 클래스의 공통 부분을 뽑아서 추상클래스로 만들고 그 추상클래스를 상속시켜서
각 클래스를 간결하게 사용가능

5)추상클래스의 장점
간리가 용이(변경)
단계별로(의미있는) 작성해 놓으면 나중에 변경이나 그것을 토대로 재생성할 때 중복도 제거되고
작성이 쉬워진다.

6)추상화 <-> 구채화
a. 추상화된 코드는 구체화된 코드보다 유연하다. 변경에 유리.

ex) GreorianCalendar cal = new GreorianCalendar (); // 구체적
     Calendar cal = Calendar.getInstance(); // 추상적


2. 인터페이스(interface)
1) 인터페이스란?
: 추상 메서드의 집합 (프로그래밍 관점) 외우기@@
  구현된 것이 전혀 없는 설계도. 껍데기(모든 멤버가 public)

ex) interface 인터페이스이름 {
	public static final 타입 상수이름 = 값;
	public abstract 메서드이름(매개변수목록);
}


ex) 인터페이스 안에 public abstract 생략 가능  왜냐면 안써도 abstract 이기 때문에
     상수도 항상 public static final 임! 생략가능 왜냐면 예외가 없으니까

 


2) 인터페이스 <-> 추상클래스
추상클래스는 일반 클래스인데 추상 메서드를 갖고 있음(생성자, iv 갖고 있음)
인터페이스는 추상클래스 빼고 아무 것도 가진게 없음 (추상 메서드의 집합)

3) 인터페이스의 상속
인터페이스의 조상은 인터페이스만 가능(Object가 최고 조상 아님)
다중 상속이 가능(추상 메서드는 충돌해도 문제 없음)

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

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

일부만 구현하는 경우 클래스 앞에 abstract를 붙여야 함
인터페이스 Fightable 의 메소드가 2개임  

ex)  abstract class Fighter implements Fightable {
	public void move(int x, int y) { 내용 생략}
}


5) 추상 클래스와 인터페이스의 공통점은?
추상메서드를 가지고 있다(미완성 설계도)

6) 추상 클래스와 인터페이스의 차이점은?
인터페이스는 iv를 가질 수 없다.

7) 인터페이스를 이용한 다형성
  a.인터페이스도 구현 클래스의 부모?
  b.인터페이스 타입 매개변수는 인터페이스 구현한 클래스의 객체만 가능

 

ex) calss Fighter extends Unit implements Fightable {
	public void move(int x, int y ) { 내용 생략 }
	public void attack(Fightable f) { 내용 생략 }
}
Interface Fightable {
	void move(int x, int y );
	void attack(Fightable f);
} // -> Fightable 인터페이스를 구현한 클래스의 인스턴스만 가능

Unit u = new Fighter();
Fightable f = new Fighter();

f.move(100,200);
f.attack(new Fighter());

 c. 인터페이스를 메서드의 리턴타입으로 지정할 수 있다.

 

8) 인터페이스의 장점
a. 두 대상(객체) 간의 연결 , 대화 , 소통을 돕는 '중간 역할'을 한다.
b. 선언(설계)와 구현을 분리시킬 수 있게 한다.
c. 개발 시간을 단축할 수 있다.
d. 변경에 유리한 유연한 설계가 가능하다.
e. 표준화가 가능하다.
f. 서로 관계없는 클래스들을 관계를 맺어줄 수 있다.

 

3. 디폴트 메서드와 static 메서드
1) 디폴트 메서드와 static 메서드란?
a. 인터페이스에 디톨프 메서드, static 메서드 추가 가능
b. 인터페이스에 새로운 메서드(추상 메서드)를 추가하기 어려움
                     해결책 => 디폴트 메서드
c. 디폴트 메서드는 인스턴스 메서드 인터페이스 원칙 위반 (원래 인터페이스는 abstract 여야 하는데 예외 상황이 생긴 것!!)

2) 디폴트 메서드가 기존의 메서드와 충돌할 때의 해결책
a. 여러 인터페이스의 디폴트 메서드 간의 충돌
 - 인터페이스를 구현한 클래스에서 디폴트 메서드를 오버라이딩해야 한다.
b. 디폴트 메서드와 조상 클래스의 메서드 간의 충돌
 - 조상 클래스의 메서드가 상속되고, 디폴트 메서드는 무시된다.

 

4. 내부 클래스
1) 내부 클래스란?
클래스 안의 클래스
ex) class A { // (B의) 외부 클래스
          ...
class B { // (A의) 내부 클래스
// 객체생성 없이도 A의 맴버접근가능
}
         ....
}
2) 내부 클래스의 장점
a. 내부 클래스에서 외부 클래스의 맴버들을 쉽게 접근할 수 있다.
b. 코드의 복잡성을 줄일 수 있다. (캡슐화)