티스토리 뷰
인터페이스란 ? 완벽한 abstract 클래스라고 표현할 수 있다.
객체와 객체사이의 상호작용을 나타낸다 (약속)
(abstract 클래스를 다시 공부하시려면 링크를 이용하세요.)
인터페이스의 특성
|
인터페이스 |
1. 구현하기 위해 implement를 사용 2. 오직 추상메소드와 상수로만 이루어져 있다. 3. 인터페이스 안에서 선언되는 메소드는 모두 묵시적으로 public, abstract |
인터페이스와 추상클래스
|
No. |
인터페이스 |
추상클래스 |
|
1 |
클래스가 아니며 interface로 선언 |
클래스(class)이다. |
|
2 |
public abstract 추상메소드만 가진다. |
일반메소드, 추상메소드를 가질 수 있다. |
| 3 |
구현을 하며 implements로 서브 클래스를 정의한다. |
확장 가능하며 extends로 하위 클래스 정의한다. |
| 4 |
다중 구현(상속)이 가능하다. |
단일 상속만 가능하다. |
| 5 |
변수는 가질 수 없으며, static final 형태의 상수만 가진다. |
변수와 상수 모두 가질 수 있다. |
기본적인 이론을 가지고 실습을 통해 공부하겠습니다.
처음으로 인터페이스를 배우기 전 객체지향 프로그래밍을 진행 한 경우입니다.
미닫이, 여닫이 문 클래스를 만들고 House라는 클래스를 만들어서 메인 클래스에서 사용하는 예 입니다.
여닫이 문 클래스 입니다.
// 여닫이 문 클래스
public class HingedDoor {
public void openDoor(){
System.out.println("문을 앞으로 밀어서 열기");
}
public void closeDoor(){
System.out.println("문을 뒤로 당겨서 닫기");
}
}
미닫이 문 클래스 입니다.
// 미 닫이 문
public class SlideDoor {
public void openDoor(){
System.out.println("문을 옆으로 밀어서 연다.");
}
public void closeDoor(){
System.out.println("문을 옆으로 밀어서 닫는다.");
}
}
House1 클래스 입니다.
public class House {
// extends SlideDoor는 안된다.
// 좋지 않은 관계 이다.
// 문
// 슬라이드 도어 (미닫이 문)
// 1단계
// House 클래스가 SlideDoor 클래스를 가지고 있다. ('House' Has - a 'SlideDoor')
private SlideDoor slideDoor; // House가 SlideDoor를 가졌다.
private HingedDoor hingedDoor;
public House() {
slideDoor = new SlideDoor();
hingedDoor = new HingedDoor();
}
public void in() {
slideDoor.openDoor();
System.out.println("집에 들어옴");
}
public void out() {
System.out.println("집에서 나감");
slideDoor.closeDoor();
}
public void in2() {
hingedDoor.openDoor();
System.out.println("집에 들어옴");
}
public void out2() {
System.out.println("집에서 나감");
hingedDoor.closeDoor();
}
}
메인 클래스 입니다.
public class ExampleHouse{
public static void main(String[] args) {
House house=new House();
house.in();
house.out();
}
}
위 예제와 다르게 인터페이스를 사용하여 실습하도록 하겠습니다.
인터페이스 클래스 입니다.
public interface IDoor {
// 인터페이스의 특징
// 1) 인터페이스 내의 모든 메소드는 추상화된 형태의 메소드이다. (자동으로 public abstract가 묵시적으로 설정된다.)
// 2) 일반적인 클래스처럼 멤버변수, 멤버메소드를 가질 수 없다.
// => 구현된 메소드와 멤버변수는 인터페이스에 작성할 수 없다.
// 3) static 형태의 메소드는 구현된 형태로 존재할 수 있다.
// 4) 인터페이스의 모든 변수는 public static final 형태의 상수로 존재한다.
// 5) 인터페이스는 확장 (extends)의 개념이 아닌 implements (구현)의 개념으로 접근한다.
// 6) 클래스와 다르게 다중상속 (구현)이 가능하다.
// 일반 메소드 형태로 구현이 불가
// public void foo(){}
// static 메소드는 구현 가능
public static void goo(){
System.out.println("인터페이스 내에 사용 가능");
}
int temp = 10; // 변수 선언 시 자동으로 static final(상수)화
///////////////////////////////////////////////
// 인터페이스에는 추상화 메소드만 있어야 한다.
void openDoor();
void closeDoor();
}
인터페이스를 사용한 여닫이 문 클래스 입니다.
public class HingedDoor2 implements IDoor{
@Override
public void closeDoor() {
// TODO Auto-generated method stub
System.out.println("문을 앞으로 밀어서 연다.");
}
@Override
public void openDoor() {
// TODO Auto-generated method stub
System.out.println("문을 뒤로 당겨서 닫는다.");
}
}
인터페이스를 사용한 미닫이 문 클래스 입니다.
public class SlideDoor2 implements IDoor{
@Override
public void closeDoor() {
// TODO Auto-generated method stub
System.out.println("문을 옆으로 밀어서 연다.");
}
@Override
public void openDoor() {
// TODO Auto-generated method stub
System.out.println("문을 옆으로 밀어서 닫는다.");
}
}
인터페이스를 사용한 회전문 클래스 입니다.
public class RevolvingDoor implements IDoor {
@Override
public void openDoor() {
// TODO Auto-generated method stub
System.out.println("문을 회전하여 연다.");
}
@Override
public void closeDoor() {
// TODO Auto-generated method stub
System.out.println("문을 회전하여 닫는다.");
}
}
House2 클래스 입니다.
public class House2 {
IDoor iDoor;
public House2(IDoor idoor) {
this.iDoor = idoor;
}
public void in() {
iDoor.openDoor();
System.out.println("집에 들어감");
}
public void out() {
System.out.println("집에서 나옴");
iDoor.closeDoor();
}
}
메인 클래스 입니다.
public class ExampleInterface{
// 회전문 : RevolvingDoor
public static void main(String[] args) {
House2 slideHouse = new House2(new SlideDoor2());; // 미닫이 문을 가진 집
House2 hingedHouse = new House2(new HingedDoor2());// 여닫이 문을 가진 집
House2 revolvingHouse = new House2(new RevolvingDoor());
slideHouse.in();
slideHouse.out();
System.out.println();
hingedHouse.in();
hingedHouse.out();
System.out.println();
revolvingHouse.in();
revolvingHouse.out();
}
}
'프로그래밍 > Java' 카테고리의 다른 글
| 자바 ! 다형성 ( Polymorphism , Upcasting , Downcasting ) (0) | 2017.05.05 |
|---|---|
| 자바 ! Object 클래스 ( toString(), equals() 메소드 등..) (0) | 2017.05.01 |
| 자바 ! 오버라이딩, 추상클래스 (overriding, abstract) (1) | 2017.04.26 |
| 자바 ! 생성자 오버로딩과 this 키워드 (0) | 2017.04.25 |
| 자바 ! 상속 (extends , super) (0) | 2017.04.24 |
