티스토리 뷰
인터페이스란 ? 완벽한 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 |