ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (Java)아주 간단한 스마트홈 시스템 구현
    개발 완료 2020. 10. 24. 16:39
    반응형

    1. 서론

    컴퓨터공학과 복수전공 두 번째 학기입니다. 첫 학기에는 운영체제, 컴퓨터 구조와 같은 이론 중심의 과목을 듣느라 기대했던 실제 코드를 작성해보는 프로젝트를 해보지 못했습니다. 이번 학기에 자바 프로그래밍 수업을 통해서 처음으로 웹이 아닌 다른 것을 만들어 봤습니다. 또한 제가 만든 기준, 일정으로 편하게 개발하는 것이 아닌, 누군가 조건을 주고 그에 맞게 개발하는 것을 처음으로 해봤습니다. 물론 학점이라는 점수의 압박도 있었지만, 타인이 요구하는 결과물을 만든다는 것이 혼자서 개발을 하는 것과는 많은 차이가 있었습니다. 

     

    2. 사용된 기술

    • java 11

     

    3. 코드

    github.com/YeonCheolGit/SimpleSmartHome

     

    YeonCheolGit/SimpleSmartHome

    Contribute to YeonCheolGit/SimpleSmartHome development by creating an account on GitHub.

    github.com

     

    기본적으로 java만을 이용해서 아주 간단한 스마트홈 시스템을 구현하는 것 입니다. 코드를 간략히 설명하겠습니다. 

     

    1. 사용자가 방에서 나와 "Hey, Siri"를 부르면서 시작하는 가정입니다. 대소문자는 무시하고, 잘 못 부를 경우 다시 불러야 합니다.
    2. 집안의 불을 켤 것인지 물어봅니다. 
    3. 중간중간 Thread.sleep() 메서드를 걸어뒀습니다. 이는 실제 기기가 구동한다고 가정했을 때 구동 시간이 걸리는 것을 표현했습니다. 당연히 실제 product에서는 제거해야 합니다.
    4. 날씨를 분석 후 창문을 닫을지, 열 것인지 판단합니다. 판단 기준은 Math.random()을 사용합니다. 
    5. 날씨와 어울리는 노래를 추천합니다. 사용자가 추천 노래를 거부하면, 다른 노래를 추천 합니다. Y, N 입력으로 구분합니다. 
    6. 주변의 소음을 분석해서 스피커의 볼륨을 올릴지 내릴지 판단합니다. 소음의 기준은 Math.random()으로 50을 기준점으로 잡았습니다.
    7. 모든 과정을 처리 후 시스템이 자동으로 종료되며, 종료되어도 음악은 계속 나온다는 안내를 합니다.

     

    전체 프로세스 진행 입니다. 파란색으로 표시된 글자들이 사용자가 입력하는 부분 입니다.

     

    4. 중점 사항 및 문제점

    4. 1. Main 클래스

    main 메서드가 있는 Main 클래스에는 해당 기능을 실행하는 메소드들만 남겨 두려고 노력 했습니다. 이는 다른 사용자가 Main 클래스만 보더라도 메소드를 읽으면서, 전체 프로젝트의 구동 흐름을 파악할 수 있기 때문 입니다. 프로젝트 전체의 리모콘 혹은 설명서 같은 역할이라고 생각 합니다. 그래서 메소드의 이름을 최대한 직관적으로 작성 했습니다. 

     

    4. 2. 요구 문법 조건

    기본적으로 이 프로젝트는 학교 과제로서 시작을 했습니다. 그렇기 때문에 반드시 사용해야 하는 문법 조건들이 있었습니다. 생성자, 메소드 오버로딩, this./this(), static 변수/메서드를 모두 사용하는 것이었는데요.

     

    이미 위의 문법들을 개념적으로 다 알고 있었지만, 직접 코드로서 구현을 하는 것은 어려웠습니다. "내가 머릿속으로 개념을 이해하고 있는 게 끝은 아니구나"라는 것을 뼈저리게 느꼈습니다. 그러다 보니 문법 사용에 있어서 매끄럽지 못하고, 어색하게 억지로 끼워 넣은 듯한 코드가 많습니다. 

     

    하지만 분명한 것은 객체지향 설계에 있어서 'Loose Coupling'은 중요한 개념이고, 이를 위해서는 인터페이스, 클래스 등을 잘 분리해서 사용하는 것이 중요합니다. 이는 유지보수를 할 때 부품을 갈아 끼우는 것처럼 편하게 해 주고, 코드를 이해하기도 쉽게 해 줍니다.

     

    처음으로 객체지향 개념을 다른 사람의 코드에 있기 때문에 사용한 것이 아닌, 스스로 생각하면서 사용해 봤습니다. 이를 통해서 위에서 밝힌 부족한 점도 알 수 있었고, java 공부를 함에 있어서 어떤 부분이 부족한지 알 수 있었습니다.

     

    4. 3. 인터페이스 

    과제의 조건에 인터페이스를 사용하는 것은 조건이 아니었습니다. 하지만 스스로 활용하지 못한 게 아쉽습니다.

     

    스프링 프레임워크를 사용해서 웹 개발을 하다 보면, 인터페이스를 꼭 쓰게 됩니다. 객체지향 설계의 핵심과도 같은 기능인데요. 그동안은 딱히 생각하지 않고 다른 사람의 코드에 있기 때문에 사용했다거나, 왠지 써야 할 것 같아서 사용하고는 했는데요. 

     

    이번 프로젝트를 하면서 인터페이스를 사용하지는 못 했지만, 사용하면 더 깔끔하고 느슨한 결합이 될 것 같다는 느낌을 많이 받았습니다. 실제로 코드로 구현을 하기에는 과제 시간과 점수가 걸려있기에 무리하지 않았지만, 인터페이스 사용해보고 싶습니다. 

     

    5. 보완해야 할 사항

    5. 1. 객체지향 공부

    상속, 클래스, 인터페이스 같이 객체지향 설계를 하는 것에 있어서 중요한 것들을 다시 한번 공부해야 할 것 같습니다. 머릿속으로 개념만 가지고 있는 것이 아니라, 실제로 코드를 작성해보고 자세하게 분석을 해봐야 할 것 같습니다. 

     

    또한 위의 개념을 넘어서서 '객체지향 설계'에 대해서도 공부를 해보고 싶습니다. 어떻게 작성하는 것이 수정하기 편하고, 다른 사람이 보기 편한 코드인가에 대해서 고민을 해봐야 할 것 같습니다. 

     

    6. 수정 사항

    10월 25일

    전체 프로세스 진행 상황 추가

    반응형

    댓글

Designed by Tistory.