2023. 11. 18. 20:08ㆍStudy/Computer Science
[중요]▶ 객체 지향 프로그래밍의 키워드
✅ 추상화
공통적인 기능이나 속성을 묶어서 이름을 붙인 것
✅ 캡슐화
서로 연관있는 속성이나 기능들을 하나로 묶어 데이터를 외부로 부터 보호하는 것
✅ 상속
객체가 다른 객체를 상속받으면, 그 객체의 요소들을 사용할 수 있는 것
✅ 다형성
하나의 타입에 여러 개의 타입을 대입해서 사용할 수 있는 것
▶ 제네릭이 무엇인가요?
✔ 클래스 내부에서 지정하는 것이 아니라, 외부에서 지정하도록 하는 것
▶ 제네릭을 사용하는 이유는?
✔ 컴파일 시점에 오류를 발생시켜, 런타임 시점에 오류가 발생하는 것을 사전에 차단할 수 있음
▶ 자바의 모든 클래스는 Object 클래스를 상속받습니다. 그리고 Object 클래스에는 equals() 와 hashCode() 라는 메소드가 선언되어 있습니다. 이 메소드들은 각각 어떤 역할일까요? 이 둘의 차이점은 무엇일까요?
✅ equals()
- 두 객체가 논리적으로 같은지 확인하는데 사용
✅ hashCode()
- 객체의 해시 코드 값을 반환하는데 사용
✔ 두 메서드는 함께 사용되어야 합니다. 즉, equals() 메서드를 오버라이드하여 두 객체의 동등성을 정의하면, hashCode() 메서드도 함께 오버라이드하여 동등한 객체는 같은 해시 코드 값을 반환하도록 해야 합니다. 이렇게 해야 HashMap과 같은 해시 기반 컬렉션에서 올바르게 작동합니다.
▶ 스프링이란 무엇인가요?
✔ 자바 플랫폼을 위한 오픈소스 프레임워크로, 웹 개발할 때 많이 사용하는 프레임워크입니다.
✔ 웹 개발에 필요한 다양한 기능들을 종합적으로 제공합니다. 예를들어, Spring MVC, Spring Security, Spring DI, Spring AOP 등이 있습니다.
▶ 스프링은 왜 생긴 것인가?
✔ 스프링 이전에 EJB라는 기술을 사용했으나, 너무 무거운데다 불편한 점이 많아 '경량화'된 Java 엔터프라이즈용 Framework인 스프링이 나오게 되었습니다.
[기출]▶ 스프링 AOP가 무엇인가요?
✔ AOP란 Aspect Of Programming의 악자로, 관점 지향 프로그래밍을 뜻합니다.
✔ 서비스에서 주요 기능과 부가 기능으로 나누고, 부가 기능을 모듈화하는 방법입니다. 이를 통해 소프트웨어 개발에서 공통적으로 사용되는 부분을 분리하여 관리할 수 있습니다.
[중요]▶ 스프링 DI에 대해 아는대로 말씀해주세요
✔ Dependency Injection의 약자로, 객체의 의존성을 프레임워크가 관리하는 설계 패턴
✔ DI는 생성자 주입 방식, setter 주입 방식, 필드 주입 방식이 있습니다.
✔ 객체간의 결합도를 낮출 수 있습니다.
▶ @Autowired vs @Resource vs @Inject
✔ 의존 관계를 자동으로 연결해주는 어노테이션입니다.
✅ Autowired
- 스프링에서 지원
- 타입에 맞춰 연결
✅ Inject
- 자바에서 지원
- 타입에 맞춰 연결
✅ Resource
- 자바에서 지원
- 이름에 맞춰 연결
추가적으로, @Autowried나 @Inject도 @Qualifier 어노테이션을 이용하면, 타입이외의 방법으로 의존성을 연결할 수 있다.
▶ IoC가 무엇인가요?
✔ Inversion of Control의 약자로, 제어의 역전을 뜻합니다.
✔ 제어의 권한이 개발자에게 있지 않고, 프레임워크에 있는 것을 뜻합니다.
✔ 이렇게 함으로써 개발자는 비즈니스 로직 개발에 좀 더 전념할 수 있습니다.
▶ Bean이란 ?
✔ Spring IoC 컨테이너가 관리하는 자바 객체를 빈이라고 합니다.
▶ 스프링 필터와 인터셉터의 차이점이 무엇일까요?
✔ 호출되는 시점의 차이가 있습니다.
✔ 필터는 dispatcherServelt 진입 전에 실행되는 Servlet이고, 인터셉터는 Controller 진입 직전에 실행되는 Servlet입니다.
✔ filter는 인코딩 변환 처리, XSS 방어 등의 요청에 대한 처리를 주로 담당함
✔ Interceptor은 로그인 체크, 권한체크, 로그확인 등의 업무를 처리
▶ Servlet이란 무엇인가요?
✔ 웹 페이지를 동적으로 생성하거나, 클라이언트로부터 정보를 받아 처리하는 등 웹 서비스를 제공하는 용도로 사용되는 자바 클래스입니다.
✔ 자바를 사용해서 웹을 만들기 위해 필요한 기술입니다.
✔ 하지만, Servlet 같은 경우 html을 생성하기 어렵습니다. 이를 위해, JSP 같은 기술이 나오게 되었습니다.
▶DTO, DAO, VO에 대해 각각 설명해주세요
✅ DTO(Data Transfer Object)
데이터를 전송하기 위한 객체
✅ DAO(Data Access Object)
데이터베이스에 접근하기 위한 객체
✅ VO(Value Obejct)
비즈니스 도메인을 모델링한 객체
▶ 클래스란?
✔ 필드와 메서드로 이루어져 있으며, 객체를 생성하기 위한 설계 도면, 틀입니다.
[중요]▶ String vs StringBuffer vs StringBuilder
✔ String
변경이 불가능합니다. 만약, 변경하게 된다면 메모리에 다시 생성된 문자열이 올라가게 됩니다. 이는 성능 문제를 야기시킬 수 있습니다.
✔ StringBuffer
변경이 가능하고, 동기화를 지원합니다. 이에 따라, thread-safe 하다는 특징이 있습니다.
✔ StringBuilder
변경이 가능하고, 동기화를 지원하지 않습니다. 이에 따라, thread-not safe 하다는 특징이 있습니다.
[중요]▶ MVC란 무엇입니까?
✔ 소프트웨어 엔지니어링에서 사용되는 디자인 설계 패턴중 하나입니다.
✔ 애플리케이션 로직을 Model, View, Controller 3개의 역할로 분리하여 구현하는 방법론
▶ Spring MVC의 진행 방식은?
▶ OAuth2.0란?
✔ 타사의 사이트에 대한 접근 권한을 얻고 그 권한을 이용하여 개발할 수 있도록 도와주는 프레임워크다. 구글, 카카오, 네이버 등과 같은 사이트에서 로그인을 하면 직접 구현한 사이트에서도 로그인 인증을 받을 수 있도록 되는 구조다.
▶ POJO란?
✔ Plain Old Java Object 약자로, 순수한 자바 객체를 의미합니다.
✔ 스프링의 핵심 원칙 중 하나로 채택되었으며, 이를 통해 개발자는 비즈니스 로직에 집중하고 테스트가 용이한 애플리케이션을 개발할 수 있게 되었습니다.
▶ ORM이란?
✔ Object Relational Mapping의 약자로, 관계형 데이터베이스를 객체로 매핑하는 것을 뜻합니다.
✔ 쿼리를 작성할 필요가 없기 때문에, 비즈니스 로직에만 집중할 수 있습니다.
▶ JPA란?
✔ ORM을 위해 자바에서 제공하는 API
✔ JPA인터페이스 이기 때문에, 사용하기 위해서는 구현체가 필요합니다. 대표적으로, 하이버네이트가 이에 해당합니다.
▶ Java의 컴파일 과정에 대해 설명해주세요
1️⃣ Java 소스 코드 작성
2️⃣ 컴파일 : 작성된 소스코드는 JAVA 컴파일러(javac)에 의해 컴파일되어 바이트코드(.class 파일)로 변환됩니다. 이 과정에서 문법 오류가 있는 경우, 컴파일러는 오류 메세지를 표시하고 프로세스를 중단합니다.
3️⃣ 실행: 변환된 바이트 코드는 JVM 위에서 실행됩니다. JVM은 바이트코드를 기계어로 변환하여 실제 하드웨어가 이해하고 실행할 수 있도록 합니다. 이 과정을 인터프리팅이라고 부릅니다.
[중요]▶ JVM의 역할에 대해 설명해주세요
✔ Java 바이트 코드만 있으면, 자바 프로그램을 어느 환경에서든 실행할 수 있다. 대신 실행 시키는 환경은 JVM이 설치되어 있어야 한다.
✔ Garbage Collection을 통해서 메모리 관리를 할 수 있습니다. 이로 인해 개발자는 자원에 관해서 신경쓰지 않고 개발에만 전념할 수 있습니다.
[중요]▶ GC에 대해 아는 대로 설명해주세요
✅ GC의 대상이 되는 경우
- 객체가 NULL인 경우
- 블럭 실행 종료 후, 블럭 안에서 생성된 객체
- 부모 객체가 NULL인 경우, 포함하는 자식 객체
✅ 장점과 단점
- 장점 : 메모리 누수 방지, 해제된 메모리 접근 방지, 해제한 메모리를 다시 이중 해제하는 것 방지
- 단점 : 개발자가 언제 메모리를 해제하는지 알 수 없음, 오버헤드 발생
✅ 알고리즘
- Reference Counting
- Mark And Sweep
[중요]▶ 오버라이딩과 오버로딩에 대해서 설명해주세요
✔ 오버라이딩 : 부모 클래스에서 정의된 메소드를 자식 클래스에서 재정의하여 사용하는 것을 오버라이딩이라고 한다.
✔ 오버로딩 : 같은 이름의 메소드를 여러개 정의하는 것을 말합니다. 이때 메소드 이름은 같지만, 매개변수의 타입이나 개수, 순서가 다르게 정의됩니다. 이를 통해 같은 기능을 하는 메소드이지만, 다른 종류의 매개변수를 받아 처리할 수 있도록 합니다.
[중요]▶ 객체지향 프로그래밍에 대해 설명해주세요
✔ 필드와 메소드로 이루어진 객체들 간의 유기적인 상호작용을 하도록 프로그램을 설계하는 것을 객체지향 프로그래밍이라고 합니다. 객체 지향의 대표적인 특징으로는 추상화, 상속, 다형성, 캡슐화가 있습니다.
[중요]▶ Spring Framework에 대해서 설명해주세요
✔ 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크입니다. 엔터프라이즈급 애플리케이션을 개발하는 데 필요한 광범위한 지원을 제공합니다.
✅ 특징
- 제어의 역전
- 의존성 주입
- AOP
- Spring MVC
- JPA, JDBC 등의 데이터 접근 기술뿐만 아니라 다양한 서비스를 지원
▶ Java에서의 스레드와 멀티스레딩에 대해 알려주세요
✔ 스레드 : 스레드는 프로세스 내에서 실행되는 흐름의 단위입니다.
✔ 멀티 스레딩 : 한 프로세스 내에서 두 개 이상의 스레드를 동시에 실행하는 것을 의미합니다. 멀티스레드를 사용하면 CPU 사용률을 최적화하고, 사용자 응답성을 향상시키며, 프로그램의 구조를 간결하게 만드는 등의 이점을 얻을 수 있습니다.
Java에서는 Thread 클래스를 상속받거나 Runnable 인터페이스를 구현함으로써 스레드를 생성할 수 있습니다. 이후 start() 메서드를 호출하여 스레드를 실행시킵니다. 멀티스레딩 같은 경우 동기화 문제가 발생할 수 있으니 syncronized 키워드를 사용하여 이를 해결할 수 있습니다.
▶ JNI에 대해 아는 대로 설명해주세요
✔ 자바와 네이티브 애플리케이션(즉, 특정 하드웨어 플랫폼에 최적화된 c,c++ 등의 언어로 작성된 애플리케이션) 간의 상호 작용을 가능하게 하는 프로그래밍 프레임워크입니다.
✔ JNI를 사용하면 자바 코드에서 C, C++ 같은 네이티브 메소드를 호출할 수 있고, 반대로 네이티브 코드에서 자바 메소드를 호출하거나 자바 객체를 조작하는 것도 가능합니다.
▶ Java에서의 직렬화와 역직렬화에 대해 설명해주세요
✔ 직렬화 : 객체의 상태를 바이트 스트림으로 변환하는 과정을 말합니다. 변환된 바이트 스트림은 네트워크를 통해 전송하거나 파일에 저장할 수 있습니다.
✔ 역직렬화 : 바이트 스트림을 다시 원래의 객체로 복원하는 과정을 말합니다.
▶ Java에서 제공하는 원시 타입들에 무엇이 있고, 각각 몇 바이트를 차지하나요?
✔ byte(1), short(2), int(4), long(8), float(4), double(8), char(2), boolean(1)
▶ JPA vs MyBatis
✔ 두 기술 모두 데이터 베이스 접근 기술입니다.
🔹JPA
- 객체 지향적으로 데이터를 관리 가능
- 테이블이 아닌 객체에 집중할 수 있어 비즈니스 로직에 더 집중 가능
- JPA는 내부적으로 SQL를 생성하고 실행합니다. 이로인해 개발자는 SQL에 의존적인 개발에서 벗어날 수 있지만, 반대로 SQL 최적화 등 세밀한 조정이 필요한 경우에는 제약 될 수 잇음
🔹MyBatis
- 개발자가 직접 SQL를 작성할 수 있는 프레임워크
- SQL 쿼리와 자바 객체를 매핑해주는 역할
- SQL을 통해 세밀한 데이터 조작이 가능하고, 복잡한 쿼리를 작성하는 데 유리합니다.
▶ try-with-resources에 대해서 설명해주세요
✔ Java 7부터 도입된 기능으로, 자원을 안전하게 관리하기 위해 사용됩니다. 이 기능을 사용하면, try문을 사용하여 자원을 할당하고, 자동으로 자원을 해제할 수 있습니다.
[중요]▶ 컬렉션 프레임워크의 종류에 대해 각각 설명해주세요 (List, Set, Map)
✔ List : 중복 가능하고 데이터 순서를 보장함
✔ Set : 중복 불가능하고 데이터 순서를 보장하지 않음
✔ Map : key 값이 같으면 중복 불가능하고 데이터의 순서를 보장하지 않음. 단 value 값은 중복 가능
[중요]▶추상 클래스와 인터페이스에 대해서 설명해주시고, 차이점에 대해 설명해주세요
✅ 추상 클래스
- 하나 이상의 추상 메소드를 포함한 클래스
- 추상 클래스는 객체를 생성할 수 없으며, 하위 클래스가 추상 메소드를 구현하도록 강제
- 일반 메소드와 변수도 포함 가능
✅ 인터페이스
- 모든 메소드가 추상 메소드인 클래스
- 객체를 생성할 수 없으며, 클래스가 인터페이스를 구현하면 그 클래스는 인터페이스의 모든 메소드를 구현해야함
- 인터페이스는 상수만 포함 가능
✔ 차이점
- 클래스는 한 개의 추상 클래스만 상속받을 수 있지만, 인터페이스는 다중 상속이 가능
- 추상 클래스는 생성자를 가질 수 있지만, 인터페이스는 생성자를 가질 수 없음
- 추상 클래스는 일반 메소드와 변수를 포함할 수 있지만, 인터페이스는 추상 메소드와 상수만 포함할 수 있음
- [중요] 추상 클래스는 부모 클래스를 상속함으로써 기능을 재활용하고 확장시키는데 목적이 있다면, 인터페이스는 함수의 구현을 강제해서 구현한 객체들이 같은 동작을 하는 것을 보장하는 것에 목적이 있습니다.
▶ 객체 지향 설계 원칙에 대해 설명해주세요
✔ SRP(단일 책임 원칙) : 하나의 클래스는 하나의 책임만을 가져야 합니다.
✔ OCP(개방-폐쇄 원칙) : 확장에는 열려있고, 수정에는 닫혀있어야 합니다.
✔ LSP(리스코프 치환 원칙) : 자식 객체로 치환하여도, 프로그램이 원활하게 실행되어야 합니다.
✔ ISP(인터페이스 분리 원칙) : 하나의 일반적인 인터페이스보다는 여러개의 구체적인 인터페이스가 낫습니다
✔ DIP(의존 역전 법칙) : 구체적인 것에 의존하면 안 되고, 추상화 된 것에 의존해야 한다. 모듈간의 응집도를 낮춰준다(Loosing Coupling)
[기출]▶ OCP를 어떻게 하면 구현할 수 있는가?
✔ 추상화 클래스를 구성하고 이를 상속하여 확장시키는 관계로 구성하면 변경에는 닫히고, 추가에는 열려있는 프로그램을 만들 수 있다.
[중요]▶ 자바의 메모리 영역에 대해 설명해주세요
✔ 메소드 영역 : 클래스 정보, static 변수, 상수 등이 저장되는 곳입니다. JVM이 시작될 때 생성되며, 모든 스레드가 공유하는 영역입니다.
✔ 힙 영역 : new 연산자로 생성된 객체와 배열이 저장되는 곳입니다. 또한 GC가 동작하는 영역이기도 합니다. 모든 스레드가 공유하는 영역입니다.
✔ 스택 영역 : 메소드 호출시 마다 각각의 스택 프레임이 생성되며, 지역 변수, 매개변수, 연산 중 발생하는 임시 데이터 등이 저장되는 곳입니다.
✔ PC Resgister : 현재 실행중인 JVM 명령의 주소를 저장하는 곳입니다. 각 스레드마다 독립적으로 생성됩니다.
✔ Native Method 영역 : 자바외의 언어로 작성된 네이티브 메소드를 위한 메모리 영역입니다. 각 스레드마다 독립적으로 생성됩니다.
▶ 생성자에 대해 설명해주세요
✔ 객체가 생성될 때 호출되는 메서드입니다. 클래스 이름과 동일하게 정의되며, 리턴 타입을 명시하지 않습니다. 생성자는 객체의 초기화 작업을 담당하며, 주로 필드의 초기값을 설정하는 데 사용됩니다.
▶ Wrapper Class란 무엇이며, Boxing과 UnBoxing은 무엇인지 설명해주세요
✔ Wrapper 클래스는 자바의 기본 데이터 타입을 객체로 다루기 위한 클래스입니다.
✔ 각각의 기본 데이터 타입에 대응하는 Wrapper 클래스가 있습니다.
✔ Wrapper 클래스는 기본 데이터 타입을 객체로 다루어야 하는 경우 사용합니다. 예를 들어, 컬렉션 클래스들은 객체만 담을 수 있으므로, 기본 데이터 타입을사용하려면 Wrapper 클래스를 활용해야 합니다.
Boxing은 기본 타입을 Wrapper 클래스로 변환하는 것을 의미하며, UnBoxing은 Wrapper클래스를 기본 타입으로 변환하는 것을 말합니다.
[중요]▶ 접근 제한자에 대해 설명해주세요
✔ 클래스, 필드, 메소드 등 접근 범위를 제한하기 위해 접근 제한자를 사용합니다.
- private : 같은 클래스 내에서만 접근 가능. 외부에서는 접근 불가능
- default : 같은 패키지 내의 클래스에서만 접근 가능
- protected : 같은 패키지 내의 클래스 또는 다른 패키지의 하위 클래스에서 접근 가능
- public : 어디서든 접근 가능
▶ Java에서의 예외 처리 방법은 무엇인가요?
✔ try-catch-finally : 예외가 발생할 가능성이 있는 코드를 try 블록 안에 작성하고, 해당 예외를 처리하기 위한 코드를 catch 블록 안에 작성합니다. finally 블록은 선택적으로 사용하며, 예외 발생 여부와 상관없이 항상 실행되는 코드입니다.
✔ throws : 메소드 선언부에 사용하여 해당 메소드에서 처리하지 않은 예외를 호출한 곳으로 던지는 방법입니다.
▶ static 키워드는 어떤 용도로 사용되는가?
✔ static 키워드가 붙은 변수는 클래스 변수라고도 하며, 생성된 모든 인스턴스에서 공유하여 사용할 수 있음
✔ static 키워드가 붙은 메소드는 클래스 메소드라고도 하며, 인스턴스 생성 없이 클래스 이름으로 바로 호출할 수 있음.
✔ static 메소드 내부에는 static 아닌 멤버에 직접 접근할 수 없음.
✔ 초기화 블럭으로 사용되기도 하고, static final 과 함께 많이 쓴다. 또한, 싱글톤 객체를 생성할 때 사용한다.
▶ Java에서의 람다 표현식이 무엇이고 어떻게 사용되나요?
✔ 람다 표현식은 자바 8부터 도입된 기능으로, 익명 함수를 표현하는데 사용됩니다. 주로 함수형 인터페이스의 인스턴스를 생성할 때 사용되며, 메소드를 더 간결하고 직관적으로 표현할 수 있게 해줍니다.
▶ 컬렉션 프레임워크의 Iterator와 forEach의 차이는 무엇인가요?
모두 컬렉션의 요소를 순회하는 방법을 제공하지만, 사용방식과 내부 동작 방식에 차이가 있습니다.
🔹Iterator
- 컬렉션의 요소를 순차적으로 접근하는 방법을 제공하는 인터페이스입니다.
- hasNext(), next(), remove() 등의 메소드를 제공하며, 이를 통해 컬렉션의 요소를 순회하고, 요소를 제거 하는 등의 작업을 수행합니다.
🔹forEach
- 자바 8부터 도입된 메소드로, 컬렉션의 모든 요소에 대해 주어진 작업을 수행하는 방법을 제공합니다.
- 람다 표현식 또는 메소드 참조를 인수로 받아, 컬렉션의 각 요소에 대해 이를 적용
- forEach는 내부적으로 Iterator를 사용하여 컬렉션의 요소를 순회함
- 요소 제거를 지원하지 않음
- 병렬처리를 지원하는 Stream API와 많이 사용함
▶ toString() vs equals() vs hashCode()
🔹hashCode()
- 객체의 해시코드를 반환하는 메서드
- 객체의 주소를 int로 변환해서 반환..
- equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 한다.
- equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문
🔹toString()
- 객체를 문자열으로 변환하기 위한 메서드
- 자식 객체가 오버라이딩해서 많이 씀
🔹equals()
- 객체 자신과 주어진 객체를비교
- 같으면 true, 다르면 false
▶ 자료구조를 선택하는 기준
✅ 데이터의 성격
- 데이터의 성격에 따라, 순차적으로 접근해야 하는 경우 리스트나 배열 사용
✅ 연산의 종류와 빈도
- 각 자료구조에 대한 다양한 연산을 지원
- 데이터의 삽입, 삭제, 검색등의 연산이 있다.
- 이러한 연산 중 어떤 연산이 주로 이루어지는지, 그리고 그 빈도가 어느 정도인지에 따라 적합한 자료구조가 달라짐
✅ 메모리 사용량
- LinkedList 같은 경우, 포인터 주소를 따로 저장해야 되기 때문에 메모리가 낭비될 수도 있음
그리고, 성능 및 유지보수성을 기준으로 두고 자료구조를 선택한다.
▶ forEach를 사용할 수 있는 자료구조는 어떠한 인터페이스를 상속받고 있나요?
✔ Iterable 인터페이스를 상속받고 있는 클래스
✔ Iterable 인터페이스는 iterator 메소드를 정의하고 있으며, 이 메소드를 통해 Iterator 객체를 얻을 수 있습니다. 이때 Iterator 객체를 통해 컬렉션 요소를 순회
✔ Iterable 인터페이스를 구현한 대표적인 클래스로 Collection 인터페이스가 있음
▶ forEach를 사용하면 다음 데이터를 얻기위해서 내부적으로 호출되는 메서드가 있는데 무엇일까?
✔ forEach를 사용하면 내부적으로 Iterator의 next() 메소드가 호출된다.
▶ Iterator와 Iterable의 차이는 무엇인가요?
✅ Iterable 인터페이스
- Iterable 인터페이스는 객체가 'iterable' 하다는 것, 즉 객체의 요소를 순회할 수 있다는 것을 표현
- iterator() 메소드를 제공하고, 객체를 실제로 순회할 수 있는 Iterator 객체를 반환
- 대부분의 Collection Framework에서 Iterable 인터페이스를 구현
✅ Iterator 인터페이스
- 실제로 객체의 요소를 순회하는 역할을 함
- Iterator 인터페이스를 구현한 객체는 hasNext(), next(), remove() 등의 메소드를 제공
- hasNext() 는 순회할 요소가 더 있는지, next()는 다음 요소 반환, remove()는 현재 요소 제거에 사용
✔정리하자면, Iterable 인터페이스는 순회 가능한 것을 표현하기 위한 인터페이스이고, Iterator는 실제로 순회를 수행하는 인터페이스
▶ Generic 타입의 자료구조와 None Generice 타입의 자료구조의 차이를 설명하세요
✅ Generic 타입 자료구조
- 예를 들어, ArrayList<String> 으로 선언하면 String만 저장가능하다. 만약, Integer로 선언하면 오류가 발생함
- 따라서, Generice 타입 자료구조는 컴파일 시점에 이와 같은 오류를 사전에 예방할 수 있음
✅ None Generic 타입 자료구조
- 예를 들어, ArrayList 으로 선언하면 어떠한 객체든지 저장할 수 있다. 하지만, 잘못된 타입의 객체가 넘어가는 순간 오류가 발생
- 따라서, None Generice 타입 자료구조는 런타임 시점에 오류를 발생시켜 안전성 측면에서 제네릭 구조보다 좋지 않다.
- 또한, 객체를 꺼낼 때마다 적절한 타입으로 객체를 캐스팅해야 한다.
[중요]▶ ArrayList와 LinkedList의 차이는?
✅ ArrayList
✔ 동적 배열을 사용한다. 즉, 자동으로 배열의 크기를 늘려준다.
✔ 삽입, 삭제 등의 연산이 많이 사용되면 성능적으로 LinkedList보다 좋지 않다.
✔ 대신, 인덱스로 접근이 가능하므로 검색할 때 자주 사용된다.
✔ 메모리 사용을 LinkedList보다 덜 쓴다.
✅ LinkedList
✔ 원하는 인덱스에 도달하려면 O(n)의 시간까지 걸릴 수 있으므로, ArrayList보다 느리다.
✔ 삭제, 삽입에서는 ArrayList보다 성능이 뛰어나다.
✔ 포인터를 저장해야하므로 ArrayList보다 메모리를 더 사용한다.
▶ HashTable vs HashMap
✔ 동기화 : Hashtable은 동기화되어 있어 멀티 스레드 환경에서 안전하게 사용 가능하고, HashMap은 기본적으로 동기화되어 있지 않다.
✔ 허용하는 값 : Hashtable은 null키나 null 값을 허용하지 않습니다. 반대로, HashMap은 null키나 값을 지원합니다.
✔ 성능 : Hashtable은 동기화되어 있기 때문에 HashMap보다 성능이 떨어진다.
✔ 순회 방법 : HashMap은 Iterator를 사용하여 순회하며, Hashtable은 Iterator 뿐만 아니라 Enumeration도 사용하여 순회
▶ Hashing이란?
✔ 어떤 데이터를 특정 길이의 고유값으로 바꾸는 과정을 해싱이라고 한다.
✔ 이 변환을 수행하는 함수를 해시 함수라고 한다.
✔ 해싱의 주요 목표는 데이터를 빠르게 저장하고 검색하는 것에 있다.
▶ Factory Method Pattern 이란?
✔ 객체 생성을 공장 클래스로 캡슐화 처리하여 대신 생성하게 하는 생성 디자인 패턴
✔ 클라이언트에서 직접 new 연산자를 통해 제품 객체를 생성하는 것이 아닌, 제품 객체들을 도맡아 생성하는 공장 클래스
▶CSRF(Cross-site request forgery)에 대해 설명하고, 이를 막기 위한 방법은?
✔ 웹사이트 취약점 공격의 하나로, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행동을 하도록 만드는 공격
✔ 해결방법
- CSRF 토큰 사용 : 사용자의 모든 요청에 CSRF 토큰을 포함시킨다.
- SameSite 쿠키 속성 : 브라우저가 같은 사이트에서만 쿠키를 보내도록 제한할 수 있다.
- 검증된 Referrer 헤더 사용 : Referrer 헤더의 요청 URL을 검증한다.
- 요청에 대한 사용자 인증
▶XSS(Cross-site scriping)에 대해 설명하고, 어떤 대응책이 있는가?
✔ 공격자가 웹사이트에 악성 스크립트를 삽입하는 공격입니다. 이 스크립트는 사용자의 브라우저에서 실행되며, 사용자의 세션 토큰이나 다른 민감한 정보를 탈취할 수 있다.
✔ 해결방법
- 입력 검증
- 출력 인코딩
- 컨텐츠 보안 정책(CSP) : CSP를 사용하면 웹사이트에서 실행할 수 있는 스크립트의 출처를 제한할 수 있다.
▶스프링에서의 세션 관리와 보안 강화를 위한 방법은?
✔ HttpSession 인터페이스를 통해 세션 관리를 한다.
✔ 해결방법
- 세션 타임아웃 설정
- 세선 고정 공격 방어 : 사용자가 로그인하면 새로운 세션을 생성한다
- 세션 토큰 사용
- Https 사용 : 세션 쿠키를 암호화하여 전송한다.
▶스프링에서의 입력 유효성 검사 및 validation 방법에 대해 설명해주세요
✔ 어노테이션을 이용한 검증 : Bean Validation에서 제공하는 어노테이션을 사용하여 모델 클래스의 필드에 제약조건을 지정할 수 있습니다. @NotNull, @Email 등이 있다.
✔ Controller에서 검증 수행 : @Valid 어노테이션을 사용하여 검증을 수행하고, BindingResult 객체를 사용하여 검증 결과를 받을 수 있다.
✔ 커스텀 검증 : ConstraintValidator 인터이스를 구현하는 클래스를 만들고, 그 클래스를 사용하는 어노테이션을 정의합니다.
▶ 보안 헤더의 역할과 어떻게 구현하는지에 대해 설명해주세요
✔ 이 헤더들은 웹 애플리케이션에서 클라이언트와 통신할 때 사용되며, 클라이언트가 어떻게 애플리케이션과 상호작용해야 하는지를 지시하는 역할을 한다.
✔ 주요 보안 헤더
- CSP : 웹 브라우저에게 특정 콘텐츠를 로드할 수 있는 출처를 알려주는 역할을 합니다. 이를 통해 XSS 방어 가능
- HSTS : 브라우저에게 HTTPS를 통해서만 수행하도록 지시
- X-Content-Type-Options : 이 헤더는 브라우저가 MIME 타입을 자동으로 탐지하고 변경하는 것을 방지한다. 이를 통해, 악의적인 콘텐츠를 업로드하는 것을 방지할 수 있음
- X-Frame-Options : 이 헤더는 웹 페이지가 다른 페이지의 프레임 내에서 렌더링되는 것을 방지한다. 이를 통해, 클릭 잭킹 공격을 방어할 수 있음
▶ TDD의 개념에 대해 설명해주세요
✔ 소프트웨어 개발 방법론 중 하나로, 테스트가 개발을 주도하는 방식을 말합니다.
✔ 실패하는 테스트 작성, 테스트를 통과하는 코드 작성, 코드 리팩토링 과정을 거친다.
'Study > Computer Science' 카테고리의 다른 글
[면접대비] 리눅스 (0) | 2023.11.27 |
---|---|
[면접 대비] CS (0) | 2023.11.20 |
[Web]WEB와 WAS의 차이 (1) | 2023.11.01 |
[DB]SQL vs NOSQL (1) | 2023.10.30 |
[DB] SQL Injection (0) | 2023.10.27 |