본문 바로가기
개발자/취업

신입 개발자 기술면접 - JAVA

by mingutistory 2020. 4. 13.
728x90

책과 구글링을 통해서 직접 정리한 자료입니다.

잘 못 설명된 부분이 있다면 덧글을 통해 피드백 부탁드립니다. 

 

JAVA

- 자바 장점

자바 가상 머신JVM만 설치하면 컴퓨터의 운영체제에 상관없이 작동함으로 OS에 독립적임. 

가비지 컬렉터를 통해 메모리 관리가 가능함. 

멀티 스레드 프로그래밍을 지원해 한 개의 프로세스 내부에서 여러 개의 일을 동시에 처리 할 수 있음. 

아파치, 스프링과 같은 자바를 지원하는 수많은 오픈 소스 프로젝트가 있음. 

 

- 객체지향이란?

OOP (Object-Oriented-Programming) : 순차적으로 프로그램이 동작하는 기존의 것들과는 다르게 객체와 객체의 상호작용을 통해 프로그램이 동작하는 것. 이 때 객체란 현실의 물체를 의미하고 그 사이의 관계, 상호 작용을 프로그램으로 나타냄. 

사람의 사고와 가장 비슷하게 프로그래밍을 할 수 있는 개발 이론. 

 

- 객체 지향 장점

하나의 클래스를 바탕으로 서로 다른 상태의 인스턴스를 만들면서 다른 행동을 하게 할 수 있음 > 이로 인해 코드 재사용성이 높고 변경이 용이함. 

직관적으로 코드를 분석 할 수 있어 개발 속도가 향상됨. 

 

- 객체란?

객체(Object)는 우리 주위에 있는 모든 것들이 될 수 있다. 객체는 데이터 혹은 기능을 하나씩 가지고 있음. 

ex : 음식을 주문하는 경우, 연필로 주문서를 작성하고 사람이 주문서를 주고 받으며, 사람이 음식을 가져옴. 연필, 주문서, 사람, 음식등이 객체가 될 수 있고 이 객체들이 유기적으로 동작하게 하는 것이 객체 지향 프로그래밍. 

 

: 객체 vs 클래스

클래스는 설계도와 같은 것. 클래스를 토대로 여러 객체를 생성 가능함. 

JVM 힙(Heap) 메모리 영역에 생성되었는지 여부로 구별 가능.

 

: 인스턴스

객체가 메모리에 할당되어서 실제 메모리를 차지하는 것을 인스턴스라 함. 클래스로부터 새로운 객체를 만드는 과정을 인스턴스화라고 함. 

 

- 데이터 타입 종류

기본형(primary type), 참조형(reference type) 변수. 

기본형 : boolean, char, byte, short, int, long, float, double. 계산 가능. 변수 값 자체를 저장.

참조형 : 기본형을 제외한 나머지 타입. String, Array, 개인이 정의한 클래스. 메모리상에 객체가 있는 위치 저장. 

 

- 접근제어자(Access Modifier)

변수 또는 메소드의 접근 범위를 설정해주기 위해 사용하는 자바의 예약어.

public : 어떤 클래스에서도 접근 가능.

protected : 같은 패키지, 해당 클래스를 상속 받은 외부 패키지의 클래스에서 접근 가능.

default : 같은 패키지에서만 접근 가능.

private  : 해당 클래스에서만 접근 가능. 

 

- Wrapper 클래스

: 기본 자료형을 객체로 표현해야 할 때 사용하는 클래스 표현.

컬렉션에서 제네릭을 사용해야하는 경우(?)

null 값을 반환해야하는 경우 return type을 Wrapper 클래스를 사용하여 null을 반환 할 수 있게 함. 

byte = Byte / short = Short / long = Long / float = Float / double = Double / boolean = Boolean

int = Integer / char = Character 

 

- 추상클래스

abstract  키워드를 가진 추상 메소드를 하나 이상 가진 클래스.

추상 메소드는 구현부가 없이 선언부만 있어 완전하지 않은 메소드를 의미함.

완전하게 구현되지 않고 일부분만 구현되어있는 클래스이므로 직접 객체 생성 불가, 클래스를 상속 받아 추상 메소드를 오버라이딩하여 사용해야 함 > 자식 클래스에게 강제성을 부여함. 

 

- 인터페이스

일종의 추상클래스. 오직 추상메소드와 상수만 멤버로 가짐.

implements 키워드 사용해서 인터페이스를 구현함. 단일 상속 특징과 달리 다중 구현 가능. 

클래스와는 달리 인터페이스 간의 다중 상속이 가능함. 

사용이유 : 정형화된 틀 안에서 클래스를 개발 할 수 있음. 여러 개발자가 하나의 시스템을 개발 할 때 공통적인 클래스 개발 가능 = 구현 객체의 같은 동작을 보장하기 위한 목적. 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현 할 필요가 있는 경우. / 같은 인터페이스를 구현하는 서로 다른 클래스를 통해서 다형성을 구현 할 수 있음. 

 

- 추상클래스 vs 인터페이스

공통점 : new 연산자로 인스턴스 생성 불가능하여 스스로 객체가 될수 없음. 사용하기 위해서는 하위 클래스에서 확장 및 구현 해야 함. 객체 지향 프로그래밍의 다형성을 잘 보여줌. 

차이점 : 추상 클래스는 일반 메서드를 사용 가능 하지만, 인터페이스는 메서드 선언만 가능. 

추상 클래스의 목적은 추상 메소드를 자식 클래스가 구체화하여 그 기능을 확장하는데 목적이 있음. 하지만 인터페이스는 서로 관련이 없는 클래스에서 공통적으로 사용하는 방식이 필요하지만 기능을 각각 구현할 필요가 있는 경우에 사용. 

 

- 오버로딩 vs 오버라이딩

오버로딩(Overloading) : 같은 이름의 메소드를 매개변수의 타입이나 개수가 다르게 하여 여러 개 정의하는 것. return type과 접근 제어자는 영향을 주지 않음. 

오버라이딩(Overriding) : 상속에서 나온 개념. 상위(부모) 클래스의 메소드를 하위(자식) 클래스에서 재정의 하는 것. 

 

- 다형성

자바에서 다형성은 상속(오버라이딩)과 인터페이스를 통해서 이루어짐. 

하나의 객체를 다양한 타입으로 사용 할 수 있게 함. 코드의 재사용성, 개발자의 편의성, 유지보수의 편리함. 

ex) 키보드에서 esc와 enter는 누른다 라는 같은 동작을 통해 실행되지만 다른 취소, 입력이라는 다른 실행 목적을 가진다.

 

- 가비지 콜렉터

시스템에서 더 이상 사용하지 않는 동적 할당된 메모리 블록을 찾아 자동으로 다시 사용 가능한 자원으로 회수하는 것. 자바에서는 가비지 콜렉터가 백그라운드 서비스를 통해 자동으로 이루워짐으로 메모리 영역을 관리 할 필요가 없음.

 

- 자바의 메모리 구조

1. 메소드 영역 : static 변수, 전역변수, 코드에서 사용되는 class 정보들 저장.

2. 스택(stack) : 지역변수, 함수, 메소드 등이 저장되는 LIFO 방식의 메모리.

3. 힙(heap) : new 연산자를 통한 동적 할당된 객체들이 저장. 가비지 콜렉터에 의해 메모리 관리 됨. 

- out of memory 에러 메세지는 heap 메모리 부족으로 나타는 에러 메세지. 

 

- Call by Reference / Call by Value 

call by reference : 참조에 의한 호출. 메서드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 값 복사

call by value : 값에 의한 호출. 메서드 호출 시에 사용되는 인자의 메모리에 저장되어 있는 주소 복사 > 자바

 

 

- 배열과 컬렉션 차이점?

배열은 하나의 자료형만 저장이 가능, 고정된 크기.

컬렉션은 복수의 자료형 저장 가능, 가변적 크기.

 

 

- 컬렉션 (Collection) 

다수의 데이터를 다루는데 표준화된 클래스들을 자료구조를 직접 구현하지 않고 편하게 사용 가능 함.

배열과 다르게 객체를 보관하기 위한 공간을 미리 정의하지 않아도 됨으로 객체의 수를 동적으로 할당 가능하므로 효율성 증대.

 

- 컬렉션 대표 인터페이스

List : 순서 있는 데이터의 집합. 데이터 중복 허용

+ ArrayList : 단방향 포인터 구조. 각 데이터에 대한 인덱스를 가짐. 데이터 검색에 적합. 데이터의 삽입, 삭제 시 해당 데이터 이후 모든 데이터가 복사 됨으로 삽입, 삭제가 번번한 데이터에는 부적합. 

+ LinkedList : 양방향 포인터 구조. 데이터의 삽입, 삭제 시 해당 노드의 주소지만 바꾸면 되므로 삽입, 삭제가 빈번한 데이터에 적합. 처음부터 노드를 순회하므로 검색에는 부적합. 

+ Vector : 무거워서 잘 쓰지 않음. 

 

Set : 순서를 유지하지 않는 데이터 집합. 중복 허용하지 않음. 

+ HashSet : 저장 순서를 유지하지 않는 데이터 집합. 해시 알고리즘 사용. 검색 속도 빠름. 

+ TreeSet : 데이터가 정렬된 상태로 저장되는 이진 탐색 트리 형태로 요소 저장. 

 

Map : 키(key)와 값(value)의 쌍으로 이루어진 데이터 집합. 키는 중복을 허용하지 않음. 순서 유지되지 않음.

+ HashMap 

+ TreeMap

+ HashTable ..

 

- Stack

: LIFO(Last In First Out), 후입선출 구조. 

push()를 이용한 데이터 입력, pop()을 이용한 데이터 출력.

 

- Queue

 : FIFO(First In First Out), 선입선출 구조.

 

- Annotation

자바 코드에 주석처럼 달아서 클래스에 특수한 의미를 부여하거나 기능을 주입 할 수 있은 인터페이스. 

JDK에 내장 되어있거나, 어노테이션에 대한 정보를 나타내거나 개발자가 직접 만들 수 있음.

@Override가 대표적인 어노테이션. 

 

- final

: 초기값 저장시 최종적인 값이 되어서 프로그램 실행 중 수정 할 수 없는 필드. 

+ final class : 다른 클래스에서 상속하지 못하는 클래스.

+ final method : 다른 메소드에서 오버라이딩하지 못하는 메소드.

+ final variable : 변하지 않는 상수값이 되어 새로 할당할 수 없는 변수.

+ static final : 상수. 불변의 값. 

 

- 정적 멤버 (static)

클래스가 로딩 될 때 메모리 공간을 할당하는데 처음 설정된 메모리 공간이 변하지 않음을 의미. 

객체를 생성하지 않고도 사용할수 있는 필드와 메소드.

객체마다 가지고 있을 필요성이 없는 공용적인 데이터라면 정적 필드로 선언함. 

객체 생성을 하지 않고 사용 할 수 있기 때문에 인스턴스 필드, 인스턴스 메소드를 내부에서 사용 할 수 없음 = 이런 경우에 따라서 static을 붙이거나 붙이지 않거나 구분함. 

 

- String vs StringBuffer vs StringBuilder 

String은 new 연산자를 통해 생성되면 인스턴스 메모리 공간이 절대 변하지 않으므로 +, concat과 같은 연산시 메모리의 내용이 변하는 것이 아니라 새로운 String 인스턴스가 생성됨. 이렇게 새로운 문자여링 만들어지면 기본의 문자열은 가비지 콜렉터에 의해 제거되야 함. 문자열 연산이 많아지는 경우 성능이 떨어짐. 하지만 불변하기 때문에 조회가 빠르고 멀티스레드 환경에서 동기화를 신경 쓸 필요 없음. 

 

StringBuffer와 StringBuilder는 String과 다르게 클래스는 한 번만 만들고 메모리의 값을 변경시켜서 문자열을 변경함. 그러므로 문자열 연산이 자주 있을 때 사용하면 좋음. 

StringBuffer은 멀티 스레드 환경에서 synchronize 키워드가 가능하므로 동기화가 가능하다. StringBuilder는 동기화를 지원하지 않기 때문에 멀티 스레드 환경에서 적합하지 않음. 

 

- JDBC 

자바 언어를 통해 데이터베이스에 접근할 수 있는 프로그래밍

 

- 제너릭 Generic

클래스의 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법.

코드의 안정성과 재사용을 위한 기능. 객체의 타입을 컴파일 시에 체크하기 때문에 객체의 타입 안전성을 높이고 형변환의 번거로움을 줄여준다. 

ex) ArrayList<String>과 같은 명시적인 표현을 통해서 ArrayList 객체 내부에 어떤 형태의 클래스가 있는지 확인 가능하므로 불필요한 형 변환 코드 사용을 줄이고 오류를 줄일 수 있음. 제네릭이 존재하지 않았다면 StringArrayList, IntegerArrayList와 같이 각각의 데이터 타입을 제공하는 ArrayList 클래스가 필요 했을 것. 코드의 재사용이 용이하다. 

 

- 프로세스와 스레드의 차이점?

프로세스 : 실행 중인 프로그램, 자원 + 스레드

스레드 : 프로세스 내에서 실제 작업을 수행하는 단위 = 독립적인 실행 단위. 모든 프로세스는 하나 이상의 스레드를 가짐.

다중 스레드 : 하나의 프로세스(프로그램)에 하나 이상의 스레드를 생성해서 실행하는 것. 

 

- 스레드 장단점

장점 : 빠른 프로세스를 생성 가능. 적은 메모리 사용. 쉬운 정보 공유. 

단점 : 교착 상태에 빠질 수 있음.

+ 교착 상태 : 다중 프로그래밍 체제에서 하나 또는 그 이상의 프로세스가 수행할 수 없는 어떤 특정 시간을 기다리고 있는 상태

 

- 멀티 스레드의 장단점?

두가지 이상의 작업을 동시에 실행 할 수 있어 자원을 효율적으로 이용 할 수 있음. 

 

- 멀티 스레드 구현하는 법?

1. Thread 클래스 상속. 단일 상속만 가능.

2. Runnablle 인터페이스 상속. 다중 상속 가능. 

 

- 멀티 스레드 환경에서의 개발

 

질문들을 정리하다 보니 내가 부족한 부분들이 더 잘 보인다. 

정리와 기록만이 살길.

300x250

댓글