일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 자바의정석
- 입출력
- over()
- spring security 설정
- 다형성
- hackerrank
- 멀티태스킹
- 리눅스
- spring security
- continue 사용법
- 붕대 감기 자바
- 캡슐화
- SQL Mapper
- 혼공얄코
- 쿠키
- 객체지향
- 오블완
- contiune
- 오버로딩
- 프로그래머스
- CPU
- 자바의 정석
- break 사용법
- java
- 붕대 감기
- 티스토리챌린지
- 중첩 break
- 오버라이딩
- 프로그래머스 붕대 감기
- 멀티프로세싱
- Today
- Total
쉽게 쉽게
인터페이스 본문
이 글은 '자바의 정석'의 내용을 기반으로 공부한 내용을 덧붙인 글입니다.
1.인터페이스란
*추상클래스가 부분적으로 완성된 '미완성 설계도'이면,
인터페이스는 구현된 것은 아무것도 없는 '기본 설계도'라 할 수 있다.
인터페이스는 추상클래스(abstract)처럼 추상메서드를 갖지만 추상화 정도가 높아서 추상클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으로 가질 수 없다. (추상클래스와의 차이점)
오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 어떠한 요소도 허용되지 않는다.
★ 추상클래스란
하나 이상의 추상 메소드를 포함하는 클래스를 가리켜 추상 클래스(abstract class)라고 한다.
추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해준다.
즉, 반드시 사용되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언하면, 이 클래스를 상속받는 모든 클래스에서는 이 추상 메서드를 반드시 재정의해야 한다.
예를 들어 모듈처럼 중복되는 부분이나 공통적인 부분은 미리 다 만들어진 것을 사용하고, 이를 사용하는 쪽에서는 자신에게 필요한 부분만을 재정의하여 사용하면 생산성이 향상되고 배포 등이 쉬워진다.
abstract class Animal { abstract void cry(); }
// 추상 메소드는 선언부만이 존재하며, 구현부는 작성되어 있지 않다.
//이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용
class Cat extends Animal { void cry() { System.out.println("냐옹냐옹!"); } }
class Dog extends Animal { void cry() { System.out.println("멍멍!"); } }
public class Polymorphism02 {
public static void main(String[] args) {
// Animal a = new Animal(); // 추상 클래스는 인스턴스를 생성할 수 없음.
Cat c = new Cat();
Dog d = new Dog();
c.cry();
d.cry();
}
}
단 추상 클래스는 추상 메소드를 포함하고 있다는 점을 제외하면, 일반 클래스와 모든 점이 같다.
즉, 생성자와 필드, 일반 메소드도 포함할 수 있다.
참고
2. 인터페이스 작성
interface name{
public static final 상수 = 값;
public abstract 메서드이름(매개변수목록);
}
인터페이스의 멤버들은 다음과 같은 제약사항이 있다.
- 모든 멤버변수는 public static final이어야 하며, 이를 생략할 수 있다.
- 모든 메서드는 public abstract이어야 하며, 이를 생략할 수 있다.
이는 인터페이스에 정의된 모든 멤버에 예외없이 적용된 사항이라 제어자를 생략할 수 있다.(컴파일러가 자동으로 추가)
3. 인터페이스 상속
인터페이스는 인터페이스로부터만 상속받을 수 있다.
인터페이스는 클래스와 달리 다중상속이 가능하다.
인터페이스는 해당 인터페이스를 상속한 클래스의 인스턴스로 참조할 수 있으며, 인터페이스의 타입으로 형변환이 가능하다.
// InterfaceAble는 인터페이스
// Classer는 인터페이스를 상속받은 클래스
InterfaceAble f = (InterfaceAble)new Classer();
또는
InterfaceAble f = new Classer();
// InterfaceAble타입의 f로는 인터페이스 InterfaceAble에 정의된 멤버들만 호출이 가능하다.
또한 인터페이스는 메서드의 매개변수의 타입으로도 사용할 수 있다.
void a(InterfaceAble f){
//...
}
인터페이스 타입의 매개변수가 갖는 의미는 메서드 호출 시 해당 인터페이스를 구현한 클래스의 인스턴스를 매개변수로 제공해야한다는 것이다.
메서드의 리턴타입으로 인터페이스의 타입을 지정하는 것 역시 가능하다.
InterfaceAble method(){
...
Classer f = new Classer();
return f;
}
리턴타입이 인터페이스라는 것은 메서드가 해당 인터페이스를 구현한 클래스의 인스턴스를 반환한다는 것을 의미한다.
4. 인터페이스 장점
(1) 개발시간을 단축시킬 수 있다.
여러 사람이 개발을 진행할때, 인터페이스가 없다면 한 팀의 개발이 구현될때까지 대기해야하는 팀이 존재할 수 있다.
그러나 인터페이스를 통해 개발을 진행하면 메서드를 호출하는 쪽에서는 메서드의 내용에 상관없이 인터페이스의 선언부만 호출하면서 개발이 가능하며, 인터페이스를 구현하는 쪽에서는 인터페이스를 구현하는 클래스를 기다리지 않고 개발이 가능하다.
(2) 표준화가 가능하다.
프로젝트에 사용되는 기본 틀을 인터페이스로 작성하여 공유하면 일관되고 정형화된 프로그램 개발이 가능하다.
(3) 서로 관계없는 클래스에게 관계를 맺어줄 수 있다.
서로 아무런 관계를 가지지않은 클래스들을 인터페이스를 통해 관계를 맺어줄 수 있다.
이전 객체지향언어의 특성인 추상화처럼 아무 관계없는 호랑이와 사자에서 공통 속성인 '동물'이란 인터페이스를 만들 수 있다.
(4) 독립적인 프로그래밍이 가능하다.
인터페이스를 이용하면 클래스의 선언과 구현을 분리할 수 있기 때문에 한 클래스의 변경이 다른 클래스에 영향을 미치지 않도록 프로그래밍이 가능하다.
잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다. |
'개발공부 > Java' 카테고리의 다른 글
Java.lang 패키지 (0) | 2023.03.21 |
---|---|
예외처리 (0) | 2023.03.20 |
객체지향언어(캡슐화, 다형성) (0) | 2023.03.17 |
객체지향언어(특징, 추상화, 상속) (1) | 2023.03.16 |
배열 (0) | 2023.03.14 |