[java] Interface 와 abstract
public interface TestInterface { public static int num = 8; public void func1(); public void func2(); } public abstract class TestAbstract { public abstract void func1() ; public void func2() { System.out.println("func2"); } }
3) abstract, interface 클래스를 사용하려면, abstract, interface 위 클래스를 상속받아서, 새로운 클래스를 생성한 후, instance화 할 수 있다.
소스2 에서 보는바와 같이 상속을 받은후, 사용해야 한다.
즉, childclass c = new childclass(); 는 컴파일시 에러가 발생하지 않는다.
[소스2]
class childclass1 extends TestAbstract { // Abstrace Method Overriding public void func1() { System.out.println("상속 받아서, Body를 채워줌"); } } class childclass2 implements TestInterface { public void func1() { System.out.println("Class Test1"); } public void func2() { System.out.println("Class Test2"); } }
* 차이점
1) Prototype만 있고 Body가 없는 메소드 즉, abstract 메소드라고 하는데, Abstract 클래스는 abstract 메소드와 일반 메소드를 혼용해서 가질수 있다. 즉, 일반메소드 + abstract 메소드 형태를 유지한다.
하지만, interface는 모든 메소드들이 abstract 메소드로 존재 해야 한다. 소스 1에서 보는봐와 같이 func1(), func2()는 모두 Body(내용) 이 없이 Prototype(선언만) 이 존재한다.
2) interface와 abstrace클래스를 상속받을때, 상속받는 키워드 가 다르다.
abstract클래스는 소스2처럼 extends를 사용하고, interface클래스는 implements 을 사용한다.
3) 다중상속 가능유무
Java에서는일반 클래스에서는 다중상속을 지원하지 않는다. 즉 2개이상의 클래스를 상속 받지 못하게 되어 있다. 하지만 interface의 경우에는 다중상속이 가능하다.
4) 클래스 시작 키워드가 다르다.
abstract클래스는 abstract class.. 형태로 시작하고, 인터페이스 클래스는 interface..로 시작한다.
* abstract 를 쓰는 이유는?
강제성(자식클래스에게 반드시 오버라이딩을 하게한다)
예로, Car 클래스의 speedUp()메서드는 Truck, Taxi 등의 하위 클래스에서 모두 다르게 구현해야 될 필요가 있는데, Car 클래스에서 이미 메서드가 있다면, 하위 클래스를 구현한느 프로그래머가 해당 메서드를 빼먹을 수 있다. 그러나, 추상 클래스로 최상위 클래스를 정의하면서 speedUp()메서드를 메서드를 추상메서드로 선언하면, 하위 클래스는 추상메서드를 반드시 오버라이딩 해주어야 하기 때문에, 하위의 모든 클래스가 speedUp()메서드를 만들어야 한다.
*abstract는 직접 객체화 될 수 없다.
(추상 메서드가 메서드 안에 내용이 없기 때문에, 메서드를 직접 호출할 수 없기때문이다.)
class A{ abstract void a(); }; // 에러 // 추상메서드가 하나라도 있으면 그 클래스는 추상 클래스로 해야한다.
아래처럼
abstract class A{ abstract void a(); }; //OK
new A(); // error 추상클래스는 객체화 될 수 없다.
==> 표준의 의미이다.
자식을 위해 존재하는 클래스(부모와같다.)
자식을 통해서 super의 의미로 객체가 생성이 되긴하지만 자기가 직접 객체생성은 되지 않는다.
구현부가 없다.
하위클래스에게 강제성을 부여하는 것은?
Abstract
abstract class A{ abstract void a(); }; class B extends A{ } // 에러
위 에러 해결하는 두가지 방법은?
1>> B클래스도 abstract로 만들어라
2>> a()메서드를 오버라이딩 해라
번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|---|
325 | Develop | [ios] 로컬에 있는 JS 파일 웹뷰에서 동적으로 실행하기 | hooni | 2015.02.10 | 958 |
324 | Develop | [ios] 문자열로 함수 실행하기 (eval 함수처럼) | hooni | 2015.02.10 | 855 |
323 | Develop | [ios] 미스터피자(Mr.pizza) 어플 | hooni | 2013.04.23 | 42633 |
322 | Develop | [ios] 배열(NSArray) 연산과 간단한 애니메이션(split images) | hooni | 2013.10.31 | 45451 |
321 | Develop | [ios] 비동기 블럭 코드 예제 | hooni | 2014.11.21 | 825 |
320 | Develop | [ios] 비디오,네트워크,소셜로그인 테스트 | hooni | 2017.04.04 | 692 |
319 | Develop | [ios] 상위 ViewController 가져오기 | hooni | 2015.10.12 | 958 |
318 | Develop | [ios] 새로 만들고 있는 DateMemo | hooni | 2016.07.12 | 608 |
317 | Develop | [ios] 설정에서 푸시 알림(APNS) on/off 상태 확인 | hooni | 2015.04.28 | 2047 |
316 | Develop | [ios] 소소한 팁 (Rect,Point,Path,URL 등) | hooni | 2013.08.08 | 29456 |
315 | Develop | [ios] 스크린 캡쳐 (전원버튼 + 홈버튼) 호출 알아내기 | hooni | 2014.11.19 | 1556 |
314 | Develop | [ios] 스터디 자료 (from 종길M) | hooni | 2013.06.04 | 0 |