마트철수

[032] JAVA 인터페이스 (상속과 비슷한) 본문

KB IT's Your Life/교육

[032] JAVA 인터페이스 (상속과 비슷한)

마트스 2024. 6. 21. 16:50

 
2024.06.21(금)
 
JAVA 5일차
 
클래스는 필드, 생성자, 메서드 → #필생메
상속은 메소드 오버라이딩,  다형성, 추상 → #메오다추
 
복습:
부모생성자 호출이 반드시 필요함
없으면 super(); 을 자동으로 넣어줌
 
1) 코드 재사용 2) 다형성
 
맨 꼭대기에는 Object가 있음
JAVA는 다중상속 불가 
 

Home: 개발환경 - import 설정 구축해두기
 


 

ch07 인터페이스

 
다중상속의 문제점을 해결해줄 수 있는 기능
참조의 다형성을 얻게 해주는 기능

인터페이스
: 두 객체를 연결하는 역할 (inter, 대면하다)
 
#혼자서 하지 않음 (face, 얼굴을 맞대고있다)
 
인터페이스와 구현 클래스 선언
: 인터페이스에 정의된 추상 메소드에 대한 실행 내용이 구현
 
public class B implements 인터페이스명 { ... }
 
상수 필드
:인터페이스는 public static final 특성을 갖을 수 있음
int A = 10; ... 자동으로 static임
대문자로 작성하고, 인터페이스명 혹은 클래스명으로 호출함
 
추상 메서드
: 리턴 타입, 메소드명, 매개변수만 기술되고 중괄호 붙이지 않음
 

 
- 상단은 상수 필드 ... 자동 static
- 하단은 추상 메서드 ... #리메매만 기술 / 중괄호 생략
- 메소드는 필수로 오버라이딩 해야함
 
private 메소드
: 다른 곳에서는 접근 불가
 
다중 인터페이스 구현
: 여러 개의 인터페이스, 하나의 구현체로 운영
public class 구현클래스명 implements 인터페이스A, 인터페이스B { }
 
인터페이스 상속
: 다중상속 허용
public interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2 { ... }
 
타입 변환
: 자동 타입 변환 → 상속과 동일, 부모 클래스가 인터페이스 구현하고 있다면 자식도 자동 타입 변환
 
구현 클래스 변수 = (구현클래스) 인터페이스변수;
 
#인터페이스는 클래스가 구현해야 할 메서드의 목록을 정의
#구현 클래스는 인터페이스에서 선언된 모든 추상 메서드를 구현하여 구체적인 동작을 정의하는 클래스 (implements)
 
다형성
: 사용 방법은 동일하지만 다양한 결과가 나오는 성질
: 넓은 의미로 상속이라고 볼 수 있음 → 코드가 아닌 형태(메소드의 구조)를 상속받음
 
# 부모타입으로 자식 인스턴스를 운영할 수 있다 → 리스코프 치환 원리
 
▶ 결국엔 다형성을 설명하기 위함
 

 
- << Vehicle >> ... 추상 클래스 (이탤릭체)
- Bus, Taxi ... 구현 클래스
- 실선 ... 매개변수가 아닌 멤버 변수
 
★ Upcasting
 
객체 타입 확인
: instanceof 연산자로 강제 형변환
 
강건한 객체지향 설계 원칙 → SOLID 원칙
(강건한 = 안전한)
 

객체지향 설계원칙(SOLID)

 
- 단일 책임 원칙(Single REsponsibility Principle)
:  클래스를 변경하는 이유는 단 한 개여야 한다. (한 개의 책임)
 
- 개방-폐쇄 원칙 (Open-Closed Principle)
: 기능 확장에는 열려 있고, 변화에는 닫혀 있어야 함
 
- 리스코프 치환 원칙(Liskov Substitution Principle)
: 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
 
- 인터페이스 분리 원칙(Interface Segregation Principle)
: 클라이언트는 자신이 사용하는 메서드에만 의존해야 한다.
: 다중 구현을 통해서 인터페이스 하나로 다양한 구현
 
- 의존 역전 원칙(Dependency Inversion Principle)
: 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.
 
"Programming to InterFace"
 

UML

 
클래스 다이어그램
 
접근 제어자:
public: + / private: - / protected: # / package: ~(디폴트)
 
객체 간의 관계:
- 연관 관계(association) ... 실선
- 일반화 관계(generalization) ...
- 집합 관계(composition, aggregation) ... 마름모 → 멤버 필드를 의미
- 의존 관계(dependency)
- 실체화 관계(realization)
 

실습

 
추상 클래스와 인터페이스의 차이점?
- 상속 가능 여부(인터페이스만 가능)
- abstract 표현 여부(인터페이스는 디폴트값이라서 붙이지 않음)
 
오버라이딩과 오버로딩의 차이점?
 

 
> 추상 메소드를 재정의하지 않으면 오류가 남
... public void turnOn()