느낀점
항해 99 부트캠프에 들어온지 벌써 3주가 지났습니다. 시간이 너무 빠른거 같아요 ㅠㅠ 주로 자바의 문법에 대해 공부를 했는데, 조원분들과 스터디 일지를 쓰면서 모르는 점을 쓰고 그에 대한 예시나 구글링 등 다양한 방법으로 도움을 받았고, 추가적으로 과제에 대한 서로의 코드를 비교하는 자발적인 행동으로 문법을 이해했으나 어떻게 활용해야하는지 감이 잡히지 않았던 부분에 조금 해답이 되었습니다.
달리기반과 걷기반이 있는데, 이것도 많은 문제를 풀어야 실력이는다는 말에 덥석 달리기반으로..ㅎㅎ 저희 조원분들이 워낙 잘하셔서… 제가 뒤쳐지는 것도 있고.. 잘한다잘한다 해주시긴 하는데 ㅠㅠ 제가 너무 민폐를 끼치는게 아닌지 고민이 되더라구여 ㅠㅠ 제가 문제를 풀어놓고도 설명하지 못하니 ㅠㅠㅠ 정말 어렵습니다 ㅠㅠ 그래도 제가 자초한 일이니 부족한 만큼 더 할 생각입니다!
다양한 사람이 있는 것과 같이 다양한 방식의 코드를 보면서 왜 이렇게 풀게 되었는지 서로 물어보는 과정에서 알고는 있었지만, 활용하는 방법에서 다양성을 알게 되는 한 주가 되었습니다!
사실… SOLID는 아직까지 잘 모르겠어서… 틈틈히 공부를 해야할거 같아요 ㅠㅠ
그리고 코딩테스트 0레벨을 풀고 있었는데… 그것도 어려웠는데.. 1레벨은 너무 어렵습니다 ㅠㅠ 왜 이렇게 풀어야하는지 다양하게 있다보니까 더 어려운거같아요ㅠㅠㅠ
배운점
이번 주차는 언어공부와 알고리즘을 이용해 코딩테스트 문제를 풀어보는 주차로 제대로 이해하지 못했던 부분을 공부했습니다. 코드를 리뷰를 하면서 여러 가지 해결방법을 보고 새로운 변수나 메서드를 이용해서 풀려고 노력하고 있습니다..! 사실상.. 인텔리제이가 거의다 풀어주지만요 ㅠㅠㅠ 이게 제 실력인지 아닌지 감이 안잡히네여ㅠ 오늘 개인 학습상담을 신청했는데, 잘하고 있다고 하셨지만.. 불안함이 가득합니다 ㅠㅠ 그래서 더 하는거 같아요… 오늘 조언받은 것과 같이 너무 깊숙히 들어갈려고 하지 않고 코드리뷰를 큰 그림을 그려서 설명할 수 있게 노력하겠습니다!
이번주 키워드!
객체지향 프로그래밍이란?, JVM
객체지향 프로그래밍이란?
나무위키 정의
프로그램설계방법론이자 개념의 일종으로, 명령형 프로그래밍에 속한다.
프로그램을 단순히 데이터와 처리 방법으로 나누는 것이 아니라, 프로그램을 수많은 '객체(Object)'라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다. 객체란 하나의 역할을 수행하는 '메소드와 변수(데이터)'의 묶음으로 봐야 한다.
서술의 편의상 객체지향을Java 위주로 소개하고 있고 class나 public 같은 용어를 사용했다. 이 경우만 객체지향에 해당하는 것으로 오해하지 않게 주의해야 한다. 모든 언어가 class나 접근 제한자(public이나 private)를 사용하지는 않는다. 대표적인 예로
JavaScript는 프로토타입 객체지향을 사용하고 있고
Python에는 접근제한자가 없다. 객체지향은 특정 언어가 아니라 개념이다. "클래스는 객체이며 구조체는 객체가 아닌 데이터의 집합"이라는 설명 역시 틀렸고, 특정 언어가 객체지향 언어라는 말도 완전히 틀린 표현이다.
객체지향 프로그래밍( OOP Object - Oriented - Programming )
함수와,로직 중심 보다는 데이터와 객체를 중점으로 소프트웨어를 개발하는 방법 입니다. OOP를 활용하여 사람이 생각하는 방식과 비슷하게 프로그래밍을 할 수 있습니다.
- 객체란(Object)?
객체는 생활하면서 주변에 있는 사람,사물 또는 추상적으로 생각할 수 있는 것들 중에서 자신의 속성을 갖고 다른것과 식별이 가능한 것을 의미합니다. 객체는 속성과 동작으로 이루어져 있습니다.
- 객체지향 프로그래밍 특징
1. 자료 추상화
불필요한 정보는 숨기고 중요한 정보만을 표현하여 프로그램을 간단히 만드는 것을 말합니다.
자동차를 예로 들자면, 공통적으로 중요한 부분인 엔진,브레이크,연료 등에 대한 기능을 뽑아내는 것을 의미 합니다.
2. 캡슐화
객체가 내부적으로 기능이 어느 방식으로 구현되어 있는지를 감추는 것을 말합니다.
알약 캡슐 처럼 약의 내용물을 겉으로 싸서 숨긴다고 하여 캡슐화 라고 합니다. 내부의 로직이나 변수들은 감추고 외부에는 기능만을 제공하는 것을 의미합니다.
3) 상속
특정 클래스가 가진 속성,동작을 다른 클래스에서 그대로 사용할 수 있습니다.
이미 작성되어 있는 클래스를 상속하여 사용함으로써 코드를 재활용하여 사용하는 특징을 의미합니다.
클래스의 요소를 상속받은 클래스를 자식 클래스라고 합니다.
동물이라는 클래스의 속성을 상속받아 사람이라는 자식 클래스를 만들어 낼 수 있습니다.
4) 다형성
함수가 상황에 따라 다르게 동작하는 것을 의미합니다. 예시로 휴대폰을 생각하면 된다. 아이폰 12 13 14 를 비교하면, 아이폰 12와 13의 차이는 카메라 위치 아이폰 13과 14의 차이는 노치의 크기입니다.
이렇게 기존에 있던 것을 이용해서 발전하는 것을 다형성이라고 볼 수 있습니다!
a)오버로딩 :
함수의 이름은 같으나 함수의 매개변수를 다르게하여 호출하여 사용하는 것을 말합니다. 아래와 같이 동일한 이름의 Eat 이라는 함수가 있는 경우에 매개변수에 어떤 것을 전달해주는지에 따라서 호출되는 함수가 달라지게 됩니다.
b)오버라이딩 :
함수의 동작을 재정의하여 사용하는 것 입니다.
자식클래스가 부모클래스에서 상속받은 함수의 형태를 그대로 유지하며, 함수 동작을 재정의 하여 사용합니다.
아래 처럼 동물이라는 클래스를 상속받은 '이동한다 - 4족 보행 한다' 라는 함수를 자식 클래스인 사람 클래스에서는 '이동한다 - 2족 보행 한다' 와 같이 재정의하여 사용하는 것을 말합니다.
객체지향이란 ?
기존의 구조적 프로그래밍에서 가장 중요한 것은 '함수' 였습니다.
소스코드를 논리적인 단위로 구분하고 분할 해서 개발하여 프로그래밍을 조금 더 편하게 만들어줬습니다.
이에 그치지 않고 개발자들은 더욱더 나아가 '우리가 주변 사물들을 인지하는 것 처럼 프로그래밍을 할 수 있지 않을까?' 라고 생각하기 시작했습니다.
이렇게 시작된 것이 객체지향입니다.
세상에 존재하는 것은 모두 사물 즉, 객체이다.각각의 사물은 고유하다.사물은 속성을 갖는다.사물은 행동을 한다.
위처럼 사물을 덩어리로 한번에 크게 이해하기 보다는 분류하여 이해할 수 있도록 시도 하였고 이를 프로그래밍에서 class 라는 표현 방법으로 만들어냈습니다.
책임과 권한을 가진 객체들이 서로 메시지를 주고 받으며 협력하여 필요한 기능을 수행할 수 있도록 프로그램을 개발하는 것을 객체지향 개발이라고 할 수 있습니다.
그렇다면 우리는 객체지향의 개념을 프로그래밍에 녹아냄으로써 무슨 이점을 얻을 수 있었을까요?
객체지향 개발은 복잡한 프로그램을 효과적으로 분해하고 구성할 수 있고, 쉽게 이해하며 효율적으로 다룰 수 있게 도와줍니다.
JVM
JVM : Java Virtual Machine / 자바 가상 기계
java8이후 기준 Runtime Data Areas
JVM은 다른 프로그램을 실행시키는 것이 목적인 프로그램이다. 방어적 코딩(Coding Kung Fu)의 가장 훌륭한 예 가운데 하나이기도 한 간단한 아이디어이기도 하다. JVM은 당시에도 상황을 뒤집어 놓았고 지금까지도 프로그래밍 혁신을 지원하고 있다.
JVM의 용도와 정의
JVM에는 2가지 기본 기능이 있다. 자바 프로그램이 어느 기기, 또는 어느 운영체제 상에서도 실행될 수 있게 하는 것("한 번 작성해, 어디에서나 실행한다"는 유명한 원칙이다)과 프로그램 메모리를 관리하고 최적화하는 것이다. 1995년 자바가 공개 되었을 때, 모든 컴퓨터 프로그램은 특정 운영체제에 맞게 작성되었으며, 프로그램 메모리는 소프트웨어 개발자가 관리했었다. 그래서 JVM은 놀라움이었다.
그림. JVM에 대한 상위 레벨 뷰
Credit: JavaWorld/ IDG
JVM에 대한 기술적인 정의를 하는 것은 유용하며, 소프트웨어 개발자들의 일반적인 정의도 있다. JVM에 대한 정의는 다음과 같이 나눌 수 있다.
- 기술적 정의:
JVM은 코드를 실행하고 해당 코드에 대해 런타임 환경을 제공하는 소프트웨어 프로그램에 대한 사양(Specification)이다.
- 일반적 정의:
JVM은 자바 프로그램을 실행하는 방법이다. JVM의 설정을 구성한 다음 설정사항에 따라 실행 중에 프로그램 리소스를 관리한다.
개발자들이 JVM에 대해 말하고 있다면, 대개는 어떤 기기 상에서 실행되고 있는 프로세스, 특히 자바 앱에 대한 리소스를 대표하고 통제하는 서버를 지칭한다. 이 맥락에서의 JVM은 이런 작업들을 수행하는 프로그램 구축을 위한 요구조건들을 정의하는 JVM 사양과는 다른 것이다.
누가 JVM을 개발하며 유지보수하는가
JVM은 널리 배포되어 있고, 많이 사용되고 있으며, 몇몇 매우 뛰어난 프로그래머들에 의해 유지 보수되고 있다, 기업과 오픈소스 양면에서. 오픈JDK(OpenJDK)는 자바에 대한 오라클의 책무 기간 중에도 계속되고 있으며, 요즘의 어려운 작업 대부분은 오라클 엔지니어들이 수행하고 있다.
JVM에서의 메모리 관리
JVM 실행에 있어서 가장 일반적인 상호작용은 힙(Heap)과 스택(Stack)의 메모리 사용을 확인하는 것이다. 가장 흔한 교정작업은 JVM의 메모리 설정 값들을 조율하는 것이다.
- 가비지 컬렉션(Garbage Collection)
자바 이전에는 프로그래머가 모든 프로그램 메모리를 관리했었다. 자바에서는 JVM이 프로그램 메모리를 관리한다. JVM은 가비지 컬렉션이란 프로세스를 통해 메모리를 관리하며, 이 가비지 컬렉션은 자바 프로그램에서 사용되지 않는 메모리를 지속적으로 찾아내서 제거한다. 가비지 컬렉션은 실행 중인 JVM 내부에서 일어난다.
초창기에, 자바는 C++만큼 "메탈에 가깝지 않아 C++처럼 빠르지 않다"는 면에서 많은 비평을 받았다. 특히 가비지 컬렉션 프로세스가 논쟁이 되었다. 그 이후, 가비지 컬렉션을 위해 다양한 알고리즘과 접근방식이 제안되고 사용되었다. 일관성 있는 개발과 최적화를 통해 가비지 컬렉션은 크게 개선되었다.
- "메탈에 가까운"이란 말의 의미
프로그래머가 어떤 프로그래밍 언어나 플랫폼이 "메탈에 가깝다"고 말하는 경우, 이는 개발자가 운영체제의 메모리를 프로그램적으로 (코드를 작성함으로써) 관리할 수 있다는 것을 의미한다. 이론적으로, 프로그래머는 얼마나 많은 메모리를 사용하고 언제 폐기할 지를 명시함으로써 프로그램에서 더 높은 성능을 끌어낼 수 있다. 대부분의 경우, 개발자가 하는 것보다 JVM 같은 정제된 프로세스에 메모리 관리를 위임함으로써 더 높은 성능과 더 적은 오류를 도출할 수 있다.
세 부분으로 구성된 JVM
JVM에는 3가지 측면이 있다고 할 수 있다. 표준(Specification), 구현(Implementation ) 그리고 인스턴스(Instance)인데, 각각에 대해 살펴보자.
1. JVM 사양
첫째, JVM은 소프트웨어 사양이다. 다소 순환적인 방식으로, JVM 사양은 구현에 있어 최대한의 창조성을 허용하기 위해, JVM 구현 세부사항이 사양 안에 정의되어 있지 않다고 강조하고 있다.
"자바 가상 머신을 올바르게 구현하려면, 클래스(Class) 파일 포맷을 읽고 그 안에 지정된 작업을 제대로 수행하기만 하면 된다."
요한 세바스찬 바흐도 음악을 비슷하게 창조한다고 기술했다.
"정확한 시점에 올바른 건반을 누르기만 하면 된다."
결국, JVM이 해야만 하는 일은 자바 프로그램을 정확하게 실행하는 것뿐이다. 간단해 보인다, 심지어 겉으로 보기에는 단순해 보이기도 하지만, 자바 언어의 능력과 유연성을 고려할 때, 이것은 엄청나게 힘든 일이다.
2. JVM 구현
JVM 사양 구현은 실제 소프트웨어 프로그램을 도출하며, 이것이 JVM 구현이다. 실제로, 오픈소스와 특정 업체 고유의 JVM 구현이 다수 존재한다. 오픈JDK의 핫스팟(HotSpot) JVM은 참조 구현이며, 세계에서 가장 철저하게 증명된 코드기반 중 하나로 남아있다. 핫스팟은 가장 널리 사용되는 JVM이기도 하다.
오라클의 라이선스가 부여된 JDK를 포함해, 라이선스가 부여되는 거의 모든 JVM은 오픈JDK와 핫스팟 JVM의 포크(Fork)로 생성된 것이다. 오픈JDK로부터 허가받은 포크를 생성하는 개발자들은 종종 운영체제 고유의 성능 개선사항들을 추가하려는 욕구에 의해 동기 부여된다. 일반적으로, 개발자는
번들의 한 부분으로
한다.
3. JVM 인스턴스(Instance)
JVM 스펙이 구현돼서 소프트웨어 제품으로 릴리즈되면, 개발자는 그것을 하나의 프로그램처럼 다운로드해 실행할 수 있다. 이렇게 다운로드 된 프로그램이 하나의 JVM 인스턴스(또는 인스턴스화된 버전)이다.
개발자들이 "JVM"에 대해 말하는 경우, 대부분의 경우에는 소프트웨어 개발 환경 또는 제품화 환경에서 실행되는 하나의 JVM 인스턴스를 지칭한다. "아난드, 그 서버에 있는 JVM은 메모리를 얼마나 사용하고 있어?" 또는 "순환 호출(Circular Call)을 하는 바람에 스택 오버플로우 에러가 내 JVM을 망가뜨렸다니, 믿을 수가 없군. 이런 초보적인 실수를 하다니!"라고 말할 지도 모른다.
가상 머신(Virtual Machine)으로서의 JVM
JVM은 자바 클래스 파일을 이식성 있는 방식으로 실행하는 가상 머신이다. 가상 머신이란 JVM이 하부에 있는, 실제 머신–예를 들면, 프로그램이 실행되는 서버–의 추상화(Abstraction)를 의미한다. 사용 중인 운영체제 또는 실제로 존재하는 하드웨어에 관계없이, JVM은 그 안에서 실행될 프로그램을 위한 예측 가능한 환경을 조성한다. 하지만, 진정한 가상 머신과 달리 JVM은 가상 운영체제를 생성하지 않는다. JVM을 관리되는 런타임 환경(Managed Runtime Environment) 또는 프로세스 가상 머신이라고 정의하는 것이 더 정확할 수도 있다.
소프트웨어 사양이란
소프트웨어 사양(또는 스펙)이란 어떤 소프트웨어 시스템이 어떻게 동작해야 하는 지를 정의하는 인간이 읽을 수 있는 설계 문서다. 사양의 목적은 엔지니어들이 코딩할 수 있도록 정확한 정의와 요구사항을 기술하는 것이다.
JVM에서 클래스 파일 로드와 실행
자바 애플리케이션 실행에 있어 JVM의 역할에 대해 살펴봤다. 그런데 이 기능을 실제로는 어떻게 수행할까. 자바 애플리케이션을 실행하기 위해 JVM은 자바 클래스 로더(Class Loader)와 자바 실행 엔진(Execution Engine)에 의존한다.
- JVM 자바 클래스 로더
자바에서는 모든 것이 클래스이며, 모든 자바 애플리케이션은 클래스로부터 만들어진다. 하나의 애플리케이션이 하나 또는 수천 개의 클래스로 구성될 수 있다. 자바 애플리케이션을 실행하기 위해서는, JVM이 컴파일된 .class 파일을 맥락에 따라 액세스 가능한 서버 같은 것으로 로드 해야만 한다. JVM은 클래스 로더에 의존해 이 기능을 수행한다.
자바 클래스 로더는 클래스를 메모리에 로드하고 실행을 위해 사용할 수 있게 만드는 JVM의 일부다. 클래스 로더는 클래스 로딩(Class Loading)을 최대한 효율적으로 수행하기 위해 지연 로딩(Lazy-loading)과 캐싱(Caching) 같은 기법을 활용한다. 그렇긴 하지만, 클래스 로딩이 이식성 있는 런타임 메모리 관리처럼 대단히 까다로운 것이 아니기 때문에 이런 기법들은 비교적 간단하다.
모든 자바 가상 머신에는 클래스 로더가 포함되어 있다. JVM 스펙은 런타임에 클래스 로더에 질의(Query: 쿼리)하고 조작하기 위한 일반적인 방법들을 설명하고 있지만, 이런 기능을 충족시키는 책임은 JVM 구현에 있다. 개발자의 관점에서 볼 때, 근본적인 클래스 로더 메커니즘은 대개 블랙 박스다.
- JVM 실행 엔진
클래스 로더가 클래스를 로딩하는 작업을 마치면, JVM은 각 클래스에 있는 코드를 실행하기 시작한다. 이 기능을 처리하는 것이 JVM 구성요소인 실행 엔진이다. 실행 엔진은 JVM 실행에 필수적이다. 실제로, 현실적인 목적을 위해, 실행 엔진은 JVM 인스턴스다.
코드 실행에는 시스템 리소스에 대한 액세스 관리가 관련되어 있다. JVM 실행 엔진은–파일, 네트워크 그리고 메모리 리소스를 요구하는–프로그램 실행과 운영체제 가운데 위치해서 이런 리소스들을 공급한다.
- 실행 엔진이 시스템 리소스를 관리하는 방법
시스템 리소스는 크게 메모리와 다른 모든 것, 2가지 범주로 나눌 수 있다.
JVM이 미사용 메모리를 없애야 할 책임이 있으며, 가비지 컬렉션이 이런 폐기를 수행하는 메커니즘이라는 것을 상기하라. JVM은 개발자들이 당연하게 여기고 있는 참조 구조체(Referential Structure)를 할당하고 관리할 책임도 있다. 예를 들어, JVM의 실행 엔진은 자바의
new
키워드 같은 것을 받아, 그것을 메모리 할당에 대한 운영체제 고유의 요청으로 변환할 책임이 있다.
메모리를 넘어서, 실행 엔진은 파일 시스템 액세스, 네트워크 입출력을 위한 리소스를 관리한다. JVM이 여러 운영체제 전반에서 호환되기 때문에, 실행 엔진은 각각의 운영 체제 환경에 즉각 대응할 수 있어야만 한다. 이것이 JVM이 종잡을 수 없는 요구사항을 처리하는 방법이다.
JVM의 과거, 현재, 미래
1995년, JVM은 이후 최신 소프트웨어 개발에 대한 기준이 된 2가지 혁신적인 개념을 소개했다. "한 번 작성해, 모든 곳에서 실행", 그리고 자동 메모리 관리였다. 당시에는 소프트웨어 상호운영성이 대담한 개념이었지만, 지금은 소수의 개발자들만이 재고할 뿐이다. 마찬가지로, 우리 엔지니어 선배들이 프로그램 메모리를 스스로 관리했던 것처럼, 우리 세대는 가비지 컬렉션과 함께 성장했다.
현대 프로그래밍을 발명한 사람은 제임스 고슬링과 브렌단 아이크지만, 수천 명의 다른 사람들이 다음 수십 년 동안 그들의 생각을 다듬고 쌓아왔다. 처음에는 자바만을 위한 자바 가상 머신이었지만, 이제는 진화해 스칼라(Scalar), 그루비(Groovy), 그리고 코틀린(Kotlin)을 포함한 수 많은 스크립팅 언어와 프로그래밍 언어를 지원하고 있다. 앞으로, JVM이 개발 환경의 중요한 부분이 아닌 미래를 보는 것은 어렵다.
이번주 WIL 끝! 한 주 동안 고생하셨습니다!
참고 자료
https://www.itworld.co.kr/news/110837#csidx9071317602dda7488c63dc71a0ec1e2
"JVM이란 무엇인가" 자바 가상 머신 이해하기
자바 가상 머신(Java Virtual Machine, JVM)은 시스템 메모리를 관리하면서 자바 기반 애플리케이션을 위해 이식 가능한 실행 환
www.itworld.co.kr
개발자 면접예상질문 : 객체지향 프로그래밍과 .. : 네이버블로그 (naver.com)
개발자 면접예상질문 : 객체지향 프로그래밍과 절차적 프로그래밍의 개념 및 특징
#객체지향 #클래스 #특징 이번에는 면접에서 자주 물어봤던 질문인 객체지향 Programming 과 절차적 Prog...
blog.naver.com