내가 이전에 포스팅 했던 추상화는 just.... 가짜였다...ㅋ
추상화의 뜻 정도만 알아보는 것이었지 말이야.. 진짜 추상화를 알기 전까지는 나도 추상화를 안다고 자부했었는데.. 가짜였서..하..ㅋ
그래도 개념을 알고 있다는 게 시작이 반(? 임ㅎ 나름 저거 이해하는데도 반나절은 걸렸다ㅜㅜ 내 머리는 너무나 나빠서~
추상화
🔽 추상화의 ㅊ...정도 알아보기
자바에서 추상화란?
공통된 성질을 모아 한 곳에 모아 불필요한 세부 사항을 제거하여 단순화하는 것을 말 한다.
자바에서 추상화를 위해서는 “abstract” 제어자가 필요하다. 이 키워드는 추상 클래스와 추상 메서드를 정의하기 위해 사용되는 키워드이다.
abstract 클래스를 사용하기 위해서는 반드시 abstract 클래스를 상속받은 클래스를 만들어서 사용해야 한다.
// 추상 클래스
abstract class A{
// 추상 메서드
public abstract int b();
}
}
public class AbstractEx {
public static void main(String[] args) {
// A obj = new A(); 에러 발생
}
}
A 클래스를 사용하고 싶은데 에러가 발생한다. 따라서 abstract 추상화의 조건인 “abstract 클래스를 상속받은 클래스를 만들어서 사용”을 위해 A 클래스를 상속 받는 클래스 B를 만들어 준다.
class B extends A {
// A 상속 받는 B 클래스 추가
}
A 클래스 안에는 public abstract int b(); 라는 추상 메서드가 있다. 이 추상 메서드를 사용하기 위해서는 반드시 구체적인 내용인 본체를 정의함으로써 @ 오버라이딩 을 해줘야 한다.
class B extends A {
public int b(){
return 0;
}
}
이것은 즉 abstract 라는 것은 "상속"을 강제하고 있음을 알 수 있다. 그리고 추상 클래스는 구체적인 로직을 갖고 있지 않고 형식만을 갖고 있다. 메서드에 대한 구체적인 내용은 메서드를 상속받아 사용하는 클래스 B 에 있다.
✅ abstract 를 가지고 있을 때는 public abstract int b(){}와 같이 {} 구체적인 로직을 가지고 있으면 안된다.
✅ 클래스가 abstract라서 메서드가 abstract가 되는 것 X / 메서드가 abstract를 가지고 있으면 클래스는 추상 클래스가 된다. 멤버 중에 하나라도 abstract를 가지고 있다면 클래스는 abstract 추상 클래스가 된다.
✅ 추상 클래스도 구체적인 로직을 가지고 있는 메서드를 가질 수 있다.
abstract class A{
public abstract int b();
public int c(){
System.out.println("구체적인 로직");
}
}
➡️ 정리를하면 이렇다. 추상클래스에서 부모 클래스는 메서드의 시그니처만 정의해놓고 그 메서드의 구체적인 내용은 메서드를 상속받은 자식 클래스가 정의하도록 한다. 따라서 추상 클래스(부모 클래스)를 상속받는 자식 클래스에서는 추상 메서드를 반드시 구현해야 한다.
java: java_0426.B is not abstract and does not override abstract method b() in java_0426.A
만약 추상 메서드를 제외하고 구현하면 다음과 같은 에러가 발생한다.
추상 클래스를 사용하는 이유
다형성을 구현하고, 코드의 재사용성을 높이기 위해 사용된다. 추상 클래스를 사용하면 일반적인 일반적인 동작을 정의하면서도 자식 클래스에서 필요에 따라 동작을 변경할 수 있는 유연성을 제공하며, 코드의 재사용성을 높일 수 있다.
추상화는 왜 쓰는지, 그리고 어떻게 사용하는지도 알겠다. 예시도 이렇게 저렇게 혼자서 만들어 보면서 꽤나 재미있었다. 별 건 아니었지만.. 오버라이딩이라는 개념과도 계속 이어졌고, 오늘 배운 다형성이 계속해서 이어지니 왔다갔다 하면서 공부하느라 조금 애를 먹었다 ㅎㅎ
'LANGUAGE > JAVA' 카테고리의 다른 글
[JAVA] 프로세스(Process)와 스레드(Thread) / 싱글 스레드와 멀티 스레드, 스레드 동기화, 상태 및 메서드 알아보기 (0) | 2023.05.08 |
---|---|
[JAVA] 컬렉션 프레임워크(Collection Framework) 기본 정리 / List, Set, Map (0) | 2023.05.03 |
[JAVA] 객체 지향 프로그래밍 / 다형성(polymorphism) - 오버로딩, 오버라이딩, 참조변수의 타입 변환, instanceof 연산자 (0) | 2023.04.27 |
[JAVA] 객체 지향 프로그래밍의 속성 / 캡슐화(Encaptulation) (0) | 2023.04.25 |
[JAVA] JAVA 객체지향 프로그래밍 / 메서드 오버라이딩(Method Overriding)이란? (0) | 2023.04.25 |