JAVA기초 -14

아기코딩단2·2022년 4월 5일
0

직접 사용하지 않을 경우 추상클래스로 만든다. 여러 클래스를 같은 타입으로 묶기 위함이다.
generalization 를 통해 수퍼클래스를 정의하는 경우에 만든다.
클래스 - 사용자 정의 타입 그래서 추상클래스도 type이라고 써져있음 컴파일 오류에서
추상 클래스에 추상메서드 있으면 상속받는 경우에 서브클래스에서 정의하지 않으면 안됨(강제하는 효과/아니면 서브클래스도 추상클래스가 돼야한다.)
일반클래스는 추상메서드를 가지지 못함(어차피 컴파일 오류)
abstract 메서드라도 존재하면 컴파일 가능

레퍼런스 타입이 추상메서드라면 그 추상클래스를 상속받은 다른 애들을 줘도 된다는 뜻
인스턴스 있으면 일반클래스라는 뜻

***추상메서드가 잇으면 서브클래스에서 구현강제
(추상클래스는 어처구니없는 코딩 방지하는 용도)

수퍼 클래스에서 기능이 어떻게 동작하는지 정의한다.
=> 템플릿의 역할을 하는 메서드를 수퍼 클래스에 둔다.
=> 자세한 구현은 서브 클래스에 맡긴다.
public void print() { <== 템플릿 메서드 디자인 패턴에서 "템플릿 메서드"에 해당한다.
this.printHeader();
System.out.println(this.content);
System.out.println();
System.out.printf(" From %s!\n", this.getSign());
System.out.println();
this.printFooter();
}

수퍼클래스에서 기능의 흐름을 정의(틀(템플릿)을 구성)the skelecton of an algorithm
템플릿 안에서 실행하는 세부동작은 서브클래스에게 구현을 맡긴다.
즉 수퍼클래스는 템플릿으로 실행흐름을 정의하고 서브클래스로 구체적인 동작을 정의 => 템플릿 메서드 패턴(설계기법)
흐름, 틀만 잡아주는 메서드를 템플릿메서드라고 함

concrete - 일반클래스이다. 인스턴스를 만들 수 있음 보통은 인터페이스를 구현하거나 상속받은 애들임

메소드 호출할 때는 클래스가 오거나 인스턴스 주소가 오거나 둘중 하나는 있어야함 없다면!? 생략된 거다. ㅇㅇ스태틱 메서드는 클래스생략 인스턴스는 인스턴스 주소가 생략

C보다 느림 객체지향은 왜냐? 찾아다녀서 그렇다

정렬 객체를 일관성 있게 사용하려면 같은 타입으로 묶어야 한다. => 상속의 generalization 기법 사용

추상클래스로 안 만들면 인스턴스를 생성하는 것을 막을 방법이 없다.

인터페이스의 메서드는 기본이 public, abstract임
인터페이스의 추상메서드를 구현하는 것도 overriding 이라고 한다. 인터페이스를 구현하는 경우 UML표기법에서 점선으로 표시한다.

추상클래스는 new 명령어로 객체 생성불가!but 래퍼런스는 선언가능하다.
추상메서드- method body doesn't exsist
추상클래스는 일반 메서드를 가질 수 있다. 이 메서드는 추상클래스를 상속받은 클래스를 통해 호출 할 수 있다.

this. 는 실제 가지고 있는 주소이다.

프로그래밍에 일관성을 가져야한다. 없다면 유지보수가 어렵다. 유사한 일을 하는 객체에 대해 사용법을 통일하자.
객체의 사용규칙을 정의하는 문법이 인터페이스.

자바 this. 생략가능 js this. 생략불가

interface 무조건 public
callee 를 규칙에 따라 만들면 caller 입장에서 편리함(파리미터로 받기가 편함)
구현체 = implement

Worker w; <= 인터페이스

인터페이스 레퍼런스?
=> 해당 인터페이스에 따라 작성된(사용규칙을 준수하는) 클래스의 인스턴스 주소를 저장한다.

위 예제에서 w 레퍼런스를말로 표현하는 방법:
=> Worker 사용규칙에 따라 작성된 클래스의 인스턴스 주소를 저장하는 변수 w.
=> Worker 인터페이스를 구현한 클래스의 인스턴스 주소를 저장하는 변수 w.
=> Worker 구현체의 인스턴스 주소를 저장하는 변수 w.
=> Worker 구현체의 객체 주소를 저장하는 변수 w.
=> Worker 구현 객체를 저장하는 변수 w.
=> Worker 객체를 저장하는 (변수) w.
=> Worker 객체를 가리키는 변수 (변수) w.
=> Worker 타입 객체 w.

프로그램을 짜다가 인터페이스를 만나게 되면,

  • 누가 호출자이고 누가 피호출자(callee)인지 확인하라.
  • 본인이 맡은 개발 일이 호출자(caller)를 만드는 것인지
    아니면 피호출자를 만드는 것인지 확인하라.

인터페이스에 선언된 모든 추상 메서드를 무조건 구현해야한다. ****

interface 는 기본이 public , abstract 임

인터페이스 필드는 public static final int v1 = 100;
앞에 modifier 생략가능 인터페이스의 필드는 무조건 final 임

default 메서드 만들 수 있음 인터페이스에

인터페이스는 하위 concrete클래스에게 구현을 강요하는데 인터페이스에 뭔가 추가해버리면 하위concrete 클래스에서 오류가 뜰 수 있다. 그래서 하위 클래스에게 영향을 주지않는 default method 문법이 interface에 추가됐다. 즉 기존 클래스에 영향이 없도록 새 규칙을 정의할 때 메서드를 구현상태로 만든다. defalut 리턴타입 메서드명(){-} 이렇게 하면 기존의 클래스는 interface에서 새로 추가한 method 를 그대로 상속받는다. 기존 클래스의 코드를 변경할 필요가 없다. 원래 interface는 서브클래스에서 구현을 강요하는데 이렇게 되면 메서드 구현을 강제하지 못한다. interface 문법의 활용에 어긋난다.
defalut method 기존 구현클래스에 영향을 안주면서 새 규칙을 주가하는 방법 이거 많이 쓸 거면 그냥 abstract 클래스로 만들면 됨
인터페이스 내부에서 사용할 메스드면 private 접근범위를 갖는 구현메서드를 정의할 수 잇다.
인터페이스에 선언된 defalut method를 overring 하지않고 호출하고 싶다면 super로 호출해야함 인터페이스명.super.메서드명

defalut method랑 private method, static method존재할 수 있는데 이는 인터페이스의 문법 활용에 어긋난다. default method 까지만 좀 사용해라~

interface도 Object를 상속받았다~

MyInterfaceImpl 클래스 이름을 이렇게 지으면 인터페이스를 구현했다는 뜻

인터페이스도 상속받을 수 있는데 인터페이스를 구현한 concrete클래스에서 인터페이스가 상속받은 인터페이스 구현해야함

구현체(implementor) = 인터페이스를 구현한 클래스의 줄임말

자바는 클래스를 상속받을 때는 다중상속을 허용하지 않음 왜냐하면 수퍼클래스에서 구현된 메서드이기 때문이다. 메서드를 구현하기 때문에! 인터페이스에서도 default 로 method 가 구현되어있으면 compile error 뜬다.
.
근데 인터페이스는 다중상속을 허용함 왜냐하며 수퍼클래스에서 존재하더라도 어차피 구현하지 않은 메서드이기 때문에 둘줄 어떤 것을 상속받더라도 문제될 게 없다. 구현되지 않았기 때문에!! interface C extendes A, B <= 가능. 근데 인터페이스 다중상속 받으려면 method signature(특히 리턴타입) 같아야함 void m1() / int m1() <= 이렇게는 불가능
다중구현도 리턴타입이 다른 경우도 구현이 불가능하다! 리턴타입이 다르면 오버로딩안됨~

인터페이스와 추상클래스의 collaboration

인터페이스 상속받아서 직접 구현할 경우 모든 메서드를 다 구현해야한다. 그러나 추상클래스의 도움을 받는다면 추상클래스에서 구현하고 남아있는 추상 메서드만 구현하면 된다 => 프로그래밍이 편하다. 각각의 서브 클래스에 맞게 하면 된다

profile
레거시 학살자

0개의 댓글