💡 Interface 와 Abstract 의 차이점은 무엇인가요?
👉 Interface
- 추상 클래스
- 오직 추상메소드와 상수만 멤버로 가짐
- Implements 키워드 사용
- 상속 관계가 없는 클래스간의 서로 공동되는 로직을 구현해 쓸 수 있도록 해줌
- Extends 는 하나의 클래스만 상속 가능하지만, Implements는 다중 상속이 가능함!
👉 Abstract
- 추상메소드를 하나 이상 가지는 클래스
- 자신의 생성자로 객체 생성이 블가능하며, 하위 클래스를 참조해 상위 클래스의 객체를 생성해야함
- 하위 클래스를 제어하기 위해 사용됨
💬 공통점
- new 연산자로 인스턴스(객체) 생성이 불가능
- 프로토타입만 있는 메서드를 가짐
- 사용하기 위해서는 하위 클래스에서 확장/구현해야함
💬 차이점
- 사용하는 키워드가 다름
- Abstract는 일반 메서드를 사용할 수 있지만, Interface는 메서드 선언만 가능함
💡 Interface 는 주로 어떤 경우 사용한다고 생각하나요?
협업 상황이나, 다중 상속이 필요한 경우 사용하면 좋다고 생각합니다.
💡 String / StringBuilder / StringBuffer 에 대해 설명해주세요.
👉 String
- String 객체는 한번 값이 할당되면 그 공간이 변하지 않음
- 값을 바꿀 때, Heap에 새로운 메모리를 사용하게 되고, 참조되는 메모리 주소만 바꿔주는 방식
- 불변성으로 인해 멀티쓰레스 환경에서의 안정성, thread-safe가 보장됨 !
StringBuilder와 StringBuffer는 String 과는 다르게 클래스를 한 번만 생성하고, 메모리 값을 변경시켜서 문자열을 변경한다. 따라서 문자열 연산이 자주 있는 경우 사용하면 좋다.
👉 StringBuilder
- 동기화를 지원하지 않으므로 thread-safe가 보장되지 X
- 하지만 동기화를 고려하지 않는 만큼, 단일 스레드에서의 성능은 StringBuffer 보다 뛰어남
👉 StringBuffer
- 동기화를 지원하므로 thread-safe가 보장됨
💡 String 문자열 할당 시, " " 와 new 방식의 차이점은 무엇인가요?
- string = "abc" → 리터럴 할당 방식 → Heap 내부의 String Constant Pool 영역에 저장
- string = new String("abc") → 객체 할당 방식 → Heap 메모리 영역에 저장
→ 저장하는 주소값이 다르다!
💡 Error 와 Exception 의 차이점은 무엇인가요?
👉 Error
- 실행 중 일어날 수 있는 치명적 오류
- 컴파일 시점에 체크할 수 없고, 오류 발생 시 프로그램은 비정상 종료됨
- 예측 불가능한 UncheckedException에 속함
👉 Exception
- Error 보다 비교적 경미한 오류
- try-catch 구문을 이용해 프로그램의 비정상적인 종료를 막을 수 있음
💡 Java 에서의 예외 처리 방법은 무엇이 있나요?
자바에서의 예외 처리는, 프로그램 실행 중 발생 가능한 예기치 못한 예외 발생에 대비한 코드를 작성하는 것을 뜻함.
예외처리를 해줌으로써 예외 발생으로 인한 프로그램 비정상 종료를 방지해 실행상태를 유지할 수 있음.
크게 세 가지 방법이 있음.
- 예외가 발생한 메소드 내에서 직접 처리하는 방법 → try-catch-finally
- 예외가 발생한 메소드를 호출한 곳으로 예외 객체를 넘겨주는 방법 → throws
- 사용자 정의 예외를 생성해서 처리하는 방법 → throw
↓ 예외 처리 관련 정리가 잘 된 블로그
https://dev-coco.tistory.com/18
💡 Java 의 컬렉션 프레임워크에 대해 설명해주세요.
List, Set, Map, Stack, Queue 등이 있다.
다수의 데이터를 쉽고 효과적으로 관리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다.
👉 List
- 순서가 있는 데이터 집합
- 데이터의 중복이 허용됨
- 대표적 구현체 : ArrayList, LinkedList 등
👉 Set
- 순서가 없는 데이터 집합
- 데이터 중복 허용 X
- 대표적 구현체 : HashSet, LinkedHashSet, TreeSet 등
👉 Map
- 키와 값 하나의 쌍으로 존재, 순서가 없는 데이터 집합
- 키를 기준으로 중복 허용 X
- (key 의 순서를 보장하기 위해서는 LinkedHashMap 을 사용)
- 대표적 구현체 : HashMap, TreeMap, HashTable, Properties 등
👉 Stack
- 직접 new 키워드로 사용 가능
👉 Queue
- LinkedList 에 new 키워드를 적용해 사용 가능
💡 ArrayList 와 LinkedList 에 대해 설명해주세요.
👉 ArrayList
- 원하는 데이터에 무작위로 접근 가능
- 리스트 크기가 제한되어 있고, 리스트 크기 재조정은 쉽지 않다,,
- 데이터의 추가/삭제를 위해서는 임시 배열을 생성해야 하므로 소요 시간이 길다..
👉 LinkedList
- 무작위 접근이 불가능하며, 순차 접근이 가능함
- 리스트 크기에 관계 없이 데이터 추가 가능
- 데이터 추가를 위해 새로운 노드를 생성해 연결하기 때문에 추가/삭제에 소요되는 시간이 짧다.
💡 제네릭이란 무엇이며 왜 사용하나요?
- 제네릭은 데이터 타입을 하나로 지정하지 않고, 사용할때마다 범용적이고 포괄적으로 지정한다는 의미
- 제네릭 타입을 사용함으로써 잘못된 타입을 사용할지 모른다는 문제를 컴파일 과정에서 제거할 수 있어서, 사전에 에러 방지가 가능함
💡 스레드(thread)란 무엇인가요?
- 프로세스 내에서 실제로 작업을 수행하는 주체를 의미
- 모든 프로세스에는 작업을 수행하기 위해 한 개 이상의 스레드가 존재
- 두 개 이상의 스레드를 가지는 프로세스를 multi-threaded process 라고함
→ 하나의 응용 프로그램을 여러 개의 스레드로 구성하고, 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것.
→ 웹 서버가 대표적인 멀티 스레드 응용 프로그램!
=> Java Thread 란? => 일반 스레드와 거의 차이가 없고, JVM이 운영체제 역할을 한다. 자바에는 프로세스가 존재하지 않고 스레드만 존재하며, 자바 스레드는 JVM에 의해 스케줄링 되는 실행 단위 코드 블록이다.
=> thread safe란? => 멀티 스레드 프로그래밍에서 일반적으로 어떤 변수나 함수, 혹은 객체에 여러 스레드로부터 동시에 접근이 이루어 지더라도 프로그램을 실행하는데 문제가 없음을 의미함
💡 Primitive type 과 Reference type 에 대해 설명해주세요.
👉 Primitive type
- 변수에 값 자체를 저장 (ex. 정수형, 실수형, 문자형, 논리형)
- Wrapper Class 를 통해 객체로 변환 가능
👉 Reference type
- 메모리상에 객체가 있는 위치를 저장
- (ex. Class, Interface, Array 등)
💡 Stack 과 Queue!
👉 Stack
- LIFO, 후입선출
- push(); 로 데이터 입력, pop(); 으로 데이터 출력
👉 Queue
- FIFO, 선입선출
- enQueue(); 로 데이터 입력, deQueue(); 로 데이터 출력
👉 변수 명명법에 무엇이 있나요?
- 스네이크 표기법 ex. tech_interview
- 카멜 표기법 ex. techInterview
- 파스칼 표기법 ex. TechInterview
- 헝가리언 표기법 ex. strTechInterview
💡 call by value 와 call by reference 에 대해 설명해주세요.
대표적으로 사용되는 메소드의 인자를 전달하는 두 가지 방법이다.
👉 Call by Value
- 값에 의한 전달
- 실제값(caller)과 인수로 전달한 값(callee)이 메모리 측면에서 실제 서로 동일하지 않고, 값을 복사해 전달하는 방식
- 이 방식으로 메소드 인자를 전달하는 경우, 메소드 내의 값을 수정하면 실제 값이 변경되는게 아니라 해당 값을 복사해 전달하는 것이라고 생각하면 된다.
👉 Call by Reference
- 참조에 의한 전달
- 호출자(caller)와 수신자(callee)에 전달한 값이 동일하다.
- 즉, 메소드 내부에서 값을 수정하면 실제 원본 값도 변경된다.
👉 Java의 경우 항상 call by value !
자바는 객체를 메서드로 넘길 때 참조하는 지역변수의 실제 주소를 넘기는게 아니라, 해당 지역변수가 가리키는 Heap 영역의 객체를 가리키는 새로운 지역변수를 생성해서 이를 통해 같은 객체를 가리키도록 하는 방식이다.
어렵다.. 더 자세한 내용을 잘 설명한 블로그는 아래를 참고하면 좋을 것 같다.
https://hoons-dev.tistory.com/76
💡 Lambda 란 무엇인가요?
자바8부터 추가된 기능으로, 익명 클래스 표현식이다.
- ex. (파라미터) -> {몸체}
- 장점 → 코드 라인수 감소, 병렬 프로그래밍, 가독성 향상
- 단점 → 재귀 람다 호출이 까다로움, 클로저 지원이 안됨
'for technical interview' 카테고리의 다른 글
개발자 기술면접(Java) : Java(1) (0) | 2023.05.17 |
---|
댓글