Louie NRT Story

[프로그래밍] 객체구조 - 01 본문

전기차충전기

[프로그래밍] 객체구조 - 01

hyeok0724.kim@gmail.com 2021. 9. 25. 08:29
반응형

작성일: 21년 9월 25일

PS.

1) Java 개발할 일이 생기면 다시 정리해보았음

일을 하면서 느끼는 것인데 혼자 개발할 때는 뭘 어떻게 만들든 문제가 없다. 잘만 돌아가면 됐지 내부가 어떻게 생겼든 무슨 상관이 있겠냐

객체지향이라는 것은 방법론일 뿐이고 혼자 만들면서 전부 파악하고 있고 문제 없이 잘 만들수 있다고 한다면 크게 문제가 없다.

하지만 SW가 커지고 협업을 하게 되면서 서로간의 예의라고 생각한다. 급하게 만들다보니 정리가 안되었다. 빨리 해야 하다보니.... 큰 기업에 있을떄는 주변에 감시자가 많았다. 관리자가 항상 있었기 때문에 어떤 코드를 커밋했는지와 개발 문서까지 꼼꼼히 확인해주었고 개발자들 끼리 크로스 체크를 하기 때문에 대충대충 하면 회사에서의 나의 평가도 대충대충 나온다. 

2) 각자 학생들을 스레드로 돌리면 어떨까라는 생각도 하게 되는데 그렇게 하지 않은 이유는 교실을 공유하기 때문임. 그러면 세마포어를 사용해야 하기 때문에 그렇게 하지 않았다. 공유변수를 사용하는 것도 문제지만 어쩔 수 없이 사용하게 되었을때 스레드를 돌려 세마포어를 사용하게 되면 개발자가 더욱 신경을 써야하기 때문에 가능하다면 스레드를 사용하지 않는 것이 맞다고 필자는 생각한다.

 

※ 코드에 청소들을 보면 교실이라는 클래스를 공유하고 있다. 원래는 이렇게 하면 안된다. 예제를 들기 위해서 만든 코드 이다.

 

Index

1. 배경 설명

2. 절차적 프로그래밍

3. 객체지향 프로그래밍

4. 인터페이스 추가하기

 

 

1. 배경 설명

 - 학교에서 선생님이라고 가정을 해보자

 - 학생들(영수, 혁순, 철권, 민호)에게 청소를 시킬 것임

 - 영수 -> 창문닦기, 혁순 -> 창문닦기, 철권 -> 바닥쓸기, 민호 -> 칠판닦기 라고 임무를 배정 할 것임

 - 창문닦기하는 동안에 행주가 더러워지면 행주를 빨아야하고 윈덱스가 떨어지면 리필을 해야함

 - 바닥쓰는 동안에 쓰레받이가 꽉 차면 비워주어야함

 - 칠판청소 할 때 지우개가 더러워지면 털어주어햐함

 - 청소를 할 때마다 교실의 창문, 바닥, 칠판의 청결도는 조금씩 올라가서 100에 도달하면 청소를 마무리 함

 

 

2. 절차적 프로그래밍

 1) 코드 설명

  - 영수, 혁순, 철권, 민호에게 청소도구들을 만들어서 손에 쥐어줌

  - while()문을 선생님이라고 했을때 한명한명 청소를 지시해주어야하며 청소도구들 상태를 계속 확인하면서 뭘해야 할지 일일이 지시해주어야함

 

 2) 문제점

  - 선생님은 철수라는 친구가 새로 와서 칠판 닦기를 시키려면 지우개를 만들어야하고 지우개 더러워지면 털어줘야 하는 것을 알려주어야함

  - 철수에게 칠판청소라는 함수를 알려주고 while()안에 코드도 추가해주어 일일이 지시해주어야함

  - 한명 추가하는 것은 가능하지만 100명을 추가해야 한다면 변수도 100개 생성해주고 코드가 엄청 늘어날 것임

  - 중복되는 변수들과 작업들이 계속 해야 함

struct 교실{
    호실 = 101;
    창문 = 0;
    바닥 = 0;
    칠판 = 0;
};

int 영수_행주 = 100;
double 영수_윈덱스_리터 = 10.0;

int 혁순_행주 = 100;
double 혁순_윈덱스_리터 = 10.0;

double 철권_쓰레받기 = 0;

int 민호_지우개 = 100;

while(true){
    if(영수_행주 <= 10){
        빨아오기(영수_행주);
    }
    if(영수_인덱스_리터 <= 1){
        리필해오기(영수_윈덱스_리터);
    }
    if(혁순_행주 <= 10){
        빨아오기(혁순_행주);
    }
    if(혁순_인덱스_리터 <= 1){
        리필해오기(혁순_윈덱스_리터);
    }
    if(철권_쓰레받기 >= 0.9){
        비우기(철권_쓰레받기);
    }
    if(민호_지우개 <= 10){
        털기(민호_지우개);
    }
    if(교실.창문 >= 100 && 교실.바닥 >= 100 && 교실.칠판 >= 100){
        청소완료(교실);
    }
    창문_닦기(교실, 영수_행주, 영수_윈덱스_리터);
    창문_닦기(교실, 혁순_행주, 혁순_윈덱스_리터);
    바닥_쓸기(교실, 철권_쓰기받기);
    칠판_닦기(교실, 민호_지우개);
}

 

 

3. 객체지향 프로그래밍

 1) 코드설명

  - 클래스를 만들어서 내부에 필요한 청소도구를 만들어놓고 내부에 청소방법들이 매소드로 구현되어 있음

  - 선생님은 사전에 공지해서 창문청소, 바닥청소, 칠판청소 방법에 대해 알려줌

  - 영수, 혁순, 철권, 민호에게 창문청소, 바닥청소, 칠판청소 방법에 따라 청소하라고 지정해줌

  - while() 선생님은 청소하라고만 시키고 알아서 하도록 만듬

 2) 문제점

  - 청소하라고 시켜야 되는데 지시 명령어가 다 다름

  - 바닥_청소하기, 창문_청소하기, 칠판_청소하기 라는 것을 선생님은 암기하고 있어야함

public class 교실{
    int 창문청결도 = 0;
    int 바닥청결도 = 0;
    int 칠판청결도 = 0;
}

public class 창문청소{
    private 교실 담당_교실;
    private int 행주 = 100;
    private double 윈덱스_리터 = 10.0;

    public 창문청소(교실 담당_교실){
        this.담당_교실 = 담당_교실
    }

    public void 창문_청소하기(){
        if(담당_교실.창문 <= 100){
            if(행주 <= 10){
                빨아오기(행주);
            }
            if(인덱스_리터 <= 1){
                리필해오기(윈덱스_리터);
            }
            창문닦기(담당_교실, 행주_깨끗함, 윈덱스_리터);
        }
    }    
}

public class 바닥청소{
    private 교실 담당_교실;
    private double 쓰레받기 = 10.0;

    public 바닥청소(교실 담당_교실){
        this.담당_교실 = 담당_교실
    }

    public void 바닥_청소하기(){
        if(담당_교실.바닥 <= 100){
            if(쓰레받기 >= 0.9){
                비우기(쓰레받기);
            }
            바닥쓸기(교실, 쓰기받기);
        }
    }
}

public class 칠판청소{
    private 교실 담당_교실;
    private double 지우개 = 10.0;

    public 칠판청소(교실 담당_교실){
        this.담당_교실 = 담당_교실
    }

    public void 칠판_청소하기(){
        if(담당_교실.칠판 <= 100){
            if(지우개 <= 10){
                털기(지우개);
            }
            칠판닦기(교실, 지우개);
        }        
    }
}

교실 담당호실 = new 교실(101호);

창문청소 영수 = new 창문청소(담당호실);
창문청소 혁순 = new 창문청소(담당호실);
바닥청소 철권 = new 바닥청소(담당호실);
칠판청소 민호 = new 칠판청소(담당호실);

while(true){    
    영수.창문_청소하기();
    혁순.창문_청소하기();
    철권.바닥_청소하기();
    민호.칠판_청소하기();

    if(담당호실.창문 >= 100 && 담당호실.바닥 >= 100 && 담당호실.칠판 >= 100){
        청소완료(담당호실);
    }
}

 

 

4. 인터페이스 추가하기

※ 코드가 좀 맞지는 않지만 컨셉만 이해해주기 바랍니다.

 1) 코드설명

  - ArrayList를 만들어서 학생들에게 청소구역과 청소역할들을 집어넣음

  - 선생님은 아무것도 신경안쓰고 인터페이스에서 지정한 "청소_시작하기()" 함수만 알고 있으면 됨

  - ArrayList 안에 학생들에게 청소시작하기만 말하면 알아서 청소를 시작함

public interface 청소담당{
    public void 청소_시작하기();
}

public class 창문청소 implements 청소담당{
    private 교실 담당_교실;
    private int 행주 = 100;
    private double 윈덱스_리터 = 10.0;

    public 창문청소(교실 담당_교실){
        this.담당_교실 = 담당_교실
    }

    public void 창문청소_시작하기(){
        if(담당_교실.창문 <= 100){
            if(행주 <= 10){
                빨아오기(행주);
            }
            if(인덱스_리터 <= 1){
                리필해오기(윈덱스_리터);
            }
            창문닦기(담당_교실, 행주_깨끗함, 윈덱스_리터);
        }
    }

    @override
    public void 청소_시작하기(){
        창문청소_시작하기();
    }
}

public class 바닥청소 implements 청소담당{
    private 교실 담당_교실;
    private double 쓰레받기 = 10.0;

    public 바닥청소(교실 담당_교실){
        this.담당_교실 = 담당_교실
    }

    public void 바닥청소_시작하기(){
        if(담당_교실.바닥 <= 100){
            if(쓰레받기 >= 0.9){
                비우기(쓰레받기);
            }
            바닥쓸기(교실, 쓰기받기);
        }
    }

    @override
    public void 청소_시작하기(){
        바닥청소_시작하기()
    }
}

public class 칠판청소 implements 청소담당{
    private 교실 담당_교실;
    private double 지우개 = 10.0;

    public 칠판청소(교실 담당_교실){
        this.담당_교실 = 담당_교실
    }

    public void 칠판청소_시작하기(){
        if(담당_교실.칠판 <= 100){
            if(지우개 <= 10){
                털기(지우개);
            }
            칠판닦기(교실, 지우개);
        }        
    }

    @override
    public void 청소_시작하기(){
        칠판청소_시작하기();
    }
}

교실 담당호실 = new 교실(101호);

ArrayList <청소담당> 청소담당들 = new ArrayList<>();
청소담당들.add(new 창문청소(담당교실, 영수));
청소담당들.add(new 창문청소(담당교실, 혁순));
청소담당들.add(new 바닥청소(담당교실, 철권));
청소담당들.add(new 칠판청소(담당교실, 민호));

while(true){
    for(청소담당 담당: 청소담당들){
        담당.청소_시작하기();
    }

    if(담당호실.창문 >= 100 && 담당호실.바닥 >= 100 && 담당호실.칠판 >= 100){
        청소완료(담당호실);
    }
}

 

Referece:

https://youtu.be/vrhIxBWSJ04

 

반응형
Comments