@@
예상 질문 질의응답 모음
Java 면접
Spring 면접

■ 객체지향이란? 

프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다

 

■ 객체지향 프로그래밍의 장점

코드 재사용이 용이 => 남이 만든 클래스를 가져와서 사용가능
유지보수가 쉬움 => 절차지향 프로그래밍은 일일이 찾아 수정해야하는 반면에 해당하는 부분만 수정하면됨
대형 프로젝트에 적합 => 클래스 단위로 모듈화 시켜서 개발가능

 

■ 객체 지향적 설계 원칙

SRP(Single Responsibility Principle) : 단일 책임 원칙 클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 한다.
OCP(Open-Closed Principle) : 개방-폐쇄 원칙 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.
LSP(Liskov Substitution Principle) : 리스코프 치환 원칙 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
ISP(Interface Segregation Principle) : 인터페이스 분리 원칙 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
DIP(Dependency Inversion Prinsiple) : 의존 역전 원칙 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.

 

■ 객체지향 프로그래밍 키워드

추상화 : 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것
캡슐화 : 기능과 특성의 모음을 "클래스"라는 "캡슐"에 넣어서 분류해서 넣는 이 캡슐화다.
상속 :상속은 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있게 하는 것이다. 다중 상속은 불가하다.
다형성 : 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것이다.즉, 오버라이딩(Overriding), 오버로딩(Overloading)이 가능하다는 얘기다.
오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는 것.
오버로딩 : 같은 이름의 함수를 여러 개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.

 

■ 제네릭

제네릭(Generic)은 클래스 내부에서 지정하는 것이 아닌 외부에서 사용자에 의해 지정되는 것을 의미한다.

■ 컬렉션 클래스에서 제네릭을 사용하는 이유를 설명하세요

컬렉션 클래스에 저장되는 인스턴스 타입을 제한하여 런타임에 발생할 수 있는 잠재적인 모든 예외를 컴파일 타임에 잡아 낼 수 있어서 사용합니다.

 

■ 데드락 개념, 해결방법

둘 이상의 스레드가 lock을 획득하기 위해 기다리는데, 이 lock을 잡고 있는 스레드도 똑같이 다른 lock을 기다리면서 서로 블락상태에 놓이는 것을 말한다
우선순위를 선정해 자원을 선점하도록 하는 것과 공유 불가능한 상호 배제 조건을 제거하는 것이 있다.

 

■ JVM 역할

자바 컴파일러가 .java 파일을 컴파일 하면, .class라는 자바 바이트코드로 변환시켜줍니다. 이때 바이트 코드가 기계어가 아니기 때문에 운영체제에서 바로 실행을 못하는데 이때 운영체제가 이해할 수 있도록 해석해주는 것이 JVM입니다.
컴파일 -> 바이트 코드 -> 기계어 이런식으로 중간에 바이트 코드 과정이 있기 때문에 속도와 메모리에서 단점이 될 수 있다.
JVM을 사용하면 운영체제에 상관없이 같은 코드를 사용할 수 있습니다.

 

■ Object

객체(Object)란, 소프트웨어 세계에 구현할 대상
클래스의 인스턴스 라고도 부른다. OOP 관점에서 클래스의 타입으로 선언되었을 때 객체라고 부른다.
객체는 현실 세계에 가깝고, 인스턴스는 소프트웨어 세계에 가깝다.

 

■ 클래스

연관되어 있는 변수와 메서드의 집합
클래스란, 객체를 만들어 내기 위한 설계도 혹은 틀

 

■ 인스턴스

객체를 소프트웨어에 실체화 하면 그것을 인스턴스 라고 부른다.
OOP의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 인스턴스 라고 부른다.
객체는 클래스의 인스턴스이다.

 

■ 인스턴스화

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate) 라고 한다.
어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance) 라고 한다.

 

■ String, StringBuffer, StringBuilder 차이점이 무엇인가요

첫번째 차이점은 String은 불변하다는 특징을 가지고 있어서 수정을 하지못하고 새로운 String 인스턴스가 생성되고 전에 있던 String은 GC에 의해 사라지게 된다. 그래서 좋은 성능을 기대하기는 힘들다. (String 불변, StringBuffer, StringBuilder 가변)
StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드 환경에서 안전하다는 점(thread-safe) 입니다. 참고로 String도 불변성을 가지기때문에 마찬가지로 멀티쓰레드 환경에서의 안정성(thread-safe)을 가지고 있습니다.
반대로 StringBuilder는 동기화를 지원하지 않기때문에 멀티쓰레드 환경에서 사용하는 것은 적합하지 않지만 동기화를 고려하지 않는 만큼 단일쓰레드에서의 성능은 StringBuffer 보다 뛰어납니다

 

■ 프로세스란?

운영체제로부터 시스템 자원을 할당받는 작업의 단위
하나의 프로세스는 크게 코드영역(code), 데이터 영역(date), 스택 영역(stack), 힙 영역(heap) 4가지로 이루어져 있습니다.

■ 스레드란?

한 프로세스 내에서 동작되는 여러 실행의 흐름, 프로세스 하나에 자원을 공유하면서 일련의 과정을 여러 개를 동시에 실행 시킬 수 있다.
멀티프로세스
장점 : 안정성이 높다 (독립된 구조기 때문에)
단점 : 여러 프로세스를 왔다갔다 하는 컨텍스트 스위칭으로 인한 성능저하
멀티쓰레드
장점 : 응답시간 단축, 자원소모 감소
단점 : 미묘한 시간차나 변수 공유함으로써 오류 발생 가능

■ 자바 람다 관련 함수형 프로그래밍

함수형 프로그래밍은 명령형이 아닌 선언적 방식으로 구현되며 흐름 제어를 명시적으로 기술하지 않고 프로그램 로직이 표현된다는 것을 의미한다.
람다는 함수의 구조로 되어있고 -> 와 같이 화살표 형태의 기호를 이용해 매개변수를 함수 바디로 전달하는 형태

@@ TODO 명령형 vs 선언적 방식의 구현

■ 가비지컬렉션이란?

C/C++ 언어와 달리 자바는 개발자가 명시적으로 객체를 해제할 필요가 없습니다. 자바 언어의 큰 장점이기도 합니다. 사용하지 않는 객체는 메모리에서 삭제하는 작업을 Gargabe Collection(GC)라고 부르며 JVM에서 GC를 수행합니다.

■ 자바 컬렉션 List, set, map에 대한 설명

List : 순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다.
Set : 순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다.
Map : 키, 값으로 이루어진 데이터의 집합으로, 순서는 유지되지 않으며 키의 중복을 허용하지 않으나 값의 중복은 허용한다.

■ 테스트 코드에 대한 설명??

단위테스트를 사용하면 좋은점은 개발 초기에 문제를 발견할 수 있다.

'Java' 카테고리의 다른 글

logger를 사용하자  (0) 2023.02.16
wildfly jboss 서버 아이디 이름 확인  (0) 2022.01.20
Spring Batch embedded tomcat  (0) 2020.07.28
java.lang.NoClassDefFoundError: sun/misc/BASE64Encoder  (0) 2020.01.28
Map 선언 초기화 동시에  (0) 2019.10.24

+ Recent posts