1. Interface란
자식 클래스가 여러 부모 클래스를 상속받을 수 있다면, 다양한 동작을 수행할 수 있다는 장점을 가지게 된다. 하지만 클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있어 자바에서는 클래스를 통한 다중 상속은 지원하지 않는다.
하지만 다중 상속의 이점을 버릴 수 는 없기에 자바에서는 인터페이라는 것을 통해 다중 속성을 지원하고 있다.
인터페이스란 다른 클래스를 작성할 때 기보이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할까지 담당하는 일종의 추상클래스를 의미한다.
자바에서 추상 클래스는 추상 메소드뿐만 아니라 생성자, 필드, 일반 메소드도 포함할 수 있다.
하지만 인터페이스(Interface)는 오로지 추상 메소드와 상수만을 포함할 수 있다.
아래 예제를 들어보겠다.
예제 1. Interface가 없을 때
public class RealMessageSender {
public void send() {
System.out.println("RealMessageSender, 실제 고객에게 문자가 넘어갑니다.");
}
}
public class FakeMessageSender {
public void send() {
// 실제로 발송하지 않고 명목상으로만 발송했다고 처리
System.out.println("FakeMessageSender, 실제로는 메시지를 방송하지 않습니다.");
}
}
public class Client {
public void someMethod() {
// 메시지 보내기 전, 사전에 서버 연결 등 코드들
// 사전 작업 후 메시지 발송 코드
RealMessageSender messageSender = new RealMessageSender();
messageSender.send();
}
}
public class WithoutInterfaceExampleMain {
public static void main(String[] args) {
Client client = new Client();
client.someMethod();
}
}
예제 2. Interface가 있을 때
위에 RealMessageSender, FakeMessageSender 는 동일
// 모든 종류의 MessageSender를 대입받을 수 있는 MessageSender 인터페이스
public interface MessageSender {
// 인터페이스는 특정 객체가 가져가야하는 기능의 명세를 작성
// 인터페이스 내부에 작성한 메서드는 구현체가 반듣시 구현해야 하는 메서드로 정의
void send(); // messageSender라면 무조건 발송기능을 가져가야 한다.
}
public class Client {
public void someMethod() {
// 메시지 보내기 전, 사전에 서버 연결 등 코드
// 사전 작업 후 메시지 발송 코드
// MessageSender messageSender = new RealMessageSender();
MessageSender messageSender = new FakeMessageSender();
messageSender.send();
}
}
public class WithInterfaceMainExample {
public static void main(String[] args) {
Client client = new Client();
client.someMethod();
}
}
물론 결과는 같다. 하지만 유지보수측면에서 아주 유용하다.
오른쪽 With_Interface는 메소드를 여러개 만들어도 interface를 거쳐서 들어가기 때문에 유지보수에 용이하다.
2. Inheritance
부모 클래스(상위 클래스)와 자식 클래스가 있으며, 자식 클래스는 부모 클래스를 선택해서, 그 부모의 멤버를 상속받아 그대로 쓸 수 있게 된다. 상속을 하는 이유는 이미 마련되어 있는 클래스를 재사용해서 만들 수 있기 때문에 효율적이고 개발 시간을 줄여주게 된다.
상속을 하더라도 자식 클래스가 부모의 모든 것을 물려받는 것은 아니다.
- 부모 클래스의 private 접근 제한을 갖는 필드 및 메소드는 자식이 물려받을 수 없다.
- 부모와 자식 클래스가 서로 다른 패키지에 있다면, 부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없다.
클래스 상속
상속 받고자 하는 자식 클래스명 옆에 extends 키워드를 붙이고, 상속할 부모 클래스명을 적는다. 자바는 다중 상속을 허용하지 않으므로, extends 뒤에는 하나의 부모 클래스만 와야한다.
바로 예제 코드로 이해해 보자.
public class Parent {
public int parentPublicInt;
protected int parentProtectedInt;
private int parentPrivateInt;
public void someMethod() {
System.out.println("Parent someMethod");
}
}
public class Child extends Parent {
// Parent 쪽 자원은 private 요소를 제외한 나머지를 모두 가집니다.ㄴ
// Child 쪽에서 새롭게 정의하는 메서드
public void anotherMethod() {
System.out.println("Child anotherMethod");
this.parentPublicInt = 0;
this.parentProtectedInt = 0;
// private 요소는 부모자식관계여도 호출할 수 없음
// this.parentPrivateInt = 0;
}
}
public class ExtendsExampleMain {
public static void main(String[] args) {
Parent parent = new Parent(); // 부모타입 변수에 부모타입 객체 대입
Parent parentTypeChild = new Child(); // 부모타입 변수에 자식타입 객체 대입
Child child = new Child(); // 자식타입 변수에 자식타입 객체 대입
parent.someMethod();
System.out.println("-------------");
parentTypeChild.someMethod();
// parentTypeChild.anotherMethod(); // Child타입 객체 내부 요소는 Parent 타입 변수로 호출 불가능
System.out.println("-------------");
child.someMethod();
child.anotherMethod();
}
}
위에 2번째 Child 클래스를 보면 Parent의 private 요소는 호출할 수 없는 모습을 볼 수 있다.
그리고 main 클래스 코드를 보면
- 부모타입 변수에 부모타입 객체 대입
- 부모타입 변수에 부모타입 객체를 대입한 것은 당연히 부모타입의 객체를 호출 할 수 있다.
- 부모타입 변수에 자식객체 대입
- 부모타입 변수에 자식객체를 대입한 것은 부모타입의 객체를 호출할 수 있다.
- 자식타입의 객체는 대입은 되었지만 호출은 불가능 하다. (자세한 설명은 아래 그림 참고)
- 자식타입 변수에 자식객체 대입
- 자식타입 변수에 자식타입 객체를 대입한 것은 부모, 자식타입의 객체 모두 호출 할 수 있다.
@Override 일때
Main 클래스의 부모타입에 자식객체 대입한 경우에는 위와 결과가 다르게 anotherMethod가 호출 된다. 아래 코드와 메모리 구조를 살펴보자.
public class Child extends Parent {
// 부모 쪽 메서드와 시그니쳐(메서드명, 리턴자료형, 파리미터의 종류 등)은 같으나 실행 구문이 달라짐
@Override
public void someMethod() {
System.out.println("Child someMethod");
}
/* @Override 미사용 시
- 메서드 시그니쳐 사용 여부 파악x
- 유지보수 간에 컴파일 간에 체크가 되도록 하기 위해
*/
}
위 메모리적 구조처럼 @Override를 사용하게 되었을 때, Child의 anotherMethod가 Parent의 someMethod로 @Override 되어 최종적으로 Child의 someMethod가 호출된다.
마무리 쓸없 Tip. (쓸모없는 or 쓸모없지않은...)
public | void | someMethod | ( ) |
접근제한자 | 리턴자료형 | 메소드 명 | 파라미터 종류 |
- 객체 지향
ㄴ 변수와 함수를 밀접하게 하나의 클래스 소속으로 만들었기 때문에 관리가 쉽다.
ㄴ 객체 지향 4대 특성 (캡! 상 추 다 : 캡슐화 / 상속 / 추상화 / 다형성)
- 개발 과정 및 면접 팁
ㄴ 개발 과정 중 a, b 등의 여러 방법을 생각해보고, a방법을 사용했을 때의 근거를 생각하며 개발하는 접근방식이 좋다.
ㄴ 위 접근방식을 통해 사고한다면, 면접에도 도움이 될 것이다.
'JAVA' 카테고리의 다른 글
JAVA 객체 지향 설계 [S.O.L.I.D] (0) | 2023.10.11 |
---|---|
JAVA 객체지향 관련 [Optional, if문, Getter/Setter] (0) | 2023.10.10 |
JAVA 데이터베이스 연동 (2) [리포지토리, DAO 설계] (0) | 2023.08.29 |
JAVA 데이터베이스 연동 (1) [ORM, JPA, 영속성 컨텍스트, 엔티티] (2) | 2023.08.29 |
[문제풀이] 백준 JAVA - #10988 팰린드롬인지 확인하기 (0) | 2023.07.19 |