[가비지 컬렉션]
- 정리되지 않은 메모리, 유효하지 않은 메모리 주소인 가비지를 정리해주는 프로그램
- 힙 메모리를 재활용하기 위해 참조되지 않는 객체들을 해제시켜 가용가능한 공간을 만드는 작업
- 프로그래머가 직접 메모리를 정리하지 않아도 되기 때문에 개발 속도가 향상된다.
- 메모리를 언제 되찾을지 결정하기 위한 오버헤드 발생 문제점 존재
[Vector vs ArrayList]
- Vector: 동기식, 한 스레드가 벡터 작업 중이면 다른 스레드가 벡터 보유 불가능
- ArrayList: 비동기식, 여러 스레드가 ArrayList에서 동시 작업 가능
[String vs StringBuffer]
- String: 불변, 문자를 수정하려면 지우고 다시 생성해야함
- StringBuffer: 가변, 한번 만들고 필요할 때 크기를 변경하여 문자를 변경함
[직렬화(Serialization)]
- 객체의 상태 혹은 데이터 구조를 기록할 수 있는 포맷으로 변환해줌
- 자바 객체를 JSON으로 변환해주거나 JSON을 자바 객체로 변환해주는 라이브러리
[Java의 메모리 영역]
- 메소드: 바이트 코드, 전역 변수, static 변수
- 스택: 매개 변수, 지역 변수(컴파일 시 메모리에 할당)
- 힙: new로 생성된 객체, 호출이 끝나도 사라지지 않고 프로그램 실행 시 동적 할당
[오버로딩 vs 오버라이딩]
- 오버로딩: 메소드의 이름은 같고, 매개변수를 다르게 함으로써 여러 메소드를 만드는 것
- 오버라이딩: 부모클래스로부터 상속받은 메소드를 재정의 하는 것(동일한 리턴타입, 메소드 이름, 매개변수를 가져야함)
[abstract vs interface]
- 추상클래스: 클래스 내 추상 메소드가 하나 이상 포함되어있거나, abstract로 정의된 경우. extends를 통해 기능을 이용하고 확장하도록 하는 클래스
- 인터페이스: 모든 메소드가 추상 메소드인 경우, 뼈대만 있으며 구현하는 모든 클래스에 대해 강제적으로 메소드를 구현하도록 만듬
[제네릭]
- 클래스에서 사용할 타입을 클래스 외부에서 설정하도록 만드는 것
- 제네릭으로 선언한 클래스는 내가 원하는 타입으로 만들어서 가능함
[Call by Value vs Call by Reference]
- Call by Value: 값을 복사해서 새로운 함수로 넘기는 호출 방식, 원본 값 변경X
- Call by Reference: 주소 값을 인자로 전달하는 호출 방식, 원본 값 변경O
[배열 vs 연결리스트]
- 배열은 인덱스를 통해 원하는 데이터에 한번에 접근하기 때문에 속도가 빠르다.
- 배열은 크기 변경이 불가능하며, 데이터 삽입 및 삭제 시 해당 위치의 다음 위치에 대한 값을 모두 이동시켜야한다는 단점이 존재한다.
- 연결리스트는 인덱스 대신 현재 위치의 이전/다음 위치를 기억한다.
- 연결리스트의 크기는 가변적이고 인덱스를 사용해서 접근을 하는 것이 아니기 때문에 링크를 쭉 따라가야 접근이 가능 => 배열보다 속도가 느림
[Hash]
- 데이터 삽입 및 삭제 시, 기존 데이터를 밀어내거나 채우지 않고 데이터와 연관된 고유한 숫자를 생성해 인덱스로 사용하는 방법
- 검색 속도가 매우 빠르다.
[Java 컴파일 과정]
- 컴파일러가 소스코드를 자바 바이트코드로 변환 => JVM이 바이트코드를 기계어로 변환하고 인터프리터 방식으로 애플리케이션 실행
[메모리 성능을 개선하기 위한 방법]
- static을 사용해 선언한다.
- 인스턴스 변수에 접근할 일이 없으면 static메소드를 선언하여 호출한다.
- 모든 객체가 서로 공유할 수 있기 때문에 메모리가 절약되고 연속적으로 그 값의 흐름을 이어갈 수 있는 장점이 존재
[프로세스 vs 스레드]
- 프로세스는 메모리 상에 실행중인 프로그램을 말하며, 스레드는 이 프로세스 안에서 실행되는 흐름 단위를 말한다.
- 프로세스마다 최소 하나의 스레드를 보유하고 있으며, 각각 별도의 주소공간을 독립적으로 할당받는다.
- 스레드는 스택에서 공간을 할당받고 나머지 영역은 스레드끼리 서로 공유한다.
- 프로세스: 자신마의 고유 공간과 자원을 할당받아 사용
- 스레드: 다른 스레드와 공간과 자원을 공유한면서 사용
[멀티 프로세스로 처리 가능한걸 멀티 스레드로 하는 이유]
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 감소함으로써 자원의 효율적 관리가 가능
- 프로세스간 통신보다 스레드간 통신이 비용이 적게들어 부담이 감소
- 공유 자원으로 인한 문제 해결을 위해 동기화에 신경을 써야함
[교착상태]
- 프로세스가 자원을 얻지 못해 다음 처리를 하지 못하는 상태를 말한다.
- 한정된 자원을 여러 곳에서 사용하려고 할 때 발생하는 문제
- 상호배제: 프로세스들이 필요로 하는 자원에 대해 배타적 통제권을 요구
- 점유대기: 프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다림
- 비선점: 프로세스가 어떤 자원의 사용을 끝날 때까지 그 자원을 뺏을 수 없음
- 순환대기: 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 갖고 있음
[메모리 할당 알고리즘]
- First fit: 메모리의 처음부터 검사해서 크기가 충분한 메모리에 할당
- Next fit: 마지막으로 참조한 메모리 공간에서부터 탐색을 시작해 공간을 찾음
- Best fit: 모든 메모리 공간을 검사해서 내부 단편화를 최소화하는 공간에 할당
[외부 단편화와 내부 단편화]
- 외부 단편화: 작업보다 많은 공간이 있더라도 실제로 그 작업을 받아들일 수 없는 경우
- 내부 단편화: 작업에 필요한 공간보다 많은 공간을 할당받음으로써 발생하는 내부의 사용 불가능한 공간
[가상 메모리]
- 메모리에 로드된, 실행중인 프로세스가 아닌 가상의 공간을 참조해 물리 메모리를 갖는 것 처럼 사용할 수 있게 해주는 기법
[페이징]
- 페이지 단위의 논리-물리 주소 관리 기법
- 논리 주소 공간이 하나의 연속적인 물리 메모리 공간에 들어가야하는 제약을 해결하기 위한 기법
- 논리 주소 공간과 물리 주소 공간을 분리해야함
- 특징: 외부 단편화를 없앨 수 있음, 페이지가 클 수록 내부 단편화도 커짐
[세그먼테이션]
- 사용자/프로그래머 관점의 메모리 관리 기법
- 메모리를 사용할 시점에 세그먼트로 나눔
[세마포어]
- 운영체제에서 공유 자원에 대한 접속을 제어하기 위해 사용되는 신호 공유자원에 접근할 수 있는 최대 허용치만큼만 동시에 사용자 접근 가능 스레드를 리소스 접근 요청을 할 수 있고, 세마포어는 카운트가 하나씩 줄어들게 되며 리소스가 모두 사용중인 경우 다음 작업은 대기를 하게 됨
[뮤텍스]
- 상호배제, 제어되는 섹션에 하나의 스레드만 허용하기 때문에 해당 섹션에 접근하려는 다른 스레드들을 강제적으로 막음으로써 첫번째 스레드가 해당 섹션을 빠져나올 때 까지 기다리는 것
[콘텍스트 스위칭]
- 하나의 프로세스가 CPU를 사용중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해 이전의 프로세스 상태를 보관하고 새로운 프로세스의 상태를 적재하는 방법
- 한 프로세스의 문맥은 그 프로세스의 PCB에 기록
[사용자 수준 스레드 vs 커널 수준 스레드]
사용자 수준 스레드
- 장점: 콘텍스트 스위칭이 없어서 커널 스레드보다 오버헤드가 적음
- 단점: 프로세스 내 한 스레드가 커널로 진입하는 순간 나머지 스레드도 전부 정지됨
커널 수준 스레드
- 장점: 사용자 수준 스레드보다 효율적임, 커널 스레드를 쓰면 멀티프로세서를 활용할 수 있기 때문
- 단점: 콘텍스트 스위칭이 발생, 이 과정에서 프로세서 모드가 사용자 모드와 커널 모드 사이를 움직이기 때문에 많이 돌아다닐수록 성능이 떨어짐
[fork vs vfork]
- fork는 부모 프로세스의 메모리를 복사해서 사용
- vfork는 부모 프로세스와 메모리를 공유, 복사가 아닌 공유를 하기 때문에 생성속도가 빠름 하지만 자원을 공유하기 때문에 Race Condition이 발생할 수 있다는 단점 때문에 부모 프로세스는 자식 프로세스가 exit이나 execute를 하기 전까지 block된다.
[Race Condition]
- 두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓸 때, 공용 데이터에 대한 접근 순서에 따라 실행 결과가 달라지는 상황
- 모든 프로세스에 원하는 결과가 발생하는 것을 보장할 수 없음, 따라서 이러한 상황은 피해야하며 상호배제나 임계구역으로 해결할 수 있음
[DBMS란]
- 데이터베이스 관리 시스템
- 다수의 사용자가 데이터베이스 내의 데이터를 접근할 수 있도록 설계된 시스템
[DBMS의 기능]
- 정의기능(DDL)
- 데이터베이스가 어떤 용도이며 어떤 식으로 이용될 것에 대한 정의가 필요
- CREATE, ALTER, DROP, RENAME
- 조작기능(DML)
- 데이터베이스를 만들었을 때 그 정보를 수정하거나 삭제 추가 검색할 수 있어야 한다.
- SELECT, INSERT, UPDATE, DELETE
- 제어기능(DCL)
- 데이터베이스에 접근하고 객체들을 사용하도록 권한을 주고 회수하는 명령
- GRANT, REVOKE
[UML]
- 프로그램 설계를 표현하기 위해 사용하는 그림으로 된 표기법
- 이해하기 힘든 복잡한 시스템을 의사소통하기 위해 만듬
[VIEW]
- 허용된 데이터를 제한적으로 보여주기 위한 것
- 하나 이상의 테이블에서 유도된 가상 테이블이다.
- VIEW에 나타나지 않은 데이터를 보호할 수 있는 장점 존재
[정규화]
- 중복을 최대한 줄여 데이터를 구조화하고, 불필요한 데이터를 제거해 데이터를 논리적으로 저장하는 것
- 이상현상 발생을 막을 수 있다.
[이상현상]
- 릴레이션에서 일부 속성들의 종속으로 인해 데이터 중복이 발생하는 것
[DB 무결성]
- 테이블에 있는 모든 행들이 유일한 식별자를 가질 것을 요구한다.
- 외래키 값은 NULL이거나 참조 테이블의 PK값이여야한다.
- 한 컬럼에 대해 NULL허용 여부와 자료형, 규칙으로 타당한 데이터 값 지정
[트리거]
- 자동으로 실행되도록 정의된 저장 프로시저
- 업무 규칙 보장, 업무 처리 자동화, 데이터 무결성 강화
[Commit과 Rollback]
- Commit: 하나의 논리적 단위에 대한 작업이 성공적으로 끝났을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산
- Rollback: 하나의 트랜잭션 처리가 비정상적으로 종료되어 DB의 일관성을 깨트렸을때, 모든 연산을 취소시키는 연산
[인덱스]
- DBMS에서 저장 성능을 희생하여 데이터 읽기 속도를 높이는 기능
- 데이터가 정렬되어 들어간다.
- 양이 많은 테이블에서 일부 데이터만 불러왔을 때, 이를 풀 스캔시 처리 성능이 떨어진다.