일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 프로그래머스 #알고리즘 #자바스크립트
- 백준 #알고리즘 #자바스크립트
- 알고리즘
- 백준
- 위상정렬
- 드래그앤드롭
- Suspense
- 완전탐색
- 리액트
- 프로그래머스
- React
- javascript
- 알고리즘 #프로그래머스 #코딩테스트 #자바스크립트
- 자바스크립트
- recoil
- 리코일
- useLayoutEffect
- 다이나믹프로그래밍
- usedebugvalue
- 알고리즘 #코딩테스트 #프로그래머스 #자바
- 훅
- 타입스크립트
- react-beautiful-dnd
- useContext
- 스티커
- useRef
- 덕타이핑
- Today
- Total
몽환화
230125 추상클래스 본문
추상클래스
abstract class [ 객체를 생성할 수 없는 클래스 ]
굳이 객체를 만들 필요가 없는 클래스가 생김
=> 추상 클래스를 이용해서 설계함
일반 클래스로 만들어서 상속받아도 되고
추상클래스로 만들어서 상속받아도 돼 : 객체의 생성을 방지해
abstract : 메소드에도 붙고 클래스에도 붙음!
추상 메소드 : 내용 구현부가 없는 메소드
반드시 자식 클래스에서 오버라이드(재정의)를 해주어야 함!
ex) Animal 이라는 클래스가 있고
이를 상속받는 Cat Dog Person이 있을 때
객체를 만들면 이 자식클래스들한테 만들고말지 굳이 Animal한테? 객체를? 만들 필요가 없다는거지
test01
그냥 public 일반 클래스에 abstract 메소드 작성하면 오류뜸!
메소드만 추상 메소드인게 아니라 클래스에도 abstract 달아줘야함
== 일반 클래스는 추상 메소드를 가질 수 없음!
; 으로 종료하며 { }가 없다 => 내용, 즉 구현부가 없다
내용이 없으니까 객체도 못만들징
1. 접근제한자 : public, (default), protected, private
2. 그외제한자(지정예약어) : static, final, abstract
1번과 2번의 순서는 상관이 없다! 그치만 뭐 통용적으로 사용되는게 있으니까
빨간줄이 뜬 Cat에 커서를 가져다대면? 반드시 추상메소드를 구현해야 한대!
만약 부모+추상클래스인 Animal에 아무 메소드도 없었다면 저런 에러는 안뜰거야
추상클래스를 상속받았으니 자식클래스에서 그 추상메소드를 오버라이드해야돼
Add unimplemented methods 눌러
추상클래스를 상속받은 메소드는 부모 클래스의 추상메소드를 모두 오버라이드 해야한다!!
같은 패키지에 Test클래스를 만들어서
추상 클래스인 Animal로 객체를 만들어보려고 한다면?!
오류가 뜨지용 cannot instantiate
만약 타입만 부모클래스로 하고 클래스 자체는 자식 클래스로 객체를 만든다면? 이게 바로 다형성!!!!! 출력도 잘 댐
부모클래스 타입의 변수이지만(부모클래스를 참조했지만)
메소드의 호출은 실제 생성된 객체가 갖고 있는 메소드가 실행됨(여기서는 Cat의 메소드가 실행된거지)
왜 추상 클래스를 쓰는가?
=> 1. 객체가 생성되지 못하도록 막을 때( 그것이 합리적일 때)
=> 2. 자식 클래스에서 메소드의 재정의(오버라이드)를 강제하고 싶을 때
=> 3. 다형성 이용
=> 4. 상속을 통한 코드 중복 제거
test02
그렇다 치고 새로운 Mammal이라는 자식 클래스를 만들었어
역시 Animal에는 메소드가 있는데 지금 얘는 아무 메소드가 없으니 오류가 떠
이번엔 두번째꺼 눌러방
abstract가 생겼당!
자식 클래스도 추상 클래스가 되어야 한다는 거지
어찌됐던 이 경우에서는 Mammal에 객체를 만들지는 못하겠지 얘도 추상클래스니까
test03
자 봐바
추상 클래스인 Animal의 상속을 받는 자식 클래스 Cat에서
Animal에는 없는 eat()이라는 메소드를 독단적으로 생성했어
그랬더니? 접근이 불가능해!!! 보이지 않아 =>
이 객체는 eat()이라는 메소드를 갖고있긴 하지만 참조하고 있는건 Animal이라는 클래스야
Animal 설계도에는 eat()이 없어!!!
이를 해결하려면????
Animal에서 추상메소드가 아니더라도 eat()에 대해 빈껍데기라도 만들어 놓아야 해
된다눙
실행도 잘된다눙
근데 이걸 해결하는 방법이 또 있다는거지!
test04
instanceof 활용해서 형변환
instanceof :
객체가 해당 클래스로 만든 객체이거나 해당 클래스의 조상 클래스로 만든 객체인 경우 true
자식 클래스로 만들거나 전혀 상관없는 클래스로 만든 경우 false
이해됨???
형변환을 이용해서 메소드 이용가능
각 클래스에서 각 객체에 맞는 메소드 이용~
조상 클래스에서 일반 메소드로 만드는 것과 추상 메소드로 만드는 것의 차이는?
일반 메소드를 만들어서 상속받는 것과 추상 메소드를 만들어서 상속받는 것
// 추상 메소드는 추상 메소드와 일반 메소드 둘다 가지니까
재정의의 강제성!!
빈 깡통으로 만들면 (일반 메소드) 재정의할 필요가 없거든
만약 너네 쓸 때 반드시 재정의해서 써야돼!!! 하면 오류를 방지하는데 도움이 되겠지
부모클래스에서 일반 메소드를 사용하면 => 자식클래스에서 재정의를 안하고 넘어갈 수 있어
부모클래스에서 아무 메소드도 만들지 않고 자식 클래스에서 독립적으로 만들어서 사용하면 => 다형성을 활용할 수 없어
부모 객체를 참조했을 때 메소드가 보이지 않으니까!
추상 클래스 특징
- 상속 전용의 클래스
- 객체를 생성할 수 없음!! : 구현부가 없는 메소드가 있우니까
- 상위 클래스 타입으로 자식을 참조할 수는 있음 => 이게바로 다형성
// 생성할 수 없음!
Animal a1 = new Animal();
// 생성할 수 있음!! (다형성)
Animal a2 = new Cat();
조상 클래스에서 상속받은 abstract 메소드를 재정의하지 않은 경우
클래스 내부에 abstract 메소드가 있으므로 자식 클래스는 abstract 클래스가 되어야함 : Mammal 클래스 했던거
'JAVA 때려잡기' 카테고리의 다른 글
230127 컬렉션 (0) | 2023.01.28 |
---|---|
230126 인터페이스, 제네릭 (0) | 2023.01.27 |
#가위바위보 게임(5판3선승, 3판2선승, 단판승) (0) | 2023.01.24 |
230119 객체배열관리 (0) | 2023.01.21 |