본문 바로가기
  • 실행력이 모든걸 결정한다
IT 상식/CS

[CS] 면접 기타 예상 질문

by 김코더 김주역 2021. 6. 11.
반응형

구조체와 클래스의 차이

구조체는 값 타입으로, 스택 영역에 할당됨
클래스는 참조 타입으로, 힙 영역에 할당됨
단, 구조체로 선언을 했어도 객체를 힙 영역에 메모리를 할당할 때가 있음

  • 모든 필드의 합이 16byte를 넘는 경우
  • 구조체안에 클래스 타입을 필드로 가질 경우

정보 출처 : https://hijuworld.tistory.com/43

 

HTML5

  • 수많은 플러그인들로 인한 부작용을 막기 위해 개발된 HTML버전
  • 멀티미디어 직접 재생 가능
  • 서버와의 통신 가능
  • 시멘틱 태그로 검색 엔진의 검색 능력을 극대화 가능

 

 

W3C

웹 표준 개발 기구

※ 웹 표준 : 모든 브라우저에서 웹 서비스가 정상적으로 보여질 수 있도록 하는 표준

 

 

멤버변수, 지역변수는 언제 메모리에서 해제되나?

멤버 변수, heap은 사용자 혹은 운영체제(가비지 콜렉터)에서 해제해주고, 지역변수는 해당 변수가 선언된 지역이 닫힐 때 해제된다.

 

절차지향, 객체지향의 장단점

절차지향 : 실행속도가 빠르지만 유지보수가 어려움 - 예) C
객체지향 : 코드의 재활용성이 높고 유지보수가 편하지만, 처리 속도가 느림 - 예) 자바, 파이썬, 자바스크립트, C++
유지보수와 속도 관점 위주로 설명해도 충분할듯

 

값 타입 vs 참조 타입

값 타입과 달리 참조 타입은 사본을 사용하지 않고 기존 인스턴스의 주소 참조함
* 인스턴스 : 할당된 실체
값 타입의 경우에는 스택 영역에 할당되고,
참조 타입의 경우에는 실제 메모리가 힙 영역에 할당되나, 주소값 자체는 스택 영역에 저장됨

 

stack, heap 영역이 분리되어 있는 이유

stack은 큰 주소값 -> 작은 주소값으로 채워지고
heap은 작은 주소값 -> 큰 주소값으로 채워짐
이렇게 버퍼 오버플로우를 막기 위해

 

 

[C] char* vs String

char* (문자열배열)이 속도가 더 빠름
String은 클래스이며, 라이브러리와 연산자의 도움을 더 잘 받을 수 있음

 

[JAVASCRIPT] ==와 ===의 차이

==는 값만 비교하고, ===는 타입과 값을 같이 비교한다.

 

 

[JAVA] Array와 ArrayList의 차이

Array는 고정 길이

ArrayList는 가변 길이 (요소들이 찰 때마다 capacity(용량) 변수가 1.5배씩 늘어난다)

 

 

[JAVA] ==, equals() 차이

equals()는 값 자체를 비교, ==는 주소를 비교

+ 주소값이 다른데 equals()는 어떻게 값이 같은걸 아는지?
- hashcode(객체를 식별하는 정수 값)이용
- equals()를 override해서 toString() 로직을 넣는 방법도 가능

 

+ equals()와 hashCode()

hashCode()는 객체의 메모리 주소를 이용해서 해시코드를 만들어 리턴하는 함수고, equals()는 객체의 값의 일치 여부(boolean)을 반환한다.

hashCode()가 리턴하는 해시 코드값이 다르면 다른 객체로 판단하는데 HashTable의 크기는 한정적이기 때문에 서로 다른 객체라고 하더라도 같은 해시값을 갖게 될 수도 있다(해시 충돌). 같은 해시값의 버킷 안에 다른 객체가 있는 경우 equals()로 한 번 더 비교를 해서 일치하다면 동일한 객체로 판단하는 것이다. 그래서 equals()와 hashCode()는 둘 다 재정의해야 한다.

 

+ hashCode()를 잘못 오버라이딩하면 성능이 떨어질 수 있다. 어떤 케이스일 때 인지?

해시충돌이 자주 발생하도록 구현되면 그만큼 많은 equals() 함수를 거쳐야 하기 때문에 성능이 떨어진다. 이런 경우에는 버킷에 LinkedList 형태로 객체를 추가할 수 있다.

 

 

[JAVA] String=""(리터럴) vs new String()

String=""은 그 문자열을 가리키고, new String() 는 새로운 문자열 객체를 생성
리터럴이 더 좋음

+ new 연산자는 되도록 자제하는게 좋은 이유
그 만큼 Heap 영역에 새로운 객체가 생성되며, String이 갖는 불변성이라는 장점을 누리지 못함

 

[JAVA] String vs StringBuffer vs StringBuilder

String : 불변의 속성을 갖기 때문에 String 값이 변경되면 새로운 인스턴스가 생성된다.

StringBuffer/StringBuilder : 가변성을 가진다. append(), delete() 등의 메소드를 통해 동일 객체 내에서 문자열을 변경할 수 있다. 문자열의 추가, 수정, 삭제가 빈번하게 발생하는 경우에는 이들을 사용해야 한다.

StringBuffer와 StringBuilder의 차이점 : StringBuffer은 동기화를 지원하여 멀티쓰레드 환경에서 안전하고, StringBuilder은 동기화를 지원하지 않기 때문에 멀티쓰레드 환경에는 적합하지 않다. 동기화를 고려하지 않는 만큼 단일쓰레드에서 성능은 StringBuilder가 더 좋다.

 

 

[JAVA] 쓰레드를 써야하는 이유

동시에(병렬적으로) 여러 작업을 함으로써 작업을 효율적으로 처리하기 위함이다.

쓰레드는 1MB 이내의 메모리를 점유한다.

 

+ 쓰레드의 내부 동작

stack 영역은 각각의 쓰레드가 가지고 있으며, 그 나머지 영역인 code, data, heap 영역은 쓰레드들 끼리 공유한다. 

 

+ 쓰레드를 최대한 많이 사용할 수록 좋나?

쓰레드라고 하더라도 컨텍스트 스위치 비용은 발생한다. 단지, stack 영역만 교체하면 되기 때문에 비용이 상대적으로 낮은 것일 뿐이다.

서버의 메모리 부족을 유발할 수 있다.

 

 

[JAVA] volatile(발러틀)이란?

자바 변수를 CPU 캐시가 아닌 메인 메모리에 저장하도록 하는 키워드로 변수 값 불일치 문제를 해결할 수 있다.

멀티쓰레드 환경에서 write하는 상황에서는 synchronized를 통해 원자성을 보장해야 한다.

CPU 캐시보다 메인 메모리가 비용이 더 크기 때문에 변수 값 일치를 보장해야 하는 경우에만 volatile을 사용하는 것이 좋다.

 

+ static과의 차이

static은 클래스가 로드될 때 함께 로드된다.

volatile은 일반 변수와 같이 런타임에 로드된다.

 

 

[JAVA] System.out.println 메소드 사용을 자제해야 하는 이유

로그 레벨별 출력이 불가능하다.

로그가 파일로 저장되지 않고 휘발된다.

내부적으로 synchronized 메소드를 사용하기 때문에 blocking이 걸려서 성능 저하가 발생한다. 동기화는 한 스레드가 사용 중인 객체를 다른 스레드에서 동시에 접근할 수 없도록 잠금을 걸어두는 기능으로 race condition을 해결한다.

 

+ Blocking IO vs Non-Blocking IO

Blocking IO : 프로세스를 멈추고 IO 작업이 끝나기를 기다림 (Tomcat의 방식)

Non-Blocking IO : 프로세스를 중단하지 않고 IO 작업의 리턴을 즉시 받음

작업을 멈추는동안 CPU가 쉬고있으면 CPU 활용률이 낮아진다.

 

 

[JAVA] Optional 객체란?

null이 올 수 있는 값을 감싸는 Wrapper 클래스

 

 

[JAVA] Serializable(직렬화)이란?

자바 객체를 외부 시스템에서도 사용할 수 있도록 전송 가능한 형태로 변환하는 기술

직렬화의 포맷에는 JSON, XML 등이 있다.

역직렬화는 직렬화된 파일을 다시 객체의 형태로 만드는 것이다.

 

 

API(Application Programming Interface)

두 애플리케이션 간의 통신을 위한 인터페이스

 

 

String Pool이란? 그리고 동작?

Heap 영역에 존재하며, 리터럴 문자열이 저장되는 곳임. 재사용이 가능해짐
리터럴 문자열 값을 바꾸면, String Pool에 이미 바꾼 값을 가진 객체가 있으면 그 객체를 참조하고, 없으면 String Pool에 새로운 객체를 생성한다.

 

ORM, JPA, Hibernate란?

ORM(Object Relational Mapping) : 객체와 관계형 데이터베이스를 매핑시켜주는 프레임워크
JPA(Java Persistent API) : ORM을 사용하기 위한 인터페이스들을 모아둔 것
Hibernate : JPA를 구현한 ORM 라이브러리들중 하나

● SQL대신 객체를 사용하여 DB에 접근하는 방식의 장단점
장점
- SQL 작업을 하지 않아도 됨
- 테이블 컬럼이 변경되어도 JPA에서 알아서 관리해주기 때문에 개발에만 집중할 수 있음


단점
- 복잡한 데이터베이스에서는 사용이 어려움
- SQL 작성 방식보다 성능이 떨어질 수 있음

 

 

프로젝트 vs 앱

프로젝트 : 하나 이상의 앱과 각 설정들을 묶어놓은 것

 

 

추상클래스 vs 인터페이스

추상클래스는 원하는 메소드만 구현을 강제할 수있다.
다중 상속 가능 여부의 차이가 있다.

 

 

인터페이스의 장점

객체의 표준화가 가능하고 결합도가 낮아지기 때문에 개발 시간을 단축할 수 있고 유지보수에도 좋음

 

 

부등호로 부동 소수점을 정확하게 계산할 수 없는 이유

부동 소수점도 메모리 상에 이진법으로 저장되는데, 어떤 실수는 완전하게 표현하려면 무한한 메모리가 필요하기 때문에 생략되는 메모리만큼 오차가 발생하는 것이다.

 

 

라이브러리 vs 프레임워크

둘 다 공통 기능을 모듈화 한 것을 의미한다.

라이브러리는 파일명 등에 대한 규칙이 없기 때문에 자유롭고 제어권이 사용자에게 있는데, 프레임워크는 정해진 틀 안에서 작업해야 하기 때문에 엄격하고 제어권이 프레임워크에게 있다.

 

+ 정적 라이브러리 vs 동적 라이브러리

정적 라이브러리는 링커에 의해 실행 파일에 들어가고, 동적 라이브러리는 필요할 때만 참조된다.

 

 

웹 서버 vs 웹 애플리케이션 서버

웹 서버 : 클라이언트로부터 직접 요청을 받고 응답하는 서버로, 주로 정적 페이지를 웹 클라이언트에 제공한다.

웹 애플리케이션 서버 : 웹 서버로부터 요청을 받아 서비스를 제공하는 서버로, 동적 페이지 요청을 처리하고 그 결과를 웹 서버로 반환한다.

※ 동적 페이지를 처리할 때가 정적 페이지를 처리할 때보다 훨씬 더 큰 메모리를 소비한다. 웹 서버는 정적 페이지 처리에 최적화되어 있기 때문에 정적 페이지는 웹 서버에서 처리하고 동적 페이지는 웹 애플리케이션 서버에서 처리하도록 해야 효율적이다.

 

 

PnP(Plug and Play)

- 컴퓨터에 외부 장치를 부착했을 때 운영체제가 해당 환경을 자동으로 구성해주는 것

 

 

OLE(Object Linking and Embedding)

- 응용 프로그램에서 작성된 오브젝트를 현재 작성중인 문서에 연결하거나 삽입할 수 있는 기능

 

 

 

반응형

'IT 상식 > CS' 카테고리의 다른 글

[CS] 자료구조 요약  (0) 2022.11.26
[CS] 데이터베이스 요약  (0) 2022.11.20
[CS] 운영체제 요약  (0) 2022.11.10
[CS] 네트워크 요약  (0) 2022.11.06
[CS] 디자인 패턴과 프로그래밍 체계 요약  (0) 2022.11.01

댓글