Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 유니캐스트
- 백준1946
- 도커
- 백준
- 네트워크모델
- instancenotfoundexception
- 포트포워딩
- javax.management.instancenotfoundexception: org.springframework.boot:type=admin
- SpringApplication
- 배열복사
- 리눅스계열
- 브로드캐스트
- 디비버
- ubuntu
- 포트포워딩 안될때
- Decapsulation
- docker
- 우분투
- 배열최소값최대값
- wan
- name=springapplication
- 오름차순
- 페이로드
- 도커권한설정
- 리눅스환경
- 모래시계출력
- jmx
- springboot
- 배열빈도수
- dbeaver
Archives
- Today
- Total
다잘하고싶어
자바 추상클래스 본문
목차
추상클래스
⇒ 객체를 생성할 수 없는 클래스
⇒ 추상메서드를 갖는 클래스
⇒ 추상메서드 : 내용(구현부)이 없는 메서드
→ 반드시 자식클래스에서 오버라이드 해줘야한다.
⇒ 상속 전용 메서드
클래스 : 설계도 (blueprint)
추상클래스가 왜 필요할까?
- 추상클래스로 만들면 객체를 생성할 수 없게 막을 수 있다.
- 자식클래스에서 메서드의 재정의(오버라이드)를 강제할 수 있다.
자식클래스에서 반드시 부모클래스의 추상메서드를 오버라이드 해줘야 한다 → 추상메서드가 일반메서드가 된다 → 객체생성이 가능해진다.
abstract public class Animal {
abstract public void speak();
}
package test01;
//일반 클래스인데, 추상클래스를 상속
public class Cat extends Animal{
@Override
public void speak() {
System.out.println("냐옹");
}
}
추상메소드
- abstract 키워드 → 일반 클래스는 추상메서드를 가질 수 없으므로 클래스에도 abstract 를 붙여 추상클래스로 만들어준다.
- ; 으로 종료한다
접근제한자 + 그 외 제한자
- 접근제한자 : public, (default), protected, private
- 그 외 제한자(지정예약어) : static, final, abstract
- 접근제한자와 지정예약어의 순서는 서로 상관이 없다.
만약 추상클래스의 자식클래스도 굳이 객체를 생성할 필요가 없다면?
⇒ 자식클래스도 추상클래스로 만들어준다.
abstract public class Animal {
abstract public void speak();
}
public abstract class Mammal extends Animal {
}
자식클래스에서 추상클래스에 없는 메서드를 구현한다면?
부모클래스 Animal
abstract public class Animal {
abstract public void speak();
}
자식클래스 Cat
public class Cat extends Animal{
@Override
public void speak() {
System.out.println("냐옹");
}
public void eat() {
System.out.println("고양이는 생선을 먹어요");
}
}
자식클래스 Dog
public class Dog extends Animal {
@Override
public void speak() {
System.out.println("멍멍");
}
public void eat() {
System.out.println("개는 고기를 먹어요");
}
}
사용하려고 할 때 에러난다(16번라인) → 왜?
a1은 Animal 클래스를 참조하고 있다.(11번 라인) Animal 클래스가 가지고 있지 않은 메서드(=eat(), 메모리 상에 존재하지 않음) 이므로 사용할 수 없다.
⇒ 해결하기 위해서는?
[방법1]
부모클래스에 추상메서드나 일반메서드 타입으로 정의해두어야 한다. 그래야 부모클래스 타입으로 참조했을 때 메서드사용가능
[방법2]
instanceof 를 사용해서 형변환을 해준다
instanceof 연산자
- 객체가 해당 클래스로 만든 객체인 경우 ⇒ true
- 객체가 해당 클래스의 조상클래스로 만든 객체인 경우 ⇒ true
- 객체가 해당 클래스의 자식클래스로 만든 객체인 경우 ⇒ false
- 객체가 해당 클래스와 무관한 경우 ⇒ false
instanceof 를 사용한 형변환
public static void main(String[] args) {
//자식클래스에서 추상클래스에 없는 메소드를 구현한다면?
Animal a1 = new Cat();
if(a1 instanceof Cat) {
Cat c = (Cat) a1;
c.eat();
}
}
조상클래스에서 일반메서드로 만드는 것 vs 추상메서드로 만드는 것 의 차이
추상클래스는 일반메서드와 추상메서드 둘 다 가질 수 있다. 그렇다면 둘의 차이는?
⇒ 강제성의 차이 (추상메서드는 재정의가 강제됨) ⇒ 오류 방지에 도움
⇒ 부모클래스에서 일반메서드, 추상메서드 둘다 안만들고 자식클래스에서 독립적으로 만들어서 사용하는 경우?
⇒ 다형성을 활용할 수 없다.
'이론학습 > JAVA' 카테고리의 다른 글
자바 동적바인딩 , 추상클래스 보충설명, 인터페이스 보충설명 (0) | 2023.02.13 |
---|---|
자바 인터페이스 (0) | 2023.02.06 |
반복문 _ 다양한 형태로 별, 숫자 출력하기 (0) | 2023.02.06 |
싱글톤 이해하기 (with 인터페이스 사용 예제) (0) | 2023.01.25 |
자바 : 상속과 다형성 (0) | 2023.01.25 |