abstract란 공통되는 특성을 추출한 것이다.
또한 abstract 클래스나 메소드를 사용하기 위해서는 반드시 상속해서 사용하도록 강제하는 것을 말한다.
예를 들자면 Animal.class는 새, 곤충, 물고기(실체 클래스)를 상속하는 추상 클래스라는 것이다.
메소드가 하나라도 추상 메소드라면 해당 클래스또한 추상 클래스가 된다.
(추상 클래스 안의 메소드가 전부 추상 메소드일 필요는 없다.)
추상 클래스는 실체 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에 객체를 직접
생성하지 못한다. 다시 말해서 추상 클래스는 new 연산자를 통해서 인스턴스를 생성시키지 못한다는 것이다.
abstract public class A {
public abstract int b();
// 본체({ })가 있는 메소드는 abstract를 쓸 수 없다.
// 예) public abstract int c(){System.out.println("코린이");}
// 추상 클래스 내에는 추상 메소드가 아닌 메소드가 존재 할 수 있다.
public void d(){
System.out.println("world");
}
}
메소드 b는 abstract로 선언되어 있어서 구체적인 구현은 하위 클래스에서 오버라이딩을 해야한다.
위와 같이 이것처럼 내용이 비어있는 메소드를 추상 메소드라고 부른다.
추상 메소드를 하나라도 포함하고 있는 클래스는 추상 클래스가 되고,
자연스럽게 클래스의 이름 앞에 abstract가 붙게 된다.
class B extends A{
public int b(){return 1;}
}
추상 클래스를 설계할 때, 하위 클래스가 반드시 실행 내용을 채우도록 강요하고 싶은 메소드가 있을 경우,
해당 메소드를 추상 메소드로 선언하면 된다.
여기서 자식 클래스는 반드시 추상 메소드를 오버라이딩해서 실행 내용을 작성해야 한다.
예를 들자면 동물 클래스(추상 클래스)에서 동물들이 소리를 내긴 하는데 각각의 동물들은 다른 소리를 낼 때를
생각할 수 있다.(강아지는 멍멍, 고양이는 야옹)
public class AbstractDemo {
public static void main(String[] args) {
B obj = new B();
System.out.println(obj.b());
// A obj = new A();는 오류 발생
// A는 추상 클래스로 구체적인 메소드의 내용이 존재하지 않아 인스턴스화할 수 없다.
}
}
그렇다면 추상 클래스를 사용하는 이유는 뭘까?
실체 클래스들의 공통된 필드와 메소드의 이름을 통일하고
실체 클래스를 작성할 때 시간을 절약할 수 있다는 장점이 있다.
추상이 상속을 강제하는 것이라면 final은 상속 및 변경을 금지하는 것을 말한다. 글 객체 지향 프로그래밍
코드 중 static double PI = 3.14;는 공통적으로 사용하면서 바뀌지 않는 경우를 말한다.
ststic은 공통적인 부분에 해당하고 final을 추가한다면 바뀌지 않는 것을 뜻하게 된다. (static final double ...)
만약 final이 없다면 3.14라는 값을 사용자가 원하면 수정할 수도 있었다는 것이다.
상수(static final)와 enum
상수 사용법) 클래스명.상수
public class Test {
public static final String MA = "MA";
public static final String FE = "FE";
public static void main(String[] args) {
String gen1;
gen1 = Test.MA;
//gen1 = MA;도 가능
gen1 = Test.FE;
// MA나 FE를 원하는데 다른 값이 들어온다면 수정이 된다는 문제점이 있음
// -> 이러한 상수의 문제점을 해결하는 것이 ENUM
gen1 = "abc";
// 14번줄에서 final이 없는경우 gen1에는 문자열 아무거나 대입 가능
// -> final이 있기 때문에 처음 지정값만 가능
// final String gen1 = "abc"; 오류 발생
// enum에서 객체 생성 방법 : enum클래스이름 객체이름;
// enum 자체가 타입이 되므로 String과 같이(6번줄) 선언해주지 않아도
Gender gen2;
gen2 = Gender.MA;
gen2 = Gender.FE;
//gen2 = "def"; 에러 발생 -> 특정 값만 가질 수 있게 됨
}
}
enum Gender{
MA, FE;
}
'강의 정리하기 > JAVA' 카테고리의 다른 글
다형성과 오버로딩, 인터페이스 (0) | 2022.01.25 |
---|---|
인터페이스 (0) | 2022.01.18 |
접근 제한자 (0) | 2022.01.17 |
컴파일, 패키지 (0) | 2022.01.17 |
오버라이딩, 오버로딩 (0) | 2022.01.12 |