이 강의는 자바의 프로젝트를 어떻게 만드는지, 또한 빌드를 어떻게 하는지에 대한 강의를 진행하지 않는다.
그러나 자바의 기본적인, 그리고 자바에 필수적인 기능들도 분명 존재하고 이 블로그엔 그 작업에 필요한 포스팅도 함께 제공하고 있다.
그 정보를 확인하고 싶다면 여기를 참조하라. 양이 조금 되고 현재진행형으로 늘어나고 있으므로 페이지내의 찾기(ctrl+f 나 cmd+f)로 찾아보도록하자.
저번시간에 abstract class에서 배웠다.
이제 상속에 대해서 다시 이야기해볼려고한다.
abstract class나 일반 class나 상속을 사용할 수 있는데 일반적으로 상속은 다중상속이 되지 않는다.
즉 클래스의 상속은 하나의 클래스만을 상속할 수 있다는 것이다.
이러한 방식은 상속관계에서 혹시나 일어날 수 있는 모호성(ambiguity)을 방지하는데 도움을 준다.
그러나 다중 상속이 안된는건 좀 아쉽다.
그래서 나온 문법이 interface이다. interface는 좀 특별한 객체인데 모든 메소드가 abstract로 실체가 없고 변수를 가지지 않는다.
아래의 예제를 보자.
package com.jiharu.person;
public interface Person {
public final static int foot = 2;
public static int hand = 2;
public int mouth = 1;
int eye = 2;
public abstract void run();
public void sleep();
void eat();
static void breath() {
System.out.println("헉,헉, 살기 위해 숨쉼!");
}
default void eatChicken() {
System.out.println("치킨 맛있엉!");
}
}
이는 interface를 사용한 예제이다.
총 4개의 필드가 존재하며 총 5개의 메소드가 존재한다.
먼저 필드를 보도록 하자.
필드는 무조건적으로 public final static가 된다.
즉 foot과 hand, mouth,eye는 모두 public final static이다.
그렇기에 사실 길게 적을 필요가 없다. 그냥 자료형만 적어주면된다.
또한 메소드 역시 일반적으로는 public abstract가 된다.
eat, sleep,run 셋다 모두 public abstract가 된다.
그러나 예외적으로 본체를 가질 수 있는 메소드들이 있는데 바로 static과 default이다.
static의 경우에는 이미 알것이므로 패스하고 default의 경우에는 말그대로 기본으로 사용하는 메소드라는 뜻으로
인터페이스에서만 사용할 수 있는 문법이다. 사실 default는 잘 사용되지는 않는 문법인데
이 역시 오버라이딩 하여서 사용할 수있다.
즉 abstract로 만들기에는 뭔가 내용이 있어야 할 경우 사용하긴 하는데 필자는 사용하는걸 거의 본적은 없다.
interface역시 사용방식은 abstract class와 굉장히 유사하다.
무조건 상속해서 사용해야하며 인스턴스를만들수 없고 메소드들을 오버라이딩 해줘야하기 떄문이다.
그러나 abstract클래스와의 가장큰 차이점은 상속하는 방식에 있다.
이때까지 클래스의 상속, 즉 단일 상속의 명령어는 extends였다.
interface는 extends가 아니라 implements를 사용한다. 예시를 보자.
package com.jiharu.person;
public class Jiharu implements Person {
public void run() {
System.out.println("달려");
}
public void sleep() {
System.out.println("잘자");
}
public void eat() {
System.out.println("먹자먹자");
}
}
위는 상속받은 예시이다. 상속받는 지시자가 implements이며 다중상속이 가능하므로
여러가지의 인터페이스를 상속받는다면 ,로 연결하여 여러개를 상속받을 수도 있다.
'Programming > Java' 카테고리의 다른 글
[Java-23]익명 클래스(Anonymus Class) (0) | 2017.11.09 |
---|---|
[Java-22]내포클래스(Nested Class) (0) | 2017.11.09 |
[Java-20]추상클래스(abstract class) (0) | 2017.11.05 |
[Java-19]타입형 변환(Type Casting) (0) | 2017.11.05 |
[Java-18]다형성(Polymorphism) (0) | 2017.10.27 |