추상이라는 말 자체가 주는 느낌이
“구체적이지 않고 대충 뭉뚱그린 그런 모양새 아닌가"
(지극히 주관적인 주인장 생각)
자바에 나오는 추상 클래스 역시
"구체적이지 않다. 보디(body)가 없다. 껍데기만 만든다. 그
래서 구현부가 없다, 호출되면 안 된다”
로 이어진다.
자바에서 부모가 있지만
자녀 클래스에서 어차피 재정의해서 사용되어야 할 경우가 있다
부모 입장에서는 구현할 필요가 없거나 자녀 레벨에서 아직 작성할 수 없는 메서드에 대해
선언부만 작성하고, 구현부를 세미콜론(;)으로 대체하고,
구현부가 없다는 의미로 abstract 키워드를 선언부에 추가한다.
(**이 부분이 추상클래스의 형식이 된다**)
또한 클래스가 abstract 메서드를 포함하고 있는 경우
반드시 클래스 선언부에도 abstract 키워드를 추가해야 한다
(**추상클래스에서 꼭 지켜야 할 부분, 메서드와 클래스 abstract 통일성)
자세히 살펴보자~
- 메서드 바디(=구현부 { })가 없는 메서드
- 메서드 리턴 타입 앞에 abstract 키워드를 사용
- 구현부{ } 대신 세미콜론(:)을 명시
- 메서드의 실행할 코드 부분인 구현부가 없으므로 외부에서 호출되면 안 되는 메서드
<형식>
[제한자] abstract 리턴 타입 메서 두 명([파라미터...]);
1)객체 생성이 불가능한 클래스, 미완성 클래스라고도 함
=> 추상메서드가 호출되면 안 되기 때문에 인스턴스 생성을 못하도록 차단
2)추상메서드를 포함하는 클래스는 반드시 추상 클래스로 정의되어야 한다
단, 모든 추상클래스가 추상메서드를 포함하는 것은 아니다
3) 추상클래스는 추상메서드, 일반메서드, 생성자, 인스턴스 변수 등을 가질 수 있다
4)추상클래스를 상속받는 서브클래스에서는
반드시 추상클래스 내의 추상메서드에 대한오버라이딩을 수행해야 한다
=>오버라이딩을 하지 않을 경우 상속 불가
이때, 상속받은 서브클래스를 추상클래스로 정의하면 오버라이딩 생략 가능,
단, 또 다른 서브클래스를 생성하여 언젠가는 오버라이딩을 해야 한다!
[제한자] abstract class 클래스명 {
인스턴스 변수
생성자
추상메서드
일반메서드
}
추상메서드가 포함된 추상클래스를 상속받는 서브클래스에서는
반드시 추상메서드를 오버라이딩 하여 메서드 보디를 { }를 구현해야 한다
오버라이딩 하지 않을 경우 오류 발생!
추상클래스는 인스턴스 생성이 불가능하므로 컴파일 에러 발생!!!
그래서 추상클래스를 상속받아 정의한 서브클래스의 인스턴스를
생성하여 사용해야 한다
추상클래스는 레퍼런스 변수의 타입으로 사용할 수 있다=즉 다형성 활용 가능
업캐스팅 후 오버라이딩 된 추상메서드도 호출 가능함
추상클래스와 일반클래스의 차이점은 추상메서드를 가지고 있다 없다의 차이
추상메서드가 있으면 구현부를 실현하기 위해서
오버라이딩 강제해서 추상메서드의 구현부를 만들어야 한다
추상클래스 인스턴스 생성이 안된다
왜?
추상메서드를 가지고 있을 수 있어서
생긴게 메서드 바디가 없다. 즉 실행할 코드가 없다.
중괄호 없고, 세미콜론넣고, abstract 키워가 들어간다
즉, abstract가 붙으면 new 객체생성이 안된다
ㅣ읽느라 수고 많으셨어요~ㅣ
부족한 글을 읽어주셔서 감사드립니다
아직 부족한 게 많으니
틀린 곳이 있다면
조언의 말씀 꼭 부탁드립니다!!!!
자바_프로그램언어라는게 도대체 뭐지? (0) | 2020.06.18 |
---|---|
자바의 참조형(레퍼런스)의 형변환에 도전하기!!! (업캐스팅/다운캐스팅)(Up Casting/Down Casting) (0) | 2020.06.16 |
자바에서 보이는 final 제어자 도대체 왜 쓰는 거지? (0) | 2020.06.12 |
자바이해하기_java Singleton 디자인 패턴이 뭐지? (0) | 2020.06.04 |
자바 변수총정리_ 인스턴스변수,로컬변수,클래스변수 싹털기 (0) | 2020.06.03 |