이 중 추상화에 대해서 다루는 것이 이 포스팅의 목적이다.
추상화란 무엇일까? 추상화(abstraction)는 복잡함을 줄이고 좀 더 명확한 이해를 위해서 의도적으로 절차나 물체를 생략하는 것이다.
이 추상화는 몇가지 차원에서 이루어진다.
예를 들어 "서울 노원구에 사는 김철수"와 "부산 해운대에 사는 이영희"라는 객체가 있으면 추상화를 통해서 보면 "대한민국 국민" 정도로 볼 수 있을 것 같다.
그렇다면 실제 추상화가 어떻게 이루어지는지 살펴 보도록 하자.
학생 관리 프로그램을 만든다고 하자.
이름, 학년, 반, 번호, 국어 성적, 영어 성적, 전화번호, 키, 몸무게, 달리기 속도, 머리색, 발사이즈, 취침 시간, 취미, 특기, 노래 실력...
이름, 학년, 반, 번호, 국어 성적, 영어 성적, ...
이름, 학년, 반, 번호, 키, 몸무게, 달리기 속도, ...
이름, 학년, 반, 번호
등이 있다. 이 부분만 따로 묶어 놓는다. 그리고 사용되지 않는 머리색, 노래 실력, ...
같은 것들은 과감히 버린다. 실제 코드에서 추상화는 어떻게 이루어질까? 아래 예시를 살펴보도록 하자.
class Example1 {
private int password;
public int getPassword() {
return this.password;
}
public void setPassword(int password) {
this.password = password;
}
public void hello() {
System.out.println("Hello Ex1");
}
}
class Example2 {
private int password;
public int getPassword() {
return this.password;
}
public void setPassword(int password) {
this.password = password;
}
public void hello() {
System.out.println("Hello Ex2");
}
}
위 사례를 보았을 때, 위 코드는 필드와 getter/setter 메소드가 중복되는 것을 알 수 있다. 그리고 hello() 메소드는 내용은 다르지만 메소드 명은 동일하다. 공통적인 부분을 아래와 같이 하나로 묶어보자.
class Example {
private int password;
public void getPassword() {
return this.password;
}
public void setPassword(int password) {
this.password = password;
}
public void hello() {
System.out.print("Hello");
}
}
그리고 만약 Example1 과 같은걸 하나 만들고 싶다면 다음과 같이 하면 된다. 이에 대해서는 뒤쪽에 나오는 상속에 조금 더 자세히 다룰 계획이다.
class Example1 extends Example {
@Override
public void hello() {
super.hello();
System.out.println(" Ex1");
}
}