WIL | 항해99 2주차

6164 단어 WIL항해99WIL

오늘은 항해99 2주차 후기를 포스팅하려합니다. 🌊🚣‍♀️🌊

이번에는 객채지향프로그래밍이란 무엇이고 JVM은 무엇인지 알아보는 시간을 가져보려고합니다.
프로그래밍을 하는사람이나 JAVA 언어를 쓰는 사람이라면 "객채지향"이라는 말을 많이 들어보았을것이라 생각합니다.
우선 객채에 대해서 먼저 알아보겠습니다.

객체 지향 언어란?

객체지향프로그래밍은 컴퓨터 프로그래밍의 패러다임 중 하나입니다. 컴퓨터 프로그램의 명렁어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 '객체'들의 모임으로 파악하고자 하는 것입니다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있습니다. 이러한 객체 지향 프로그래밍에서 사용하는 언어를 객체 지향 언어라 합니다.

객체란 무엇인가 ?

객체 지향 프로그래밍을 구성하기 위해서는 '객체'가 필수적입니다. 실제 세상에서 사물의 개념을 프로그램에서 객체라고 볼 수 있습니다. 사람을 예로 들면, 사람 한 명이 있습니다.. 그리고 그 사람은 이름 혹은 나이, 주민등록번호 등의 정보를 갖고 있고, 걷거나 뛸 수 있습니다. 이 예에서 사람 한 명이 하나의 객체가 됩니다. 그리고 객체는 이름, 나이 혹은 주민등록번호와 같이 상태(state)를 갖고 있으며, 걷거나 뛰는 행위(behavior)를 할 수 있습니다.
사람 뿐만 아니라 자동차도 객체가 될 수 있으며, 시속 50km/h로 주행중인 상태 그리고 가속을 하는 행위를 갖을 수 있습니다. 이렇듯 모든 사물을 각각의 객체로 나눌 수 있고, 행위를 찾아 낼 수 있습니다.

객체 지향 언어 중 하나인 Java에서는 객체를 생성하기 위해 설계도 역할을 하는 class를 만듭니다.

public class Person {
  String name;
  int age; 
  public Person() {
  }
  public void run() {
    // 생략
  }
}

그리고 다음과 같이 객체를 생성할 수 있습니다.

Person geumyong = new Person();
Person dragon = new Person();

이렇게 실제 사물을 나타내기 위한 것을 객체라고 하며, 인스턴스라고 부르기도 합니다.

🟧객체 지향 언어의 특징

1. 캡슐화

캡슐화란 변수와 함수를 하나의 단위로 묶는 것을 의미합니다. Java에서 이러한 데이터 번들링은 class를 통해 구현되고, 해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함된 멤버 변수와 메서드에 쉽게 접근할 수 있습니다. 이러한 캡슐화를 통해 정보 은닉을 할 수 있습니다. 데이터와 코드의 형태를 외부로부터 알 수 없게 합니다. 모듈 간의 결합도를 떨어뜨려 유연함과 유지보수성을 높입니다.

2. 상속

상위 클래스의 모든걸 하위 클래스가 모두 이어 받는 개념을 갖고 있습니다. 상속을 통해서 캡슐화를 유지하면서 클래스의 재사용을 가능토록 합니다.

3. 다형성

상속과 연관된 말로, 한 객체가 다른 여러 상태와 행위로 재구성될 수 있습니다. 오버로딩(overloading)와 오버라이딩(overriding)이 하나의 예입니다.

  • 오버라이딩: 상위 클래스가 갖고 있는 메서드를 하위 클래스가 재정의해서 사용하는 기술
  • 오버로딩: 같은 이름의 메서드 여러 개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

🟦 객체 지향 언어의 장점

1. 재사용성

상속을 통해서 프로그래밍 시 코드의 재사용을 높일 수 있습니다.

2. 생산성 향상

잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상시킵니다. ctrl + v 신공은 나중에 수정사항이 생겼을 때 일일히 찾아서 바꿔주어야 되지만, 클래스는 한 곳에서만 바꾸면 됩니다.

3. 자연적인 모델링

실세 세상의 사물들을 하나의 객체로 생각하며 프로그래밍이 이루어지기 때문에 클래스를 구현할 때 일상생활의 모습과 대비시키며 자연스럽게 구현할 수 있습니다.

4. 유지보수의 우수성

캡슐화로 인해 모듈끼리의 의존성이 떨어집니다. 그렇기에 프로그램 추가 및 수정와 같은 유지보수에 용이합니다.

🟥객체 지향 언어의 단점

1. 개발 속도가 느립니다.

상속과 같은 개념은 유지보수에 용이하지만, 그만큼 다중 상속이 되면 복잡해집니다. 이에 설계 단계에서 클래스끼리의 관계를 정확하게 이해할 필요가 있기 때문에 개발 속도가 늦어질 수 있습니다.

2. 실행 속도가 느립니다.

거의 대부분의 객체지향 언어에서 기능을 묶으면 함수 호출이 추가로 들어가거나 계산식 중간에 포인터 연산 등이 필요해집니다. 멤버 함수 같은 경우 어느 객체의 함수인지 지정해야 하기 때문에 추가 포인터 크기와 연산 비용이 들어갑니다. 때문에 절차적 프로그래밍보다 무겁습니다.

3. 코딩난이도가 상승합니다.

다중 상속은 개발자들에게 많은 고민거리입니다. 상속을 통해서 중복을 없앨 수 있지만, 그만큼 상위 클래스와 하위 클래스간의 관계를 인지하고 있어야 합니다.

JVM 이란 ?

JVM이란 JAVA Virtual Machine, 자바 가상 머신의 약자를 따서 줄여 부르는 용어이다.(가상머신이란 프로그램의 실핼하기 위해 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것이다.) JVM 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다. 그리고 JVM은 JAVA와 OS사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해준다. 그리고 가장 중요한 메모리관리, Garbage collertion을 수행한다. 그리고 JVM은 스택기반의 가상머신이다. ARM 아키텍쳐 같은 하드웨어는 레지스터 기반으로 동작하는데 비해 JVM은 스택기반으로 동작한다.

자바 가상머신을 알아야 하는 이유

한정된 메모리를 효율적으로 사용하여 최고의 성능을 내기 위해서가 그 답이 될지 모르겠다. 메모리 효율성을 위해 메모리 구조를 알아야 하기 때문이다. 동일한 기능의 프로그램이더라도 메모리 관리에 따라 성능이 좌우된다. 메모리 관리가 되지 않은 경우 속도저하 현상이나 튕김 현상 등이 나타날 수 있다. 그래서, 알아두면 좋은것을 넘어서 알아야 할 부분이다.

자바프로그램 실행과정

  1. 프로그램이 실행되면 JVM은 OS로 부터 이 프로그램이 필요로 하는 메모리를 할당받는다. JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.

  2. 자바 컴파일러(javac)가 자바 소스코드(.java)를 읽어들여 자바 바이트코드(.class)로 변환시킨다.

  3. class loader를 통해 class파일들을 JVM으로 로딩한다.

  4. 로딩된 class파일들은 Execution engine을 통해 해석된다.

  5. 해석된 바이트코드는 Runtime Data Areas 에 배치되어 실질적인 수행이 이루어지게 된다.

이러한 실행과정 속에서 JVM은 필요에 따라 thread Synchronization과 GC같은 관리작업을 수행한다.

항해 2주차를 마치며

객체와 JVM에 대해서 알아보았지만 프로그래밍에 대해서 파면 팔수록 끝도 없는것 같습니다. 프로그래밍이란 결코 쉽지 않다는 것을 다시한번 느끼게 되는 시간이었습니다.
항해 2주차에는 알고리즘 문제해결을 통해서 java언어를 많이 쓰게 되었고 자연스럽게 코드를 짜는 능력도 조금은 늘어난것 같습니다. 알고리즘 문제를 풀고 팀원들과 회고하는 시간을 가지면서 설명을 해주었는데 이때가 정말 실력향상의 효과가 극대화 되는것 같았습니다. 이번주차는 지난주차보다 숨을쉴수있어서 심리적으로는 편안한 한주가 되었지만 또 다가올 한주가 두려운건 어쩔수 없나 봅니다...😂 남은 항해도 열심히 하여 성장하는 개발자가 되겠습니다.

좋은 웹페이지 즐겨찾기