1. 추상 클래스
추상 클래스란?
구현 코드 없이 메서드의 선언만 있는 추상 메서드를 포함한 클래스
1. 메서드 선언 : 반환타입, 메서드 이름, 매개변수로 구성
2. 메서드 정의 : 메서드 구현과 동일한 의미 구현부를 가짐 -> {} 이 부분을 의미한다.
ex) int add(int x, int y); // 이게 이제 선언 -> 추상 메서드
ex) int add(int x, int y){}; // 구현부가 있으므로 추상 메서드 X
3. abstract 예약어를 사용
4. 추상 클래스는 new 할 수 없다.(인스턴스화 할 수 없다 -> 구현부가 없으니!)
추상 클래스 구현하기
1. 메소드에 구현코드가 없다면 abstract로 선언
2. abstract로 선언된 메서드를 가진 클래스는 abstract로 선언
3. 모든 메서드가 구현된 클래스라도 abstract로 선언되면 추상 클래스로 인스턴스화 할 수 없다.
4. 추상 클래스의 추상 메서드는 하위 클래스가 상속하여 구현
5. 추상 클래스 내의 추상 메서드 : 하위 클래스가 구현해야하는 메서드
6. 추상 클래스 내의 구현된 메서드 : 하위 클래스가 공통으로 사용하는 메서드(필요에 따라 하위 클래스에서 재정의)
위와 같이 이탤릭채로 기울어진 애들이 추상 클래스 및 추상 메서드
위처럼 추상 클래스내에 구현부 있는 메서드도 있긴하다!!
다만 위의 코드는 아래와 같이 수정해야함
이렇게 추상 클래스 및 추상 메서드는 abstract 예약어를 사용해줘야함
추상 클래스나 메서드를 왜 사용할까?
상위 클래스에서 굳이 구현할 이유가 없고 상속받는 애들이 사용해야 할 클래스이거나 메서드 면 상속받을 때 하위 클래스들이 임의로 사용하라는 느낌 -> 미리 이름만 정해놓는다고 생각하자
즉, 상속을 위해서이다!!!!
ex) 아까 위에 있던 Computer 추상 클래스를 이용하여 상속 받아보자
이렇게 상속받으면 display 및 typing 추상 메서드를 구현하라고 나오면 이를 구현했다.
만약 display와 typing 중에 하나만 구현한다면?
그럼 하나만 구현한 코드의 클래스가 추상 클래스가 되므로 하위 클래스에 abstract를 넣어야한다.
즉, 추상 메서드를 포함하고 있으니 하위 클래스인 NoteBook은 추상 클래스가 된다.
또한, 이 NoteBook을 상속하는 또 하나의 하위 클래스를 만든다면
구현하지 않았던 typing을 구현해서 클래스로 만들거나, 구현안하고 abstract 해주거나
근데 클래스 내부 메서드를 모두 구현했는데 abstract로 해준다면??
-> abstract로 정의된 클래스는 추상 클래스이므로 new를 할 수 없다!!!!!
이런 애들은 상속만을 위해 사용하는 클래스임!!
2. 추상 클래스의 응용 - 템플릿 메서드 패턴
템플릿 메서드(틀을 가진 메서드)
추상 메서드나 구현된 메서드를 활용하여 코드의 흐름을 정의하는 메서드
1. final로 선언하여 하위 클래스에서 재정의 할 수 없게 함(흐름을 가진 메서드이기에)
-> 클래스에 final이 들어가면 상속 못받음!
2. 프레임워크에서 많이 사용되는 설계 패턴(프레임워크를 도입한다 -> 흐림이 정해진 곳에 넣는 것)
3. 추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름 정의 및 하위 클래스에서 다르게 구현되어야 할 부분은 추상 메서드로 선언하여 하위 클래스에서 구현하도록 함
ex)
위의 시나리오가 바뀌면 안된다!!! 그렇기 때문에 final을 넣어주자
새로운 추상 메서드를 넣고싶다면 넣고 나머지 부분에서 다 구현해주면 된다. -> 안그러면 오류나
구현 안하고 오류가 안나려면?
구현해야 할 메서드에 {}를 해서 구현으로 만들자 -> 내용이 없는 거지 구현이 안 된 게 아니니까!!
-> 이후 메소드 오버라이딩으로 재정의하면 된다.
// final 예약어 //
1. fianl 변수 : 값이 변경될 수 없는 상수
2. fianl 메서드 : 하위 클래스에서 재정의 할 수 없는 메서드
3. final 클래스 : 상속할 수 없는 클래스
// 여러 자바 파일에서 사용하는 상수 값 정의 //
내가 만약 자주 사용할 것 같은 상수들이 있다면 따로 클래스를 만들어서 그 안에 상수들을 정의 후 호출해서 쓰자
이렇게 필요할 때 define 해서 사용(자바는 외부 클래스를 가져다가 쓸 수 있으니까)
'Programming 언어 > JAVA' 카테고리의 다른 글
13. Object 클래스 및 메서드 활용 (0) | 2023.08.30 |
---|---|
12. 인터페이스(interface) (0) | 2023.08.30 |
10. 메서드 재정의(overring), 다형성, 다운 캐스팅 및 instanceof (0) | 2023.08.30 |
9. 상속에서 클래스 생성 과정과 형 변환 (0) | 2023.08.30 |
8. 객체 간 상속, 객체 배열 및 ArrayList, 캡슐화 (0) | 2023.08.30 |