모든 글은 다음 블로그를 참고하여 작성하였습니다.
https://gyoogle.dev/blog/
언어
가비지 컬렉션이란?
- 정리되지 않은 메모리, 유효하지 않은 메모리 주소인 가비지를 정리해주는 프로그램
- Heap 메모리를 재활용 하기 위해 참조되지 않은 객체드를 해제시켜 가용한 공간을 만드는 작업
- 프로그래머가 직접 메모리를 정리하지 않아도 되어 개발 속도가 대폭 향상된다.
- 메모리를 언제 되찾을 지 결정하기 위한 오버헤드 발생 문제점 존재
Vector와 ArrayList의 차이는?
- Vector : 동기식. 한 스레드가 벡터 작업 중이면 다른 스레드가 벡터 보유 불가능
- ArrayList : 비동기식. 여러 스레드가 arraylist에서 동시 작업이 가능
String / StringBuffer / StringBuiler 의 차이는?
- String : 불변. 문자를 수정하려면 지우고 다시 생성해야함(new) -> 문자열 연산이 많으면 기능 떨어짐
- StringBuffer : 가변. 한 번 만들고 필요할 때 크기를 변경하여 문자를 변경함 (append()와 같이)
- StringBuilder : 동기화 지원X. 멀티스레드 환경에 부적합 -> 싱글 스레드에서 StringBuffer보다 좋음
Serialization이란?
- 직렬화. 객체의 상태 혹은 데이터 구조를 기록할 수 있는 포맷으로 변환해줌
- 나중에 재구성 할 수 있게 자바 객체를 JSON으로 변환해주거나 JSON을 자바 객체로 변환해주는 라이브러리
Java의 메모리 영역은?
- 메소드 / 스택 / 힙
- 메소드 : 바이트 코드, 전역 변수, static 변수
- 스택 : 매개 변수, 지역 변수 (사용 끝나면 바로 소멸, 컴파일 시에 메모리에 할당)
- 힙 : new로 생성된 객체 (c에서는 malloc()). 호출이 끝나도 사라지지 않고 프로그램 실행 시 동적 할당
오버로딩과 오버라이딩 차이는?
- 오버로딩 : 메소드의 이름은 같고, 매개변수를 다르게 함으로써 여러 메소드를 만드는 것
- 오바라이딩 : 부모 클래스로부터 상속 받은 메소드를 재정의 하는 것. 자식 객체에서 오버라이딩한 메소드는 호출 시 오버라이딩한 메소드가 우선시 되어 호출됨 (동일한 리턴타입, 메소드 이름, 매개변수를 가져야함)
추상클래스와 인터페이스 차이는?
- 추상클래스 : 클래스 내에 추상 메소드가 하나 이상 포함되거나 abstract로 정의된 경우. extends를 통해 기능을 이용하고 확장하도록 하는 클래스
- 인터페이스 : 모든 메소드가 추상 메소드인 경우 (여러 implements가 가능해 다중 상속 구현 가능) 뼈대만 있으며, 구현하는 모든 클래스에 대해 강제적으로 메소드를 구현하도록 만듬
제네릭이란?
- 클래스에서 사용할 타입을 클래스 외부에서 설정하도록 만드는 것
- 제네릭으로 선언한 클래스는, 내가 원하는 타입으로 만들어 사용이 가능함
- < > 안에는 참조자료형 (클래스, 인터페이스, 배열)만 가능함 (기본 자료형을 이용하기 위해선 wrapper 클래스를 활용해야 함)
접근 지정자 4가지
- public : 모든 접근 허용
- protected : 상속받은 클래스 or 같은 패키지만 접근 허용
- defualt : 기본 제한자. 자신 클래스 내부 or 같은 패키지만 접근 허용
- private : 외부 접근 불가능. 같은 클래스 내에서만 가능
Call by Value vs Call by Reference
- 값에 의한 호출 : 값을 복사해서 새로운 함수로 넘기는 호출 방식. 원본 값 변경 X
- 참조에 의한 호출 : 주소 값을 인자로 전달하는 호출 방식. 원본 값 변경 O
배열과 연결 리스트의 차이는?
- 배열
- 인덱스를 가짐. 원하는 데이터를 한번에 접근하기 때문에 접근 속도 빠름
- 크기 변경이 불가능하며, 데이터 삽입 및 삭제 시 그 위치의 다음 위치부터 모든 데이터 위치를 변경해야 하는 단점 존재
- 연결 리스트
- 인덱스 대신에 현재 위치의 이전/다음 위치를 기억 함
- 크기는 가변적. 인덱스 접근이 아니기 때문에 연결되어 있는 링크를 쭉 따라가야 접근이 가능함. (따라서 배열보다 속도 느림)
- 데이터 삽입 및 삭제는 논리적 주소만 바꿔주면 되기 때문에 매우 용이함
- 데이터의 양이 많고 삽입/삭제가 없음. 데이터 검색을 많이 해야할 때 -> Array
- 데이터의 양이 적고 삽입/삭제 빈번함 -> LinkedList
Hash란?
- 데이터 삽입 및 삭제 시, 기존 데이터를 밀어내거나 채우지 않고 데이터와 연관된 고유한 숫자를 생성해 인덱스로 사용하는 방법
- 검색 속도가 매우 빠르다
Java 컴파일 과정
- 컴파일러가 소스코드를 자바 바이트 코드(.class)로 변환
- JVM이 바이트코드를 기계어로 변환하고, 인터프리터 방식으로 애플리케이션 실행
C++ 실행 과정
- 전처리 : #define, #include 지시자 해석
- 컴파일 : 고급 언어 소스 프로그램 입력 받고, 어셈블리 파일 만듬
- 어셈블 : 어셈블리 파일을 오브젝트 파일로 만듬
- 링크 : 오브젝트 파일을 엮어 실행파일을 만들고 라이브러리 함수 연결
- 실행
메모리, 성능을 개선하기 위해 생각나는 방법은?
- static을 사용해 선언한다.
- 인스턴스 변수에 접근할 일이 없으면, static 메소드를 선언하여 호출하자
- 모든 객체가 서로 공유될 수 있기 때문에 메모리가 절약되고 연속적으로 그 값의 흐름을 이어갈 수 있는 장점이 존재
클래스와 구조체의 차이는?
- 구조체는 하나의 구조로 묶일 수 있는 변수들의 집합이다.
- 클래스는 변수뿐만 아니라, 메소드도 포함 시킬 수 있음
- (물론 함수 포인터를 이용해 구조체도 클래스처럼 만들어 낼 수도 있다.)
스레드는 어떤 방식으로 생성하나요? 장단점도 말해주세요
- 생성방법 : Runnable(인터페이스)로 선언되어 있는 클래스 or Thread 클래스를 상속 받아서 run() 메소드를 구현해주면 됨
- 장점 : 빠른 프로세스 생성, 메모리를 적게 사용 가능, 정보 공유가 쉬움
- 단점 : 데드락에 빠질 위험이 존재
포인터를 이해하기 쉽도록 설명해주세요
- 포인터는 메모리 주소를 저장하는 변수임
- 주소를 지칭하고 있는 곳인데, 예를 들면 엘리베이터에서 포인터는 해당 층을 표시하는 버튼이라고 할 수 있음. 10층을 누르면 10층으로 이동하듯, 해당 위치를 가리키고 있는 변수!
- 포인터를 사용할 때 주의할 점은, 어떤 주소를 가리키고 있어야만 사용이 가능함