일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- queue
- 스택
- stack
- 캡슐화
- 자료구조
- BFS
- unionfind
- 객체지향 프로그래밍
- 디바이스 입출력
- integretion test
- 파이썬
- error
- SW Expert Academy
- java
- 프로세스
- OOP
- 백준 #
- 논리 메모리
- DFS
- DP
- 다익스트라
- 큐
- Python
- OS
- 코딩 테스트
- 백준
- 유니크 키
- 데드락
- springboot
- 운영체제
- Today
- Total
middlefitting
[OOP] Java 추상화 이해하기 본문
추상화란
추상화는 객체지향 프로그래밍의 4대원칙 중 하나로, 객체의 공통적인 특성을 추출하여 인터페이스나 추상 클래스로 정의하는 것을 말합니다. 이들은 공통적으로 추상 메서드를 가지고 있으며 추상 메서드는 구현된 것이 전혀 없는 설계도라고 할 수 있습니다. 추상화를 통해 객체의 복잡한 내부 구현을 숨기고 객체 간의 관계를 단순화할 수 있습니다. 더불어 추상화는 상속, 다형성, 캡슐화와 함께 사용됨으로써 객체지향 프로그래밍의 핵심인 객체의 코드 유지보수성과 가독성을 제공할 수 있습니다.
추상화를 왜 사용하여야 할까?
추상화를 사용하면 다음과 같은 장점을 얻을 수 있습니다.
1. 필요한 정보에만 집중
객체의 내부 구현은 객체를 구성하는 속성과 메서드 등으로 이루어져 있습니다. 그리고 이 내부 구현은 종종 매우 복잡할 수 있습니다. 추상화는 클라이언트가 객체의 내부구현을 알 필요없이 필요한 정보에만 집중하게 할 수 있습니다.
이는 인터페이스 및 자바의 상속을 통해 예시를 들 수 있습니다. 다음과 같은 코드를 보겠습니다.
class BenzSClass {
static int price = 100000;
static int maxSpeed = 300;
static String body = "...";
static String Frame = "...";
static String PowerTrain = "...";
int color;
public BenzSClass(int color) {
this.color = color;
}
public int getPrice() {
return price;
}
public int getMaxSpeed() {
return maxSpeed;
}
public String getBody() {
return body;
}
public String getFrame() {
return Frame;
}
public String getPowerTrain() {
return PowerTrain;
}
public int getColor() {
return color;
}
public void setColor(int color) {
this.color = color;
}
}
이렇게 BenzSClass 클래스는 다양한 멤버들을 가지고 있습니다. 만약 어떤 클라이언트들은 단순히 price만 알고 싶다면 해당 클래스를 이해하는 것이 비효율적일 수 있습니다. 인터페이스를 사용한다면 다음과 같은 코드를 작성할 수 있을 것입니다.
public interface Benz {
int getMaxSpeed();
String getBody();
String getFrame();
String getPowerTrain();
int getColor();
}
interface Price {
int getPrice();
}
class BenzSClass implements Benz, Price{
int price = 100000;
int maxSpeed = 300;
String body = "...";
String Frame = "...";
String PowerTrain = "...";
int color;
public BenzSClass(int color) {
this.color = color;
}
public int getPrice() {
return price;
}
public int getMaxSpeed() {
return maxSpeed;
}
public String getBody() {
return body;
}
public String getFrame() {
return Frame;
}
public String getPowerTrain() {
return PowerTrain;
}
public int getColor() {
return color;
}
}
이렇게 인터페이스를 사용한다면 Price 인터페이스를 통해 클라이언트들은 다른 구성요소들을 알 필요없이 가격적인 부분에만 집중할 수 있게 됩니다.
3. 객체의 필요한 부분만을 노출시키고 내부 구현을 감출 수 있다
내부 구현을 감추는 것은 캡슐화의 영역이지만 추상화와 캡슐화는 밀접한 관련이 있다는 것을 말씀드리고 싶습니다. 캡슐화와 함께 사용한다면 위의 코드는 다음과 같이 사용할 수 있을 것입니다.
public interface Benz {
int getMaxSpeed();
String getBody();
String getFrame();
String getPowerTrain();
int getColor();
}
interface Price {
int getPrice();
}
class BenzSClass implements Benz, Price{
private int price = 100000;
private int maxSpeed = 300;
private String body = "...";
private String Frame = "...";
private String PowerTrain = "...";
private int color;
public BenzSClass(int color) {
this.color = color;
}
public int getPrice() {
return price;
}
public int getMaxSpeed() {
return maxSpeed;
}
public String getBody() {
return body;
}
public String getFrame() {
return Frame;
}
public String getPowerTrain() {
return PowerTrain;
}
public int getColor() {
return color;
}
}
추상화를 통해 객체의 필요한 부분에만 집중할 수 있게 함과 동시에 캡슐화를 통해 객체의 내부 구현을 외부에서 직접 액세스 할 수 없도록 만든 것입니다. 이렇게 추상화와 캡슐화를 함께 사용함으로써 클라이언트는 객체의 내부 구현을 알 필요없이 필요한 부분에만 접근할 수 있고, 클래스 설계자는 인터페이스를 통해 어느 부분을 클라이언트에 드러내야 할지 빠르게 판단하고 나머지 부분은 접근제어자를 통해 직접적인 변경을 막음으로써 보안을 강화할 수 있습니다.
3. 변경에 유리한 추상화
추상화된 코드는 다형성을 통해 구체화된 코드보다 유연하게 사용할 수 있습니다. 예를 들어 구체화된 클래스 참조변수에 대한 코드를 작성한다면 클래스를 변경해야 하는 상황이 왔을 때, 수많은 코드의 변경이 이루어지는 상황이 생길 것입니다.
인터페이스 참조변수에 대한 코드를 작성한다면, 인터페이스를 구현한 수많은 클래스들이 해당 인터페이스의 추상 메서드를 모두 동일하게 가지고 있기 때문에 인터페이스 구현체를 변경하는 상황이 오더라도 코드를 변경하지 않아도 됩니다.
'JAVA' 카테고리의 다른 글
getter, setter 그리고 캡슐화 (2) | 2023.05.02 |
---|---|
Java 메서드 오버라이딩에 관하여 (0) | 2023.03.12 |
[OOP] 다형성이란 무엇일까 (0) | 2023.02.21 |
[OOP] Java 상속에 관하여 (0) | 2023.02.20 |
[OOP] 캡슐화란 무엇일까 (0) | 2023.02.17 |