질문문항 100개 :
https://careerly.co.kr/comments/83898
자바 컴파일러가 해당 소스 파일을 가지고 클래스 파일(.class)을 생성하고
.class 파일로 JVM에서 프로그램을 구동할 때 사용하게 된다
JDK와 JRE 차이
JRE : 자바 실행 환경,
JDK : 자바 개발 도구(JRE포함하며 컴파일러, javadoc, 라이브러리 등도 포함)
== 와 equals
== : primitive type : 값 비교, reference type : 주소값 비교
equals : 보통 인스턴스의 값을 비교하는데 사용됨. object클래스의 메서드이고, 주소값을 비교함. 보통 재정의해서 동등성 비교로 사용함.
동일성 : == 비교다. 인스턴스의 참조값(주소 값) 비교.
동등성 : 인스턴스의 값을 비교 (equals)
primitive data type의 경우 ==를 통해 값 비교가 가능한 이유 :
Primitive 데이터 유형은 스택 메모리에 주소가 아닌 직접 값을 저장하기 때문.
(https://codingfarm.tistory.com/441)
객체 hashcode란 객체를 식별하는 하나의 고유 정수값을 말한다.
=> 두 객체가 동일한 HashCode를 가지면 같은 객체인가? no 해쉬충돌 일어난 경우엔 실제로 다름.
final variables, arguments : 값이 변경되지 않도록 만듬
final class : 클래스를 상속하지 못하도록 만듬
final method : 메소드가 오버라이드되지 못하도록 만듬
equals와 hashCode를 같이 재정의하는 이유
해쉬 기반의 컬렉션을 사용하는 HashMap, HashSet, Hashtable 등은 모두 해쉬 기반으로 hashCode()와 equals()을 동시에 사용하는데, 만약 하나만 재정의 하는 경우 기존 규칙을 위반하여 원하는 결과가 나오지 않기 때문입니다.
hashCode 재정의 안하면
: equals로 같은 객체라도 해시값이 다를 수 있다. Collection에서 Hash(hashmap, hashset, hashtable) 쓸 때
equals가 같아도 hashCode값이 다른 애들 구분을 못함.
equals 재정의 안하면
: 객체의 동등성 비교를 해야함.
[HashTable 기준으로 설명하면]
hashCode를 이용해 객체가 저장된 버킷을 찾을 수 있지만, 해당 객체가 자신과 같은지 값을 비교할 수 없기 때문에 null리턴하게 되서 원하는 객체 못찾음.
String str1 = "i";
String str2 = "i";
System.out.println(str1 == str2); // true
new String("") : 힙메모리 내에 객체 생성
정의와 형태의 차이:
- 인터페이스(Interface): 모든 메서드가 추상 메서드(abstract method)이며, 필드는 상수(constant)만 가질 수 있습니다.
- 추상 클래스(Abstract Class): 추상 클래스는 일반 메서드와 추상 메서드를 모두 가질 수 있습니다.
다중 상속
- 인터페이스는 다중상속 지원, 추상클래스는 다중상속 지원 안함.
인터페이스는 implements, 추상 클래스는 extends
목적
- 추상 클래스는 extends 키워드를 사용해서 자신의 기능들을 하위 클래스로 확장 시키는 느낌이라고 생각합니다.
- 인터페이스에 정의된 메소드를 각 클래스의 목적에 맞게 기능을 구현하는 느낌(JDBC)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
[컨테이너]
자바 컨테이너란 무엇인가요? => 객체를 담고 관리하는 데이터 구조를 의미
보통 자바에서는 컬렉션 프레임워크가 제공되어 List, Set, Map등의 컨테이너를 사용할 수 있습니다.
Collection과 Collections의 차이는 무엇인가요?
Collection은 컬렉션 프레임워크의 인터페이스를 나타내고,
Collections는 그와 관련된 유틸리티 메서드들을 포함한 클래스.
HashTable : 동기화 제공, 성능 느림, key나 밸류로 Null 허용 X
HashMap : 동기화 제공X, 성능 빠름, null 허용 O
ArrayList와 Vector의 차이점을 말해주세요.
Vector : 쓰레드세이프 O, 크기를 늘릴때 일정 비율로 늘어남.
ArrayList : 쓰레드세이프 X, 동적으로 크기가 조절된다.
iterator 와 listIterator 의 차이는 무엇인가요?
iterator : 모든 컬렉션 사용 가능, 단방향 조회
listIterator : 리스트 전용, 양방향 조회, 컬렉션에 추가요소 삽입 및 수정도 가능
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
[ Multi-Threading ]
1. 병렬과 동시성의 차이점
병렬: 실제 여러개의 코어에서 동시에 실행되는 것.
동시: 하나의 코어에서 여러개의 작업이 동시에 실행되고 있는 것처럼 보이는 논리적인 부분
데몬 스레드는 무엇인가요?
주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드
주 스레드가 종료되면 데몬스레드는 강제적으로 자동 종료된다.
Callable vs Runnable
Callable : return 값이 있고, Exception을 낼 수 있는데, Runnable은 그 반대.
[ reflection ]
1. 런타임 도중에 클래스, 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API
기본적으로 자바의 객체는 JVM메모리에서만 상주를 하기 때문에 JVM이 사라지면 객체의 정보도 사라진다.
영속화가 필요할 때 → JVM 외부에서도 영원히 데이터가 존재할 수 있도록 데이터를 외부(DB 등)에 보내거나 저장할 때 직렬화를 활용한다.
리플렉션을 활용하므로 속도가 느리다는 단점 또한 존재
프록시(Proxy) : 다른 객체에 대한 대리자 또는 중간 매개체 역할을 하는 객체(자바에서)
[Object copy]
얕은 복사는 객체의 필드들을 복사하지만 참조 타입의 필드는 참조만을 복사하므로, 원본과 복사본이 같은 객체를 참조할 수 있습니다. 반면에 깊은 복사는 객체의 필드들을 완전히 복사하여 새로운 객체를 생성하므로, 원본과 복사본이 완전히 독립된 객체가 됩니다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
[JAVA WEB]
공통점: 웹 애플리케이션에서 사용자의 상태 정보 유지하고 정보 저장하는데 활용
Session
- 서버에서 가지고있는 정보
Cookie
- 서버에서 발급된 세션을 열기 위한 키 값(세션 ID 라고 칭함)
차이점
- 저장 : 쿠키는 사용자의 브라우저, 세션은 서버에 저장
- 보안 : 쿠키는 브라우저에 저장되어 중간에 데이터가 탈취될 위험이 크다, 세션은 서버에 저장되서 상대적으로 안전, 세션 ID가 노출되면 위험할 수 있기 때문에, 보안을 강화하기 위해 HTTPS 등의 암호화 방식을 사용하는 것이 좋다
클라이언트가 웹사이트에 접속해 서버에 로그인 요청한다.
서버는 계정 정보를 읽어 사용자를 확인 후, 사용자의 고유 ID 값을 부여한 후 세션 저장소에 저장하고 접속한 클라이언트에게 세션 ID를 응답한다.
클라이언트는 해당 세션 ID를 받아 쿠키에 저장한 후, 헤더 쿠키에 넣어 데이터를 요청한다.
서버에서는 쿠키를 받아 세션 저장소에서 확인 한 후, 일치하는 정보를 가져옵니다.
세션 단점 : 탈취자가 세션ID를 탈취하여 클라이언트척 위장 가능, 서버에서 세션 저장소를 사용해야 함(관리포인트).
단점 : 1. 쿠키 / 세션과 다르게 토큰 자체의 데이터 길이가 길어서 인증 요청 많아지면 네트워크 부하 심해짐.
2. 토큰이 탈취당하면 대처가 어려움(만료될때 까지)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
[7. 예외 클래스]
1. throw와 throws차이
[8.Internet]
리다이렉트 : 클라이언트에서 요청한 url에 응답으로 다른 url로 이동하도록 하는 프로세스를 의미
포워드 : 웹 애플리케이션 서버 내에서 요청을 처리하고, 결과를 클라이언트(웹 브라우저)에게 반환하는 것을 의미
[9. 스프링]
AOP란 무엇인가요?
애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리하여 모듈로 만들고 설계하여 개발하는 방법
목적(장점) : 1. 관심사 분리(핵심 로직, 부가 로직), 2. 중복 코드 제거 3. 비지니스 로직 순수성 유지
Spring AOP의 핵심 개념과 구성 요소:
- Aspect: Aspect는 AOP에서 관심사를 모듈화한 단위입니다. Aspect는 Advice와 Pointcut을 포함합니다.
- Advice : Aspect에서 실질적으로 어떤 일을 해야할지에 대한 부가기능을 담은 구현체를 의미
- PointCut : 부가기능이 어느 지점에서 실행될지를 정의하는 것(ex : com.example.controller)
@Aspect
public class LoggingAspect {
@Around("execution(* com.example.service.*.*(..))")
public Object logMethodExecution(ProceedingJoinPoint joinPoint) throws Throwable {
// 메서드 호출 전에 수행할 작업
System.out.println("메서드 호출 전: " + joinPoint.getSignature());
// 원본 메서드 호출
Object result = joinPoint.proceed();
// 메서드 호출 후에 수행할 작업
System.out.println("메서드 호출 후: " + joinPoint.getSignature());
return result; // 메서드의 결과를 그대로 반환
}
}
DI
IOC
스프링빈이란?
스프링에서 빈으로 등록하는 방법?
스프링 빈에 등록하는 방식인 @Bean 과 @Component의 차이는 무엇일까?
@Bean
매서드에 붙일 수 있다. 클래스 위에는 @Configuration을 붙여줘야 한다.(객체를 생성할 때 싱글톤을 보장하기 위해)
개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용된다.
@Compononet
개발자가 직접 컨트롤이 가능한 Class들의 경우엔 @Component를 사용한다.
class에서만 사용이 가능하다. (뜯어보면 target이 TYPE으로 지정되어 있어서 class에서만 사용이 가능하다.)
스프링 빈은 thread-safe 한가요?
스프링 트랜잭션 고립이란 무엇인가요?
@RequestMapping은 어떤 역할을 하나요?
@Autowired의 기능은 무엇인가요?
@Transactional
자바 스프링과 스프링 부트 차이는 뭔가요?
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
20231124 자바 cs 정리
https://thalals.tistory.com/314
[JAVA 특징]
[final]
[오버로딩, 오버라이딩]
[Generic]
데이터 타입을 일반화하는 것. 데이터 타입을 컴파일 시 미리 지정해두는것.
장점 : 1.코드의 재사용성과 2.타입 안정성을 향상 (컴파일때 타입체크, 형변환 줄인다)
[static]
[java의 main 메서드가 static인 이유]
[자바 코드의 실행 과정(JVM동작 과정)]
JVM : 컴퓨터가 자바 바이트 코드를 운영 체제에 맞게 실행시키는 역할을 수행
0. 프로그램이 실행되면 JVM은 OS로부터 필요한 메모리 할당받는다.
1. ( .java ) 인 파일을 자바 컴파일러를 통해 자바 바이트 코드로(.class) 컴파일한다.
2. Class Loader를 통해 Class파일들을 JVM에 로딩한다.
3. Class Loader는 동적 로딩 및 링킹 통해 필요 클래스들을 로딩 및 링크하여 JVM의 Runtime Data Area에 올린다. (JVM의 메모리)
4. 실행 엔진은 JVM메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행한다.

[실행엔진이 바이트코드를 실행하는 과정]
1. 인터프리터 방식 : 바이트 코드를 명령어 단위로 한줄 씩 읽어서 실행(느리다)
2. JIT컴파일러 이용한 방식 : 실행하다 특정 시점마다 바이트 코드 전체를 컴파일해서 네이티브 코드로 변경하고, 네이티브 코드로 직접 실행하는 방식
[GC란]
힙 메모리 관리를 위해 참조되지 않은 객체들을 메모리에서 삭제하는 역할
[GC 장단점]
장점
메모리 누수 막는다
단점
GC의 메모리 해제 타이밍을 개발자가 정확히 할기 어렵다.
실시간성이 강조되는 프로그램의 경우 GC에 메모리 맡기는건 안맞는다.
GC동작 과정
다시 해야함.
[정적타입 언어와 동적타입 언어 차이]
자료형 결정을 컴파일때 결정 : 정적 타입 언어,
런타임 과정에서 결정 : 동적 타입 언어
[정적타입 언어와 동적타입 언어 장단점]
정적타입
[스크립트 언어와 컴파일 언어 차이]
컴파일 언어
실행전 소스코드를 컴파일해서 기꼐어로 번역후 해당 파일 실행
실행 속도가 빠름
컴파일 과정 거치기 때문에 사전에 검증 및 최적화 가능
스크립트 언어는 운영체제 신경쓸 필요 없지만, 컴파일 언어는 운영체제에 따라 다르게 작업해야함.
스크립트 언어
인터프리터가 한라인 한라인 기계어로 번역하며 실행
컴파일 문법 오류를 사전에 방지하지 못함
[동적 로딩]
프로그램을 실행할 때, 필요할 때마다 동적으로 메모리를 생성하고 필요없는 메모리는 자동으로 메모리에서 소멸
[primitive, reference type 차이]
primitive의 장점 : 성능과 메모리
primitive : Stack저장, NULL X, 더 빠름, 제네릭에 사용 못함
reference : Heap저장 (가비지 콜렉션에 의해 파괴됨), NULL O, 더 느림(스택 메모리에는 참조값만 있고 실제값은 힙 메모리에 존재)
[ThreadLocal]
[SE와 EE]
챕터 2]
값에 의한 호출
call by value : 메서드에 인자로 전달되는 값(변수의 값)이 복사되어 전달됩니다.
장점 : 원래값 보존, 단점 : 메모리 사용량 늘어남(복사)
참조에 의한 호출
call by reference : 메서드에 인자로 전달되는 값이 변수의 참조(주소)가 전달됩니다.
장점 : 복사 안하고 참조하므로 빠르다, 단점 : 원래 값이 영향을 받는다.
[String, StringBuffer, StringBuilder 사용되면 좋을 때]
String : 불변객체, 변하지 않는 문자열 사용하는 경우. 문자열 변경시 새로운 문자열 생성
StringBuffer : 동기화 지원O, 멀티 스레드 환경, 문자열 자주 변할 때
StringBuilder : 동기화 지원X, 단일 스레드 환경, 문자열 자주 변할 때
[예외 클래스]

모든 예외클래스는 throwable 상속 받는다.
throwable 상속받은 클래스는 error 와 Exception이 있는데 개발로직은 Exception만 처리.
Exception 에 Checked, Unchecked Exception이 있다.
Checked : RuntimeException 상속 안함, 예외처리 코드 필수, 컴파일 단계 확인, SQL/IO Exception
Unchecked : RuntimeException 상속, 예외처리 코드 필수 아님, 런타임 단계 확인, 널익셉션/인덱스 아웃 바운드 익셉션 등
언제 사용하는가?
Checked : try ~ catch 문, throws 문
Unchecked : throw로 exception, 이후 ExceptionHandler 로 처리한다.
-참고-
throw는 Exception을 던질 때 예외 내용도 던져주지 않는다.
그래서 개발자가 직접 Exception을 따로 커스터마이징해서 만들고 그 안에 메시지를 넣어서 던져주는 방식이다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
기타

필터 : Dispatcher Servlet 전/후 ServletRequest/ServletResponse 객체 변경 및 조작 수행 가능
인터셉터 : Dispatcher Servlet 이후 Controller 호출 전/후에 끼어들어 기능 수행 (preHandle, postHandler),
Spring Context 내부에서 모든 Bean에 접근 가능
필터 인터셉터 차이 :
AOP : 객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다.
로깅, 트랜잭션, 에러처리 등 비지니스단 메서드에서 세밀하게 조정할 때 사용
AOP는 주소, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.
[결론]
1. 적용 시점