일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 2022 플러터 설치
- rxjava disposable
- 객체
- 클래스
- 서비스 쓰레드 차이
- 2022 플러터 안드로이드 스튜디오
- 자바 다형성
- jvm 작동 원리
- rxjava cold observable
- 플러터 설치 2022
- 스택 자바 코드
- Rxjava Observable
- ANR이란
- 안드로이드 유닛 테스트
- android retrofit login
- 서비스 vs 쓰레드
- 멤버변수
- android ar 개발
- 안드로이드 레트로핏 사용법
- ar vr 차이
- rxjava hot observable
- 안드로이드 os 구조
- 큐 자바 코드
- jvm이란
- 안드로이드 라이선스
- 안드로이드 유닛테스트란
- 안드로이드 라이선스 종류
- 안드로이드 유닛 테스트 예시
- 안드로이드 레트로핏 crud
- 스택 큐 차이
- Today
- Total
나만을 위한 블로그
[JAVA] 인터페이스란? 본문
20.10.06 - 코드블럭에 코드 삽입
인터페이스 사전적 정의 : 접속기, 접점(두 가지 주제시스템 등이 서로 만나서 영향을 주고받는 영역)
지식백과 : 사물과 사물 사이 또는 사물과 인간 사이의 경계에서 상호 간의 의사소통을 위해 만들어진 물리적 매개체나 프로토콜
자바의 인터페이스 : 구현된 것은 없는 밑그림만 가진 기본 설계도, 일반 메서드나 멤버 변수를 가질 수 없고 오직 추상 메서드와 상수만을 멤버로 가질 수 있다. 추상 클래스보다 추상화 수준이 더 높다.
기능에 대해 선언만 한 상태, 모든 기능을 추상화로 정의한 상태. 즉, 모든 메서드의 선언만 정의하고 그 기능에 대해 주석만 써둔 상태, 추상 클래스처럼 구현되지 않은 멤버를 포함하므로 객체화를 시킬 수 없고, 인터페이스를 상속받은 클래스에서 멤버를 구현한 뒤 자식 클래스를 객체화해 사용한다.
인터페이스를 쓰는 이유 : 코드의 가독성 때문 - 추상 클래스는 필드를 가질 수 있어 코드를 볼 때 봐야 할 것이 여러가지지만, 인터페이스는 어떤 기능을 하는지 간략하게 볼 수 있기 때문.
완벽한 추상화를 달성하기 위함, 다중상속 기능 지원 가능, 약한 결합 이룰 수 있게 함, 다형성 사용 가능
정리 : 인터페이스는 추상화 정도가 추상 클래스보다 높은 개념으로, 몸통이 있는 일반 메서드나 멤버변수를 가질 수 없다. 오직 추상 메서드와 상수만을 멤버로 가질 수 있다.
- 인터페이스 작성 방법
예약어로 interface를 사용하며 접근 제어자로 public or default를 사용한다. 나는 public을 주로 사용한다.
모든 멤버 변수는 public static final이어야 하며 이를 생략할 수 있다.
모든 메서드는 public abstract여야 하며 이를 생략할 수 있다.
코드로 쓰면 이런 느낌일 것 같다.
public interface 인터페이스명 {
public static final 자료형 SANGSU = 값;
public abstract 메서드명(매개변수목록);
}
클래스 만드는 거랑 별 다를 게 없다. 내용물만 좀 다를 뿐.
- 인터페이스 사용법
1. 클래스는 클래스를 extends해서 사용하지만, 클래스는 인터페이스를 implements(뜻 : 구현)해서 사용한다.
2. 인터페이스는 인터페이스로부터만 상속받을 수 있다. 클래스와 달리 여러 인터페이스로부터 상속받는 다중 상속이 가능하다.(A extends B, C {})
※ 구현하는 인터페이스의 메서드 중 일부만 구현한다면 abstract를 붙여서 추상 클래스로 선언해야 한다.
abstract class Human implements Coding {
public void moving(int x, int y) { 내용 }
}
인터페이스 이름 중에는 주로 '~able'이 붙는 경우가 많은데, 이유는 어떤 기능 or 행위를 하는데 필요한 메서드를 제공한다는 의미를 강조하기 위해서다. 그렇다고 모든 인터페이스 이름이 ~able로 끝나야 하는 건 아니다.
- 인터페이스 예제
interface Animal
{
// cry()라는 메서드명만 정의해놓은 Animal 인터페이스를 만든다
public abstract void cry();
}
// Cat 클래스에서 Animal 인터페이스를 implements해서 cry()를 쓸 수 있도록 한다
class Cat implements Animal
{
@Override
public void cry()
{
// cry()가 수행할 작업 내용을 작성한다. Cat 클래스의 cry()는 냐옹냐옹이라는 문장을 print한다.
System.out.println("냐옹냐옹!");
}
}
//마찬가지로 Dog 클래스에도 Animal 인터페이스를 implements한다
class Dog implements Animal
{
@Override
public void cry()
{
// Dog 클래스의 cry()는 멍멍이라는 문장을 출력하도록 한다
System.out.println("멍멍!");
}
}
public class Polymorphism03 {
public static void main(String[] args) {
// Cat, Dog 클래스의 객체를 각각 생성 후
Cat cat = new Cat();
Dog dog = new Dog();
// 각 객체를 참조해 클래스 별 cry()를 호출한다
cat.cry();
dog.cry();
}
}
위 예제의 실행 결과는
이라는 결과가 나온다. cat이 dog보다 위에 있기 때문에 냐옹냐옹이 먼저 나오고 그 밑에 멍멍이 나오며, Cat 클래스와 Dog 클래스에 있는 cry()의 작업 내용이 다르기 때문에 각각 다른 결과값이 나오는 걸 볼 수 있다.
실제로 사용할 때는 다른 내용이나 좀 더 복잡한 메서드 내용을 써서 사용하면 될 것 같다.