안녕하세요 코이킹입니다.
이번 포스트에선 추상화에 대해서 설명하겠습니다.
1. 추상화란?
현실의 객체에서 핵심적인 것, 공통되는 것, 반복되는 것을 추려내는 것을 추상화라고 할 수 있습니다.
"헬스장에서 운동하는 것"으로 예를 들어본다면
어떤 사람은 스쿼트 렉에서 스쿼트로 다리 운동을 할 것이고, 어떤 사람은 스미스 머신에서 데드리프트로 등 운동을 ,
어떤 사람은 벤치에서 벤치프레스로 가슴운동을 할 것입니다.
위의 운동하는 사람들의 공통점을 추려내 보면
운동기구(스쿼트 렉, 스미스 머신, 벤치)에서
적절한 운동방법(스쿼트, 데드리프트, 벤치프레스)으로
특정한 신체(다리, 등, 가슴)를 단련하고 있습니다.
그리고 핵심적인 행위를 추려내 보면 "운동을 하다"가 되겠습니다.
Java에서는 위와 같은 추상화 작업을 도와주는 도구로 추상 클래스와 인터페이스가 있습니다.
아래의 예제 코드는 추상 클래스와 인터페이스를 사용하여 "헬스장에서 운동하는 것"을 추상화한 코드입니다.
package objective.basic06;
public abstract class WhoWorkout {
protected int muscle = 10;
// Sub
protected WorkOutTool workOutTool;
protected WorkOut workOut;
protected BodyPart bodyPart;
public WhoWorkout(WorkOutTool workOutTool, WorkOut workOut, BodyPart bodyPart) {
this.workOutTool = workOutTool;
this.workOut = workOut;
this.bodyPart = bodyPart;
}
public abstract void doWorkout(); // Core
}
interface WorkOutTool {
public void setTool();
}
interface WorkOut {
public void execute(BodyPart bodyPart);
}
abstract class BodyPart {
protected int fatigue = 0;
public void setEffect(int fatigue) {
this.fatigue = fatigue;
}
public abstract int getEffect();
}
핵심 행위인 "운동하는 것"은 추상 메서드로 추려내었고,
운동기구, 운동의 종류, 운동할 신체부위는 인터페이스와 추상 클래스의 참조 변수를 생성자의 파라미터로 받아서
다형성을 활용할 수 있게 하였습니다.
2. 추상 클래스
1) 추상 클래스란?
추상 클래스란 추상화를 진행하여 핵심적이고 공통적인 행위와 속성을 정의한 클래스입니다.
추상화가 진행되었기 때문에 추상 클래스 자체로는 인스턴스를 생성할 수 없고, 추상 클래스를 상속하는 자식 클래스의 객체를 통해서만 추상 클래스의 기능을 사용할 수 있습니다.
추상 클래스에서 핵심적이고 공통적인 행위를 정의한 메서드가 추상 메서드입니다.
이 추상 메서드는 상속하는 자식 클래스에서 세부내용을 반드시 재정의 해주어야 합니다.
※ 추상 클래스 선언하기
abstract class 클래스명 {
}
2) 추상 클래스를 사용하는 이유
추상 클래스를 사용하는 이유는 상속의 장점인 '유지보수성'과 '생산성'을 더 잘 살리기 위해서라고 할 수 있다.
공통되는 행위와 속성을 추상화하여 추상 클래스에 정의해두면 자식 클래스에서 같은 기능을 정의할 필요가 없고, 자식 클래스를 구현할 때 추상 메서드의 재정의가 강제되므로 일정한 형식의 자식 클래스의 구현을 강제할 수 있으므로 유지보수성이 좋아진다.
그리고 공통되는 기능과 속성이 추상 클래스에 구현되어 있으므로, 공통기능은 구현이 필요 없으며 추상 메서드를 구현하면 되므로 생산성이 증가한다.
3. 인터페이스
1) 인터페이스란?
인터페이스 역시 추상화를 도와주는 도구입니다.
추상 클래스는 세부사항까지 구현된 메서드를 가지고 있지만, 인터페이스에서는 메서드는 추상 메서드만을
변수는 public static final 만을 가질 수 있습니다.
추상 메서드가 미완성 설계도라면 인터페이스는 아주 기본적인 내용만이 기재된 극도로 추상화된 기본설계도와 같습니다.
※ 인터페이스 선언 방법
interface 인터페이스명 {}
2) 인터페이스를 사용하는 이유
인터페이스를 상속하는 클래스에서 인터페이스에 정의한 행위의 구현을 강제해야 할 때 사용합니다.
4. 추상 클래스와 인터페이스의 차이
※ 차이점 정리
추상클래스 | 인터페이스 | |
생성자 정의 | O | X |
변수의 접근제어자 | 제약 X | public static final만 가능 |
메서드의 접근제어자 | 제약 X | public abstract, public default, public static 만 가능 |
상속할 때의 키워드 | extends | implements |
다중상속 | X | O |
다중 상속을 제외한 인터페이스가 할 수 있는 것은 모두 추상 클래스가 할 수 있으므로 인터페이스가 필요 없어 보이지만 이 둘은 사용해야 할 상황이 다릅니다.
1) 상속관계 (is-A; 부모 클래스 is 자식 클래스) 일 때 추상 클래스 사용
상속의 장점을 극대화할 때 사용됩니다.
2) 포함관계(has-A; 클래스 has 인터페이스) 일 때 인터페이스 사용
상속의 경우, 자식 클래스와 부모 클래스가 강하게 결합됩니다. 예를 들면 필요 없는 메서드도 상속해야 하는 게 있습니다.
하지만 인터페이스를 상속하면 인터페이스의 메서드만을 구현하는 것으로 기능 확장이 가능하므로, 좀 더 유연한 기능의 확장이 가능합니다.
※ 추상 클래스 · 인터페이스 사용하기
package objective.basic06;
public class Person extends WhoWorkout{
public Person(WorkOutTool workOutTool, WorkOut workOut, BodyPart bodyPart) {
super(workOutTool, workOut, bodyPart);
}
@Override
public void doWorkout() {
workOutTool.setTool(); // 운동기구 준비
workOut.execute(bodyPart); // 운동방법 설정 / 운동부위 설정
int effect = bodyPart.getEffect();// 운동후 근육증가
muscle += effect;
System.out.println("Get Musle : "+effect+" Total Musle mass is "+ muscle);
}
public static void main(String[] args) {
// 운동기구, 운동방법, 운동부위를 생성자의 파라미터로 넘긴다.
// 파라미터로 넘기는 클래스에 따라서 doWorkout의 결과가 달라진다.
Person person = new Person(new SquatRack(), new Squat(), new Lag());
person.doWorkout();
}
}
class SquatRack implements WorkOutTool {
@Override
public void setTool() {
System.out.println("To prepare a SquatRack.");
}
}
class Squat implements WorkOut {
@Override
public void execute(BodyPart bodyPart) {
System.out.println("execute Squat");
}
}
class Lag extends BodyPart {
public Lag() {
this.setEffect(2);
}
@Override
public int getEffect() {
if (fatigue < 0) {
return 0;
}
return 2 * fatigue;
}
}
※ 예제 코드
https://github.com/leeyoungseung/algorithmBasic/tree/master/algorithm/src/objective/basic06
※ qiita에 투고한 URL
'프로그래밍 > Java-문법정리' 카테고리의 다른 글
【Java문법】스레드 (0) | 2022.01.27 |
---|---|
【OOP】05_다형성 (0) | 2022.01.20 |
【OOP】04_상속 (0) | 2022.01.18 |
【OOP】03_캡슐화 (0) | 2022.01.16 |
【OOP】02_멤버변수·메서드·생성자 (0) | 2022.01.15 |
댓글