Posts 객체지향의 원리
Post
Cancel

객체지향의 원리

추상화

추상화를 수행하는 이유는 어떤 대상들의 공통적인 특징을 뽑아내서 정의하고 대상의 관심있는 부분을 정리함으로써 대상의 세세한 부분까지 신경쓰지 않아도 되기 때문입니다. 예를 들어, 카페 관련 정보 앱을 개발한다고 생각하면 스타벅스의 내부 인테리어, 의자 개수, 종업원의 유니폼 같은 세세한 정보를 일일이 관심을 가지는 것 보단 카페의 보편적인 매장 위치, 취급 품목, 전화번호 같은 정보에 관심을 가지는 것이 더 효율적일 것입니다. 반면, 조금만 다르게 추상화를 수행할수도 있습니다.

스타벅스, 이디야, 빽다방, … -> ( 카페 -> 매장위치, 취급품목, 전화번호 )

스타벅스, 평양냉면, 현대오일뱅크, … -> ( 영업점 -> 위치, 업종 )

IMG_1AEF76296870-1

그렇다면 만약 추상화를 수행하지 않은 코드는 어떨까요? 다음과 같이 하드코딩을 통하여 일일이 주문기능을 구현해주어야 합니다.

1
2
3
4
5
6
7
8
9
10
11
// 주문하기
switch (카페명) {
  case 스타벅스:
    // 사이렌오더
  case 이디야:
    // 키오스크
  case 빽다방:
    // 점원
  default:
    break;
}

추상화를 수행했다면, 아래와 같이 카페.주문하기()를 통해 함수를 호출만 해주면 됩니다. 만약 추가할 카페가 있다해도 doOrder()부분은 변경되지 않습니다.

1
2
3
4
void order(Cafe c) {
  // 스타벅스, 이디야, 빽다방에 따라 주문 형태가 달라짐
  c.doOrder();
}

캡슐화

여기서 말하는 캡슐화란 응집도를 높이고 결합도를 낮추는 행위를 의미하고 이는 정보 은닉이라는 방법으로 구현됩니다. 응집도란 클래스나 모듈 내부의 요소들이 얼마나 밀접하게 관련되어 있나를 의미하고, 결합도란 클래스나 모듈간의 의존도를 의미합니다. 따라서 기본적으로 추구하는 방향은 높은 응집도과 낮은 결합도를 가지도록 설계하는 것입니다. 정보 은닉이란 다른 클래스가 굳이 알 필요 없는 내용을 감추는 행위를 의미합니다. 아래 Server 클래스는 ip주소와, 실행중인 프로세스들이 공개되어 있어 누구나 접근하여 읽거나 쓰기가 가능합니다. Client클래스는 Server클래스의 멤버변수를 직접 변경하며 실행합니다. 이 코드는 다음 두 가지 문제가 있습니다.

  1. Server 측의 스펙이 변경되어 ipAddress가 long으로 변경된다면?
  2. process의 컨테이너를 ArrayList가 아닌 LinkedList로 변경된다면?

위 두가지 경우 모두 Server, Client 코드가 변경되어야만 합니다. 반면 멤버들을 비공개로 설정하고 올바르게 인터페이스를 노출했다면 Server코드만 변경하면 됩니다.

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
31
32
33
34
35
36
37
38
39
40
class Server {
    public int ipAddress;
    public ArrayList<Integer> process;

    public Server(int ipAddress) {
        this.ipAddress = ipAddress;
        this.process = new ArrayList<>();
    }

    public void setIpAddress(int ipAddress) {
        this.ipAddress = ipAddress;
    }

    public int getIpAddress() {
        return ipAddress;
    }

    public ArrayList<Integer> getProcess() {
        return process;
    }

    public void request() {
        System.out.println("요청입니다...");
    }

    public void response() {
        System.out.println("응답입니다...");
    }
}

public class Client {
    public static void main(String[] args) {
        Server server = new Server(127);
        server.ipAddress = 12;
        server.process.add(1);
        server.request();
        server.response();
    }
}

This post is licensed under CC BY 4.0 by the author.

[프로그래머스] 디스크 컨트롤러 풀이

-

Comments powered by Disqus.