[WIL] 항해99 2주차 회고(feat. 객체지향 프로그래밍이란?, JVM)

rara_kim·2022년 11월 27일
0

항해99

목록 보기
10/18

2주차 프로그래밍 기초

2주차는 프로그래밍 기초 주차로 자바에 익숙해 지기 위한 주차였다.
사실 자바에 대해 언어스터디에서 공부를 하고 있지만 알고리즘, 자료구조는 커녕 클래스도 이제 막 배우고 있는데, 걷기반/달리기반으로 나뉘어 알고리즘 문제를 풀어야 한다는게 걱정이 되기도 했다.
그렇지만 꾸준히 Leve0 문제를 풀어왔던 게 도움이 되었는지 생각만큼 버거운 한주는 아니었던 것 같다.

개인적으로 프로그래밍 기초 주차에는 코드가 깔끔하고,짧고를 떠나서 무조건 알고리즘을 많이 풀어보고 익숙해진다!에 초점을 맞추었었는데, 덕분에 알고리즘 테스트도 크게 어려움 없이 넘어갈 수 있었고 문제를 보고 코드로 구현해 내는 것에 어느정도 익숙해 질 수 있었다.

그리고 3주차 주특기 주차에 들어가기 앞서 2주차 과제를 해결해야 했는데, 이 과제를 통해 객체지향이란 무엇인가 더 생각해 볼 수 있었다.
하나의 상위클래스와 그를 상속받은 하위클래스 둘을 사용하여 요구사항을 구현해내는 과제였는데, 클래스를 설계하고 요구사항 구현을 위해 메소드를 작성하려니 참 막막했었다.
어찌어찌 요구사항과 시나리오대로 기능할 수 있게끔 코드를 짜기는 했지만 여러모로 아쉬움이 남은 과제였다.
앞으로 언어스터디 진도에 만족하지 않고 열심히 자바 기초를 학습해서 스프링을 학습하며, 보다 더 객체지향 스러운 코드를 작성하고 싶다.


💡2주차의 중요 키워드

1️⃣객체지향 프로그래밍이란?

프로그래밍에서 필요한 데이터를 추상화시켜 상태행위를 가진 객체를 만들고, 그 객체들간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

간단히 말해, 상태와 행위를 가진 객체들을 레고 블럭처럼 조립해서 하나의 프로그램을 만드는 것을 객체 지향 프로그래밍이라고 할 수 있다.

객체 지향 프로그램의 장단점

장점

  • 코드 재사용이 용이하다.
    • 기존에 만들어진 클래스를 재사용할 수 있고 상속을 통해 확장이 가능하다.
  • 유지 보수가 용이하다.
    • 수정해야 할 부분이 클래스 내부에 있어서 해당 부분만 수정하면 된다.
  • 대규모 프로젝트에 적합하다.
    • 클래스 단위로 모듈화시켜서 개발할 수 있고, 업무 분담의 편리성이 향상된다.

단점

  • 처리 속도가 상대적으로 느리다.
  • 객체의 수가 증가함에따라 용량이 커질 수 있다.
  • 설계시 많은 시간과 노력이 필요하다.
    • 좋은 설계는 현실을 잘 반영해야 한다.

객체지향의 특징

1. 추상화(Abstraction)

어떤 영역에서 필요로 하는 속성이나 행동을 추출하는 작업이다.

  • 사물(클래스)들의 공통된 특징, 추상적 특징을 파악해 인식의 대상으로 삼는 행위를 말한다.
  • 구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념(집합)으로 다루는 수단을 말한다.

각 개체의 구체적인 개념에 의존하지 말고 추상적 개념에 의존해야 설계를 유연하게 변경할 수 있다.

2. 캡슐화(Encapsulation)

캡슐화는 객체지향에서 데이터 구조와 데이터를 다루는 방법을 결합시켜 묶는다.
데이터를 은닉하고 그 데이터를 접근하는 기능을 노출시키지 않는 다는 의미이다.

높은 응집도와 낮은 결합도를 유지할 수 있도록 설계해야 요구사항을 변경할 때 유연하게 대처할 수 있다.

  • 응집도(Cohesion)
    • 클래스나 모듈 안의 요소들이 얼마나 밀접하게 관련되어 있는지를 나타낸다.
  • 결합도(Coupling)
    • 어떤 기능을 실행하는 데 다른 클래스나 모듈들에 얼마나 의존적인지를 나타낸다.

캡슐화는 낮은 결합도를 유지할 수 있도록 해주는 객체지향 설계 원리다.

  • 캡슐화는 정보 은닉 을 통해 높은 응집도와 낮은 결합도를 갖도록 한다.
    • 정보 은닉(information hiding)
      • 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 것을 말한다.
      • private 키워드
      • 멤머 변수 앞에 접근 제어자 private 키워드를 붙이고, 멤버 변수에 값을 넣고 꺼내 올 수 있는 메소드를 만들어 캡슐화할 수 있다.
    • 정보 은닉이 왜 필요한 이유는 무엇일까?
      • SW는 결합이 많을수록 문제가 많이 발생한다.
      • 한 클래스가 변경이 발생하면 변경된 클래스의 비밀에 의존하는 다른 클래스들도 변경해야 할 가능성이 커진다.

변하기 쉬운 것과 변하기 어려운 것을 구분하자!

  • private
    • 변하기 쉬운 것은 감춘다.
    • 외부에서 변해도 영향을 받지 않는다.
    • ex) 멤버 변수, 자료구조
  • public
    • 변하기 어려운 것은 드러낸다.
    • 변하기 어려우므로 외부에서 사용하는데 변경될 일이 적다.

3. 상속

상속이란 상위개념(상위클래스)의 특징을 하위 개념(하위클래스)이 물려받는 것을 의미한다.
하나의 클래스가 가지고 있는 특징(데이터와 함수)들을 그래도 다른 클래스가 물려주고자 할 때 상속의 특징을 사용한다.

  • 코드의 재사용성을 증대 시킬 수 있다.
    • 같은 기능을 또 구현 할 필요가 없다.
  • 폭넓은 사용이 가능하다.
    • 상속받은 함수에 데이터를 추가하거나, 함수 내용을 변경할 수 있다.

4. 다형성(Polymorphism)

다형성은 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력이다.

  • 다형성이 상속과 연계되어 동작하면 매우 강력한 힘을 발휘한다.
  • 다형성과 일반화 관계는 코드를 간결하게 할 뿐 아니라 변화에도 유연하게 대처할 수 있게 한다.

2️⃣JVM(Java Virtual Machine)

자바 가상 머신 JVM(Java Virtual Machine)은 자바 프로그램 실행환경을 만들어 주는 소프트웨어이다.
자바 코드를 컴파일하여 .class 바이트 코드로 만들면 이 코드가 자바 가상 머신 환경에서 실행된다.
JVM은 자바 실행 환경 JRE(Java Runtime Environment)에 포함되어 있다. 현재 사용하는 컴퓨터의 운영체제에 맞는 자바 실행환경 (JRE)가 설치되어 있다면 자바 가상 머신이 설치되어 있다는 뜻이다.

Java는 어떠한 플랫폼에도 영향을 받지 않는다.

JVM을 사용함으로써 얻는 가장 큰 이점은 JVM을 사용하면 하나의 바이트 코드(.class)로 모든 플랫폼에서 동작하도록 할 수 있다는 것이다.

Java의 경우에는 Java언어로 작성된 Test.java는 컴파일하면 Test.class 파일이 생성된다.
그리고 이렇게 생성된 바이트 코드는 각자의 플랫폼에 설치되어 있는 자바 가상 머신(JVM)이 운영체제에 맞는 실행 파일로 바꿔준다.
즉 Java에서는 C언어와는 달리 JVM을 사용하기 때문에 각자의 플랫폼에 맞게끔 컴파일을 하지 않아도 된다. 하나의 바이트 코드로 JVM이 설치되어 있는 모든 플랫폼에서 동작이 가능하다.

💡Java는 플랫폼에 종속적이지 않지만 JVM은 플랫폼에 종속적이다.
Java는 컴파일된 바이트 코드로 어떤 JVM에서도 동작시킬 수 있지만, JVM은 플랫폼에 의존한다.
윈도우의 JVM과 리눅스의 JVM은 서로 다르다. 자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다.


JVM 구성요소

  • 클래스 로더(Class Loader)
  • 실행 엔진(Execution Engine)
    • 인터프리터(Interpreter)
    • JIT 컴파일러(Just-in-Time)
    • 가비지 콜렉터(Garbage collector)
  • 런타임 데이터 영역 (Runtime Data Area)

1️⃣클래스 로더(Class Loader)

JVM 내로 클래스 파일.class을 로드하고, 링크를 통해 배치하는 작업을 수행하는 모듈이다.
런 타임시 동적으로 클래스를 로드하고 jar 파일 내 저장된 클래스들을 JVM 위에 탑재한다.
즉, 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크하는 역할을 한다.

2️⃣실행 엔진

클래스를 실행시키는 역할이다.
클래스 로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치시키고, 이것은 실행 엔진에 의해 실행된다.

자바 바이트 코드.class는 기계가 바로 수행할 수 있는 언어보다는 비교적 인간이 보기 편한 형태로 기술된 것이다.
그래서 실행 엔진은 이와 같은 바이트 코드를 실제로 JVM 내부에서 기계가 실행할 수 있는 형태로 변경한다.

3️⃣인터프리터(Interpreter)

실행 엔진은 자바 바이트 코드를 명령어 단위로 읽어서 실행한다.
하지만 한 줄씩 수행하기 때문에 느리다는 단점이 있다.

4️⃣JIT(Just-In-Time) 컴파일러

인터프리터 방식으로 실행하다가 적절한 시점에 바이트 코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 더 이상 인터프리팅 하지 않고 기계어로 직접 실행하는 방식이다.

5️⃣가비지 콜렉터(Garbage collector)

더이상 사용되지 않는 인스턴스를 찾아 메모리에서 삭제해준다.

6️⃣런타임 데이터 영역 (Runtime Data Area)

프로그램을 수행하기 위해 OS에서 할당받은 메모리 공간

PC Register

Thread가 시작될 때 생성되며 생성될 때마다 생성되는 공간으로, 스레드마다 하나씩 존재한다.
Thread가 어떤 부분을 어떤 명령으로 실행해야할 지에 대한 기록을 하는 부분으로 현재 수행 중인 JVM 명령의 주소를 갖는다.

JVM 스택 영역

프로그램 실행과정에서 임시로 할당되었다가 메소드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역이다. 각종 형태의 변수나 임시 데이터, 스레드나 메소드의 정보를 저장한다.
메소드 호출 시 각각의 스택 프레임(해당 메소드만을 위한 공간)이 생성되며, 메소드 수행이 끝나면 프레임 별로 삭제를 한다.
메소드 안에서 사용되는 값들을 저장한다.
또 호출된 메소드의 매개변수, 지역변수, 리턴 값 및 연산 시 일어나는 값들을 임시로 저장한다.

Native method stack

자바 프로그램이 컴파일되어 생성되는 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역으로, JAVA가 아닌 다른 언어로 작성된 코드를 위한 공간.
Java Native Interface를 통해 바이트 코드로 전환하여 저장하게 된다.
일반 프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역이다.

Method Area(= Class Area = Static area)

클래스 정보를 처음 메모리 공간에 올릴 때 초기화되는 대상을 저장하기 위한 메모리 공간이다.

Runtime Constant Pool

Static 영역에 존재하는 별도의 관리영역이다.
상수 자료형을 저장하여 참조하고 중복을 막는 역할을 수행한다.

profile
느리더라도 꾸준하게

0개의 댓글