본문 바로가기

개발일지

항해99 개발자가 되기 위한 2주 차.

반응형

알고리즘!!

 이번 주의 주제는 바로바로 알고리즘이다. 전공자와 비 전공자의 가장 두드러지는 차이점이 알고리즘에서 나타난다고 어디선가 들었다. 실력에 따라 걷기 반과 달리기 반으로 나누어 진행이 되었다.  Java문법에 자신이 없었기 때문에 걷기반에서 기초를 다지며 해보자고 생각했다.

 알고리즘 문제를 처음 대면했을 때는 당황스러웠다. "어떻게 풀어야 하지?" 그저 막막했다. 그리고 "이렇게 풀 수 있을까?"라는 생각을 하더라도 문법에 막혔다.  그래서 한 문제 진행자체가 엄청 더디게 느껴졌다.

 알고리즘 주차에서 가장 큰 수확은 공부하는 방향성을 잡은 것이 제일 큰 것 같다. 여태껏 문과식의 나의 공부 방식은 기본적인 적의, 개념, 함수 등등을 달달달 외워 그것을 서술하는 데에 익숙해져 있었지만, 개발 공부는 많이 달랐다. 중요한 개념만 이해하고 정리해 두면 된다는 것. 그것을 어떻게 사용하고 적용하는지는 찾아서 보면 된다는 사실. 어떻게 보면 구글이라는 큰 웹페이지를 오픈북 테스트로 진행하는 것과 같았다. 엄청나게 방대하지만 쓰면 쓸수록 익숙해져 가는 것이 나름 신기했다.

 

알고리즘 테스트

 어렸을 때는 시험이 그렇게 싫었는데 알고리즘 테스트는 나를 조금 더 집중하게 만들고 두근거리게 만들었다. 처음은??? 만 띄우던 것들이 다음 문제에서 비슷한 것들을 쓰고 익히며 점점 문법에 익어가는 것이 너무 신기했다. 테스트는 한 번의 모의 테스트와 진짜 테스트 두 번이 있었다. 기존의 문제들을 적절 히 섞어서 알고리즘을 설계할 수 있도록 하는 문제들이었다. 알고리즘도 공부할수록 더 잘해 진다고 하니 캠프가 끝날 때까지 꾸준히 연습해야겠다.

 

객체지향 모델

 자바의 너무나 큰 특징. 객체지향 모델을 이번 주에 만들어 볼 수 있었다. 프로그램을 짜면서 단순히 절차 지향이 아닌 객체를 구성해 유기적인 코드를 짜 볼 수 있었다.  코드들이 서로 얽히고 연관되어 작동하는 것이 복잡하지만 신기했다.  

 절차 지향의 모델링은 프로그램을 기능적으로 바라보는 방식으로 "무엇을 어떤 절차로 할 것인가?"가 핵심이 된다. 즉, 어떤 기능을 어떤 순서로 처리하는 가에 초점을 두는 반면 객체지향의 모델링은 기능이 아닌 객체가 중심이 되며, "누가 어떤 일을 할 것인가?"가 핵심이 된다. 즉, 객체를 도출하고 각각의 역할을 정의해 나가는 것에 초점을 맞춘다.

 

절차 지향 VS 객체 지향 #

  • 대형 프로그래밍의 경우 많은 기능을 수반하기 때문에 절차 지향보다는 객체 지향이 적합
    • 각 객체가 하는 역할이 많아도, 많은 역할을 객체로 묶을 수 있기 때문
  • 소형 프로그래밍의 경우 작은 기능을 수반하기 때문에 객체 지향보다는 절차 지향이 적합
    • 작은 기능을 객체별로 나눌 경우, 오히려 복잡해질 수 있기 때문

객체 지향 프로그래밍의 특징 #

  1. 추상화(abstraction)
    • 객체들의 공통적인 특징(기능, 속성)을 도출하는 것
    • 객체지향적 관점에서는 클래스를 정의하는 것을 추상화라고 할 수 있다.(클래스가 없는 객체지향 언어도 존재 ex.JavaScript)
  2. 캡슐화(encapsulation)
    • 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.
    • 객체가 독립적으로 역할을 할 수 있도록 데이터와 기능을 하나로 묶어 관리하는 것
    • 코드가 묶여있어서 오류가 없어 편리하다.
    • 데이터를 보이지 않고 외부와 상호작용을 할 때는 메서드를 이용하여 통신을 한다. 보통 라이브러리로 만들어서 업그레이드해 사용할 수 있다.
  3. 상속 성(inheritance)
    • 하나의 클래스가 가진 특징(함수, 데이터)을 다른 클래스가 그대로 물려받는 것
    • 이미 작성된 클래스를 받아서 새로운 클래스를 생성하는 것
    • 기존 코드를 재활용해서 사용함으로써 객체지향 방법의 중요한 기능 중 하나에 속한다.
  4. 다형성(polymorphism)
    • 약간 다른 방법으로 동작하는 함수를 동일한 이름으로 호출하는 것
    • 동일한 명령의 해석을 연결된 객체에 의존하는 것
    • 오버 라이딩(Overriding), 오버 로딩(Overloading)
      • 오버 라이딩(Overriding) - 부모 클래스의 메서드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것
      • 오버 로딩(Overloading) - 같은 이름의 함수를 여러 개 정의한 후 매개변수를 다르게 하여 같은 이름을 경우에 따라 호출하여 사용하는 것
  5. 동적 바인딩(Dynamic Binding)
    • 가상 함수를 호출하는 코드를 컴파일할 때, 바인딩을 실행시간에 결정하는 것.
    • 파생 클래스의 객체에 대해, 기본 클래스의 포인터로 가상 함수가 호출될 때 일어난다.
    • 함수를 호출하면 동적 바인딩을 통해 파생 클래스에 오버 라이딩된 함수가 실행
    • 프로그래밍의 유연성을 높여주며 파생 클래스에서 재정의한 함수의 호출을 보장(다형 개념 실현)

객체 지향 프로그래밍의 장점 #

소프트웨어의 생산성 향상 #

객체지향 프로그래밍은 다형성, 객체, 캡슐화 등 소프트웨어의 재사용을 지향한다. 이미 만들어진 클래스를 상속받거나 객체를 가져다 재사용하거나, 부분 수정을 통해, 소프트웨어를 작성하는 부담을 대폭 줄일 수 있다.

  • 신뢰성 있는 소프트웨어를 손쉽게 작성할 수 있다. (개발자가 만든 데이터를 사용하기 때문에 신뢰할 수 있다.)
  • 코드를 재사용하기 쉽다 (상속, 캡슐화, 다형성으로 인해 재사용할 수 있다.)
  • 업그레이드가 쉽다.
  • 디버깅이 쉽다.

실세계에 대한 쉬운 모델링 #

컴퓨터가 산업 전반에 다양하게 활용되는 요즘 시대에는 응용 소프트웨어를 하나의 절차로 모델링하기 어렵다. 산업 전반에서 요구되는 응용 소프트웨어 특성상, 절차나 과정보다 관련된 많은 물체(객체)들의 상호 작용으로 묘사하는 것이 더 쉽고 적합하다.

  • 실세계에 대한 모델링을 좀 더 쉽게 해 준다. (모든 것을 객체들의 상호작용으로 생각)

보안성 향상 #

객체 지향적 프로그래밍의 캡슐화 특징으로 실제로 구현되는 부분을 외부에 드러나지 않도록 하여 정보를 은닉할 수 있다.

  • 보안성이 높다 (캡슐화, 데이터 은닉, 다형성으로 인해 필요한 정보를 재정의하거나 getter, setter를 이용하기 때문에 보안성이 높다.)

객체 지향 프로그래밍의 단점 #

느린 실행 속도 #

객체 지향 프로그래밍은 캡슐화와 격리 구조에 때문에 절차 지향 프로그래밍과 비교하면 실행 속도가 느리다. 또한, 객체지향에서는 모든 것을 객체로 생각하기 때문에 추가적인 포인터 크기의 메모리와 연산에 대한 비용이 들어가게 된다.

  • 절차 지향 프로그래밍에 비해 느린 실행 속도
  • 필요한 메모리 양의 증가

 -출처 : http://www.incodom.kr/%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5#h_416ffa875e53dbc7f45f00610f8881a5

 

JVM이란?

Java Virtual Machine의 줄임말. 직역하면 '자바를 실행하기 위한 가상 기계(컴퓨터)'라고 할 수 있다. Java는 OS에 종속적이지 않다는 특징을 가지고 있다. OS에 종속받지 않고 실행되기 위해선 OS 위에서 Java를 실행시킬 무언가가 필요하다. 그게 바로 JVM이다. 즉, OS에 종속받지 않고 CPU 가 Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다.

 

 한 주를 돌아보며

 아직 까지 배워야 할 것들은 많고 시간은 부족함의 연속이 되는 것 같다. 더 많이 배우고 더 많이 성장했으면 좋겠다.

반응형