1. 객체 지향 프로그램
1)객체지향(Object Oriented Programming) 이란?
- 객체 지향의 정의 : 실제 세계를 리모델링하여 소프트웨어를 개발하는 방법, 데이터와 절차를 묶어서 생각
2)객체지향의 특성
- 캡슐화 : 관련된 데이터와 알고리즘이 하나의 묶음으로 정리된 것
- 상속 : 이미 작성된 클래스를 이어 받아 새로운 클래스를 만드는 것, 같은 내용을 생략하는 것으로 큰 장점
- 다형성 : 하나의 이름으로 많은 상황을 대처하는 방법 ex)동일한 작업을 수행하는 함수들을 똑같은 이름으로 부여
3) 장점
- 코드의 재활용성이 높음
- 절차지향보다 간편함
- 디버깅이 쉬움
2. JVM 이해하기
- JDK : Java Development Kit / 자바 개발 도구
- JRE : Java Runtime Environment / 자바 실행 환경
- JVM : Java Virtual Machine / 자바 가상 기계
1)Java의 호환성
- Java는 소스파일 하나만 작성하면 어디든 사용이 가능하다.(Write once Use Anywhere)
- 반대로 C언어는 "하나의 소스파일을 각 기계에 맞는 목적파일로 만들어 어디든 사용 가능하다.
- 결론적으로 자바는 운영체제에 구애받지 않고 개발할 수 있다.
- Java의 목적파일은 반기계어인 *바이트코드(.class)인데 이는 운영체제가 아니라 JVM에서 사용
- 소스코드를 바이트 코드로 *컴파일 해주는게 자바 컴파일러(javac)
*바이트코드 : 고급 언어로 작성된 소스 코드를 가상머신이 이해할 수 있는 중간 코드로 컴파일 한것
*컴파일(build라고도함) : 주어진 언어로 장성된 프로그램을 다른 언어의 동등한 프로그램으로 변환하는 프로세스
2)Java의 실행 과정
- 개발자가 자바 소스파일(.java)을 작성
- JDK가 제공하는 javac을 이용해 소스파일로 컴파일
- JVM의 Class Loader는 바이트 코드르(.class)를 전달 받아 동적 로딩을 통해 실행에 필요한 클래스를 로딩하여 JVM 내부 Runtim Data Area에 로드합니다.
- JVM의 Execution(실행)에 의해 기계어로 해석되어 실행된다.
ㄱ. Class Loader
- 프로그램 상의 작성한 모든 클래스, 변수 및 메서드의 정보를 Method Area에 배치
- JVM 내부에 바이트 코드를 로드하고 링크를 통해 배치하는 작업을 수행하는 모듈
- 실행될 때 *동적(dynamic)으로 클래스를 로드하고, jar 파일에 저장된 클래스들을 JVM에 로드
- static(정적) 변수와 메서드는 Heap Area에 배치
*동적 : 그때 그때 생성하고 어떤 행위에 따라 a를 생성할수도 b를 생성할수도 있다. 유동적이며, 변경가능하다.
* 정적 : 내가 생성한게 아닌 이미 생성된것, 고정적이며 불변하다
ㄴ. Execution(실행 엔진)
- Interpreter는 바이트 코드를 한줄 씩 읽고 번역해 느리다는 단점이 존재
- 이를 보완하고자 JIT 컴파일러가 나왔다. Interpreter방식으로 실행하다가 적당한 시점에서 바이트 코드 전체를 컴파일하여 캐싱한다.
- 캐싱한 코드들은 Interpreter를 통해 실행되는 것이 아니라 바로 실행되어 실행 속도가 매우 빠르다.
- Garbage Collector는 사용되지 않는 메모리를 추적하여 비워주는 기능을 한다.
- static(정적) 변수와 메서드는 Heap Area에 배치
*Cashing : 예를 들면,속도가 느린 디스크의 속도를 속도가 빠른 메모리로 가져와 메모리상에서 쓰고 읽는 작업
3)Compile 언어와 Interpreter 언어
ㄱ. Compile 언어
- 소스파일 전체를 컴파일 후 기계어를 CPU와 메모리를 통해 읽어서 바로 실행하는 방식으로 동작되는 언어
- 종류 : C, C++, Java, C# 등
- - 소스파일의 크기가 크면 컴파일 과정이 오래 걸릴 수 있다.
- - 컴파일이 된 후에 기계어로 바로 실행되기 때문에 속도가 빠르다.
- - Java는 javac에 의해 바이트코드로 컴파일 된 후 JVM에서 인터프리터로 실행된다. 따라서 Compile언어와 Interpreter언어의 특징을 동시에 가진다.
*동적 : 그때 그때 생성하고 어떤 행위에 따라 a를 생성할수도 b를 생성할수도 있다. 유동적이며, 변경가능하다.
* 정적 : 내가 생성한게 아닌 이미 생성된것, 고정적이며 불변하다
ㄴ. Interpreter 언어
- 소스파일을 한줄 씩 번역하면서 실행되는 방식으로 동작하는 언어
- Interpreter : 소스 코드를 바로 번역하여 실행하는 프로그램 또는 환경
- 종류 : Javascript, Ruby, Python
- - 컴파일 언어 처럼 별도의 목적파일이 존재하지 않음
- - 컴파일 과정이 없이 실행되어 수정 및 디버깅 시 편하다
- - Interpreter만 존배한다면 어디서든 실행이 가능하여 자유롭고 독립적이다
- - 실시간으로 번역해야해서 실행 속도가 느리다.
*목적파일 : 컴파일러가 소스코드 파일을 컴파일해서 생성하는 파일, ex)java에서 .class 파일
4)JVM(java 프로그램이 실행되는 가상 컴퓨터)
ㄱ. 전 처리 과정(Preprocessing)
- JRE는 프로그램을 실행하기전에 프로그램에 메인 메서드 포함을 확인하고 존재한다면 JVM을 부팅
- 부팅된 JVM은 받은 코드를 실행시키는데 이때 가장 먼저 하는 일이 전 처리 라고 한다.
- 전처리 과정
- Java의 모든 프로그램은 java.lang패키지를 포함함으로 JRE는 해당 패키지를 Method Area에 배치
- 프로그램이 사용되기 위해 import한 패키지들도 Method Area에 배치
- 프로그램 상의 작성한 모든 클래스, 변수 및 메서드의 정보를 Method Area에 배치
- Static 변수와 메서드는 Heap Area에 배치
ㄴ. Runtime Data Areas
- 컴퓨터에서 메모리 같은 역할을 수행하는 영역, 실행하여 발생하는 데이터를 저장하는 역할을 하며, 데이터의 속성에 따라 영역이 분리되어 있음.
- Interpreter : 소스 코드를 바로 번역하여 실행하는 프로그램 또는 환경
- 종류 : Javascript, Ruby, Python
- - 컴파일 언어 처럼 별도의 목적파일이 존재하지 않음
- - 컴파일 과정이 없이 실행되어 수정 및 디버깅 시 편하다
- - Interpreter만 존배한다면 어디서든 실행이 가능하여 자유롭고 독립적이다
- - 실시간으로 번역해야해서 실행 속도가 느리다.
*목적파일 : 컴파일러가 소스코드 파일을 컴파일해서 생성하는 파일, ex)java에서 .class 파일
4)Runtime Data Areas
- 컴퓨터에서 메모리 같은 역할을 수행하는 영역, 실행하여 발생하는 데이터를 저장하는 역할을 하며, 데이터의 속성에 따라 영역이 분리되어 있음.
ㄱ. PC Register
- 스레드가 시작될 때 마다 생성되는 공간으로, 스레드마다 하나씩 존재
- 쓰레드가 실행할 명렁들을 기록하는 부분으로 현재 수행하는 JVM의 명력 주소를 가지고 있다.
ㄴ. Native Method Stack
- 컴파일되어 생성된 바이트 코드가 아닌 실제 실행할 수 있는 기계어로 작성된 프로그램을 실행시키는 영역
- 자바 외 언어(C, C++, 어셈블리 등)로 작성된 코드 실행 시, Native Method Stack이 할당 되며, 일반적인 C스택 사용
- Java Native Interface를 통해 바이트 코드로 전환하여 저장됩니다.
- 일반 프로그램처럼 커널이 스택을 잡아 독자적으로 프로그램을 실행시키는 영역입니다.
*커널 : 하드웨어와 소프트웨어 사이에서 인터페이스를 제공하고, 컴퓨터 자원들을 관리하는 역할을 한다.
5)Method Area
- 클래스 정보를 처음 메모리 공간에 올릴 때 초기화 되는 대상을 저장하기 위한 공간
- 클래스 타입, 변수 및 메서드 등의 정보를 가지고 있으며 모든 Thread가 공유
- Runtime Constant Pool : 상수 자료형을 자정하여 참조하고 중복을 박는 역할을 수행
ㄱ. Heap Area
- 객체(인스턴스)가 생성되는 영역, 프로그램 실행중 생성되는 모든 객체는 이곳에 생성된다.
특징1)Permenet Generation
- 생성된 객체들의 정보의 주소값이 저장되는 공간
- 클래스 로더에 의해 로드되는 Class, Method 등에 대한 Meta 정보가 저장되는 영역이고 JVM에 의해 사용됨
- *Reflection을 사용하여 동적으로 클래스가 로등되는 경우에 사용
- Java 8 이전에는 Permanent Generation 이 Heap 내부에 존재 했지만 8 이후 제거되고 Method Area 즉, Metaspace 라 불리우며 Heap이 아닌 Native 메모리 영역에 저장됩니다. 이전에 제한된 메모리 크기 때문에 발생했던 한계점을 극복하기 위해 변경되었습니다.
*Reflection(반사) : 실행중인 자바프로그램 내부를 검사하고 내부 속성을 수정할 수 있도록 해준다.
특징2)New/Young Generation
- Eden : 객체들이 최초로 생성되는 공간
- Survivor 0,1 : Eden에서 참조되는 객체들이 저장되는 공간
- 생명 주기가 짧은 객체를 Garbage Collector의 대상으로 하는 영역
- Eden 영역에서 객체가 가득 차면 Garbage Collector에 의해 Eden 영역에 있는 값들을 Survivor 1영역에 복사하고 이 영역을 제외한 나머지 객체를 삭제
특징3)Tenured GenerationEden : 객체들이 최초로 생성되는 공간
- Old : 이곳의 객체들은 Garbage Collector에 의해 삭제된다.
- New/Young Generation에서 일정시간 참조되고 있고 살아남은 객체들이 저장되는 공간
- 생명 주기가 긴 객체를 Garbage Collector의 대상으로 하는 영역이다.
6)Stack Area
- 실행 과정에서 임시로 할당이 되었다가 메서드를 빠져나가면 바로 소멸되는 특성의 데이터를 저장하기 위한 영역
- 실행되는 메서드 및 중괄호 블록(if 문 등)에 대한 데이터가 저장되는 영역
- 가장 처음 실행되는 메서드(main())가 첫 번째로 메모리에 올라가고 그 다음에 실행되는 메서드들이 위에 쌓임
- 쌓이는 메서드의 단위를 스택 프레임이라고 한다.
- 가장 큰 특징은 멀티 스레드 환경에서 각 스레드가 고유의 스택 영역을 가진다는 점이다.
3. 이번 주 발자취 요약
1)객체지향의 특징
ㄱ. 상속: 기존의 클래스로 새로운 클래스를 작성하며 extends를 이용해 상속 받는다.
ㄴ. overriding : 상속받는 메서드를 자신에 맞게 변경
ㄷ. super & super() :
this기능의 반대라고 볼수 있으며 조상의 멤버와 자신을 구분할 때 사용
ㄹ. 제어자 : static, final, abstract 등이 있다.
ㅁ. 접근 제어자 : 공유 범위에 따라 public, protected, default, private 가 있다.
ㅂ. 추상화 : 공통된 행동 필드를 묶어 하나의 클래스를 만드는 것
ㅅ. 인터페이스 : 클래스들이 필수로 구현해야하는 추상 자료형
2)SOLID
- 단일 책임 원칙 : 해당 모듈이 오직 하나의 메서드에만 책임을 진다.
- 개방-폐쇠 원칙 : 확장에 대해 열려있고 수정에 대해서는 닫혀있어야 한다.
- 리스코프 치환 원칙 : 하위 타입은 상위 타입을 대체할 수 있어야 한다.
- 인터페이스 분리 원칙 : 클라이언트가 사용하지 않는 메서드에 의존관계를 맺으면 안된다.
- 의존성 역전 원칙 : 저수준 모듈보다 고수준 모듈에 의존해야한다.
3) 알고리즘 문제풀이
- 프로그래머스 0lv : 3문제
- 프로그래머스 1lv : 25문제
- StringBuilder, List, HashMap, n진법 만드는 법, 정규표현식 사용 방법 등 기술을 익힘
4.참조 링크
- 캐시/캐싱이란? : https://ninetynine-2026.tistory.com/496
캐시/캐싱이란?
캐시는 컴퓨터의 성능을 향상시기기 위해 사용되는 메모리를 말합니다. 주기억장치와 CPU사이에 위치하고, 자주 사용하는 데이터들을 기억합니다. 캐싱은 이 캐시 영역으로 데이터를 가져와서
ninetynine-2026.tistory.com
2. 커널이란 : https://minkwon4.tistory.com/295
[OS] 커널(Kernel)이란
커널이란 커널은 운영체제 중 항상 메모리에 올라가 있는 운영체제의 핵심 부분으로써 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을 하며 컴퓨터 자원들을 관리하는 역할
minkwon4.tistory.com