일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 도커권한설정
- wan
- instancenotfoundexception
- 포트포워딩 안될때
- 백준1946
- SpringApplication
- 포트포워딩
- Decapsulation
- 도커
- 리눅스계열
- jmx
- 리눅스환경
- 배열복사
- docker
- 배열빈도수
- 브로드캐스트
- 백준
- 배열최소값최대값
- 네트워크모델
- 모래시계출력
- ubuntu
- 오름차순
- name=springapplication
- javax.management.instancenotfoundexception: org.springframework.boot:type=admin
- 유니캐스트
- 페이로드
- dbeaver
- 디비버
- springboot
- 우분투
- Today
- Total
다잘하고싶어
자바 동적바인딩 , 추상클래스 보충설명, 인터페이스 보충설명 본문
동적바인딩이란?
가장 최근에 오버라이드 된 메서드를 사용하는 것

부모클래스에 있는 메서드 굳이 써야하나? 어차피 자식걸로 쓸텐데?

부모클래스에서 해당 메서드를 지워버리면 동적바인딩이라고 하는 성질때문에 사용할 수 없다.
즉, 오버라이딩 안됨. 컴파일러가 인식하지 못하기 때문에 자식에 있더라도 사용을 못하게 되는 것!
자식에 있던 걸 사용하고 싶다면?
형변환을 해준다
KFoodChef 또는 JFoodChef 로
17번라인 왜 에러뜰까?

→ chef.cook() 을 먼저 실행한 후에 반환값을 형변환하는 순서이기때문에

에러해결
⇒ cook() 메서드는 자손클래스에서 반드시 재정의해서 사용되기 때문에 조상의 구현이 무의미함
→ 메서드의 선언부만 남기고 구현부는 ;(세미콜론)으로 대체
→ 구현부가 없으므로 abstract 키워드를 메서드 선언부에 추가
→ abstract 메서드를 가진 클래스는 인스턴스를 생성하면 안된다 ( 미완성된 클래스이다 )
→ 객체를 생성할 수 없는 클래스라는 뜻으로 클래스 앞에도 abstract 키워드를 붙여준다
public abstract class Chef {
String name;
int age;
String speciality;
public void eat() {
System.out.println("음식을 먹는다");
}
public abstract void cook();
}
추상클래스의 특징
⇒ 상속전용의 클래스이다 → 인스턴스 생성 불가
⇒ 클래스에 구현부가 없는 메서드가 있으므로 객체를 생성할 수 없음
⇒ 상위클래스 타입으로 자식을 참조할 수는 있음(다형성의 특징)

추상메서드를 활용하면 좋은점
⇒ 부모가 구현하고 싶은 내용이 없다고해서 구현 자체를 안하면, 동적바인딩을 활용할 수 없게된다.
⇒ 빈 깡통으로 만들어놓으면(…( ){ }문제는 없다), 자식이 구현하는 것을 강제할 수 없다.
⇒ abstract 으로 만든다면, 자식클래스는 무조건 구현해야하는 의무를 가진다

.추상클래스는 미완성의 설계도 이므로 인스턴스 생성 안됨. 자식클래스로 생성할 수는 있다.
미완성인 부분을 만들어주면 되지 않을까?
→ 익명클래스라는 문법으로 1회한정으로 구현하고 인스턴스를 만들 수 있게 해준다.
Chef c2 = new Chef() {
@Override
public void cook() {
System.out.println("랜덤 요리를 하겠다.");
}
};
c2.cook();
인터페이스
→ 추상클래스보다 조금 더 나아간 개념
→ 모든 메서드가 추상메소드
클래스파일과 인터페이스파일 모두 자바파일
구현부가 없다는 의미로 ; 붙여준다
인터페이스가 다중상속이 가능한 이유? 둘 다 구현부가 없으므로!
ex. 거미.점프 & 인간.점프
어차피 스파이더맨이 점프를 구현해야한다.
Instanceof()
