본문 바로가기

Programming 언어/JAVA

11. 추상 클래스의 의미 및 응용

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를 넣어야한다.

typing 구현 X

즉, 추상 메서드를 포함하고 있으니 하위 클래스인 NoteBook은 추상 클래스가 된다.

또한, 이 NoteBook을 상속하는 또 하나의 하위 클래스를 만든다면

구현하지 않았던 typing을 구현해서 클래스로 만들거나, 구현안하고 abstract 해주거나

근데 클래스 내부 메서드를 모두 구현했는데 abstract로 해준다면??

-> abstract로 정의된 클래스는 추상 클래스이므로 new를 할 수 없다!!!!!

이런 애들은 상속만을 위해 사용하는 클래스임!!

2. 추상 클래스의 응용 - 템플릿 메서드 패턴

템플릿 메서드(틀을 가진 메서드)

추상 메서드나 구현된 메서드를 활용하여 코드의 흐름을 정의하는 메서드

1. final로 선언하여 하위 클래스에서 재정의 할 수 없게 함(흐름을 가진 메서드이기에) 

-> 클래스에 final이 들어가면 상속 못받음!

2. 프레임워크에서 많이 사용되는 설계 패턴(프레임워크를 도입한다 -> 흐림이 정해진 곳에 넣는 것)

3. 추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름 정의 및 하위 클래스에서 다르게 구현되어야 할 부분은 추상 메서드로 선언하여 하위 클래스에서 구현하도록 함

ex)

위의 시나리오가 바뀌면 안된다!!! 그렇기 때문에 final을 넣어주자

새로운 추상 메서드를 넣고싶다면 넣고 나머지 부분에서 다 구현해주면 된다. -> 안그러면 오류나

구현 안하고 오류가 안나려면?

구현해야 할 메서드에 {}를 해서 구현으로 만들자 -> 내용이 없는 거지 구현이 안 된 게 아니니까!!

-> 이후 메소드 오버라이딩으로 재정의하면 된다.

// final 예약어 //

1. fianl 변수 : 값이 변경될 수 없는 상수

2. fianl 메서드 : 하위 클래스에서 재정의 할 수 없는 메서드

3. final 클래스 : 상속할 수 없는 클래스

// 여러 자바 파일에서 사용하는 상수 값 정의  //

내가 만약 자주 사용할 것 같은 상수들이 있다면 따로 클래스를 만들어서 그 안에 상수들을 정의 후 호출해서 쓰자

이렇게 필요할 때 define 해서 사용(자바는 외부 클래스를 가져다가 쓸 수 있으니까)