본문 바로가기

프로그래밍 고찰/질문과 답변

[질문과 답변] 인터페이스가 뭔가요? / 추상클래스와 인터페이스차이가 뭐예요?

매번 카톡으로만 답해주기 아까워서 정리하는 컨텐츠

140% 뇌피셜 (뇌피셜 주도개발)

[백후배] 아래로 바뀔때 B변경에 영향을 받지 않는다는데
[백후배] 이해가 안가요

인터페이스 썻으니까 영향을 안받지
아우터페이스였으면 받음 ㅇㅇ

[백후배] methodB 바뀌면 인터페이스도 수정해야되는거 아니에요?
[백후배] 선언부가 바뀌면

아예 메쏘드B라는 인터페이스자체가?

[백후배] 넹

그럼 설계를 잘못한거지 바꿔야지

[백후배] 그럼 먼차이예요?

걍 인터페이스 나오면 Cloneable 만 생각해

[백후배] clonable이 머에요

자바에서 객체는 A = B 하면 A 에 B 레퍼런스가 들어가잖아
그래서 A.name = "kiki"; 하면 B.name 도 키키 되잖아
근데 A는 B의 복사복은 가지고싶어

[백후배] 그게 딥카피였죠

근데 딥카피를 할라면 딥카피 해주는 메소드가 있어야되잖아 그게 Clone이야

[백후배] 넹

A = B.Clone 하면 딥카피가 되는거야
정확히는 딥카피가 되도록 우리가 Clone 이라는 함수를 짜야지

[백후배] 근데 왜 interface나오면 cloneable만 생각하면되요

근데 Clone이 우리가 짜야 되잖아?

[백후배] ㅇㅋ염

어느클래스는 클론이 있을수도있고 없을수도있어
ㅇㅋ?

[백후배] 넹

그래서 Clone을 구현해야되는데 Clone이 있는지 없는지 모르니까
Cloneable 이라는 인터페이스가 있어서 이걸 상속받으면 Clone 을 무조건 구현해야되고
그 Clone은 딥카피해주는 함수를 짜야되는거지

[백후배] 긍까 클로너블이 결국
[백후배] 인터페이스 사용하는 예 아니에요?

ㅇㅇ
클로너블이 인터페이스고 이걸 우리가 구현하는거지
상속받아서
그러면 니가 자료구조를짯어
Tree 자료구조를 짯다고해
근데 자료구조는 제네릭하게 타입을 넣을수있게짜야겠지?

근데 니가 자료구조를짜면서
Tree A = B.Clone 하면 이제 딥카피가 되야되잖아

[백후배] 그쵸

근데 니가 자료구조내부를 구현하면서
Person 이 카피가 되는지 안되는지 몰라
애초에 Person이 들어올지 안 들어 올지도 모르고
어떤 아이템이 들어올지모르지

[백후배] 네

근데 니가 그냥 들어올 아이템을 클로너블로 선언해두면
이건 걍 무조건 딥카피되는 아이템만 받겠다고 선언하는거야

[백후배] 아 느낌왔어요

이걸 니가 말로안해도 니가 만든 트리쓰는사람들도 다알아
아 이건 딥카피가 구현된 아이템을 넣어줘야되는구나 하고
그러니까 이런상황에서는 Clone 이라는 함수의 선언부가
바뀔일이없지 이미 제네릭하게 범용적으로 인터페이스를 뽑은거니까


근데 걍 Person 에서는 니가 마음데로 함수명을짠거니까
Person.CopyPerson일수도
Person.Copy 일수도
Person.GetMyClone 일수도 있지
근데 인터페이스를 만들어두면 거기에 맞춰서

[백후배] 표준화가 되네

ㅇㅇ 만약 니가 클로너블을 생각안하고 Person.Copy를 만들었다고해도
아 저건 클론에이블만 받네? 하고 Person 을 클로너블 상속받고 Clone 함수 안에 retrun this.Copy
해서 Clone 함수만 맞춰두면 되는거임

[백후배] 그 파라미터는 cloneable c 이런식으로 받는거에요>?

ㅇㅇ

[백후배] 이제 인스턴스에 따라
[백후배] 다형성으로 구현되어있을테니

ㅇㅇ
그래서 인터페이스랑 상속을 쓰는거임

[백후배] 하 다형성이 다네

그래서 인터페이스는
다중상속이 되는거고
당연한거임 생각해보면 다중상속도

[백후배] 근데
[백후배] 다중상속 자체가
[백후배] 바람직하지
[백후배] 않은것같은데

클래스에서는 그렇지
인터페이스는 상관없음

[백후배] 그래서 a, B 다중상속하고자 하면
[백후배] 하나는 걍 클래스로 상속받고
[백후배] 하나 인터페이스로 상속하라는디

그렇게 할수있지
근데 내가 볼 때는 그건 생각이 잘못된거야
클래스랑 인터페이스랑
근본이 다름


인터페이스는 아까말했던 약속임 그냥
인터페이스 자체가 뭐냐? 내부구현은 신경안쓰고 난 가져다쓰겟다
구현하는 클래스에서 알아서 구현해라 이거야

[백후배] 밑그림
[백후배] 수준이죠

ㅇㅇ 그럼 당연히 다중상속을 막을필요가없지

[백후배] 근데 인터들만 다중받으면
[백후배] 이름 겹치거나 이런 이슈있자나요

상관없음, 어차피 내부구현은 모르니까
난 그함수만 있으면됨

[백후배] 메소드 이름 겹치면
[백후배] 뭘 호출할지 모르는거
[백후배] 아닌가

만약 Clone 이라는 함수가 Copyable이라는
인터페이스에도 있다고 해도,
이건 복사하는 함수겠지
핵미사일 발사가 Clone은 아닐꺼아냐

클래스라면 뭘 호출할지 모르지
어떤 부모의 함수구현인지를 모르니까
아 Cloneable의 Clone함수 가 동작해야하나?
Copyable의 함수가 동작해야하나?
모르지 클래스면 부모에 동작이 구현되있으니까

[백후배] 아

인터페이스는 걍 Clone 함수가 있다
구현은 자식이 알아서 할꺼고
무조건 자식의 함수호출임

[백후배] 그렇네
[백후배] 어차피
[백후배] abstract라
[백후배] 내용이 없구나

ㅇㅇ
USB 가 인터페이스 잖아
USB 꼽을때 안에 기술이 USB 2.0인지 3.0인지, 파일이 어떻게 저장되는지 신경 안쓰는거처럼
걍 USB에는 파일 복사 삭제만 있으면됨.

...

[백후배] 형 근데 인터로
[백후배] 다중상속하면 그 추상클래스 상속하면 쓸 수 있던 멤버 변수들은
[백후배] 걍 자식에다가 선언해요?

ㅇㅇ
그냥 그런애들은
추상클래스를
쓰면되잖아

[백후배] 다중하려면
[백후배] 인터만 쓰라면서요 ㅠ

추상클래스 하나는 받을수있지
추상클래스는 는 자식들의 공통점을 추려내가면서 추상화 하다가 곂치는걸 묶은거여
애초에 클래스임 애초에 공통이면 부모클래스에 있었겠지 추상클래스는 그냥 부모클래스가 추상클래스인거임

인터페이스는 그냥 인터페이스인애들임
두개를 같은 개념에서 취사선택해서 쓰는 조금씩 차이있는애들로 보면 안되고

추상클래스는 공통인 애를 묶으면 추상클래스 -> 의존성있는애들, 부모와 자식간의 커플링관계가 있는애들
인터페이스 -> 자식은 전혀 상관안씀, 자식 있는지도 신경안쓰고 쓰는입장에서는 의존성 전혀없이 아몰랑 알아서
잘 구현했겠지하고 함수 호출하는거

[백후배] 아까는 하나 추상클래스 상속에 하나 인터하라고

아니 순서가 역전이라니까
아 다중상속해야되니까 추상클래스 하나에 나머지는 인터로 만들어야지~
이게 이상한거라고

[백후배] "다중상속해야되니까" 이게
[백후배] 잘못됬다는거에요?

ㅇㅇ
에초에 아 다중상속써야겠다~
라는 마음이 들수가없음

[백후배] ㅋㅋㅋㅋㅋㅋㅋㅋㅋ
[백후배] 나이스에요

728x90