자바 CS 정리

bomb·2023년 9월 11일

질문문항 100개 :
https://careerly.co.kr/comments/83898

자바 컴파일러가 해당 소스 파일을 가지고 클래스 파일(.class)을 생성하고
.class 파일로 JVM에서 프로그램을 구동할 때 사용하게 된다

  1. JDK와 JRE 차이
    JRE : 자바 실행 환경,
    JDK : 자바 개발 도구(JRE포함하며 컴파일러, javadoc, 라이브러리 등도 포함)

  2. == 와 equals
    == : primitive type : 값 비교, reference type : 주소값 비교
    equals : 보통 인스턴스의 값을 비교하는데 사용됨. object클래스의 메서드이고, 주소값을 비교함. 보통 재정의해서 동등성 비교로 사용함.

동일성 : == 비교다. 인스턴스의 참조값(주소 값) 비교.
동등성 : 인스턴스의 값을 비교 (equals)

primitive data type의 경우 ==를 통해 값 비교가 가능한 이유 :
Primitive 데이터 유형은 스택 메모리에 주소가 아닌 직접 값을 저장하기 때문.
(https://codingfarm.tistory.com/441)

  1. 객체 hashcode란 객체를 식별하는 하나의 고유 정수값을 말한다.
    => 두 객체가 동일한 HashCode를 가지면 같은 객체인가? no 해쉬충돌 일어난 경우엔 실제로 다름.

  2. final variables, arguments : 값이 변경되지 않도록 만듬
    final class : 클래스를 상속하지 못하도록 만듬
    final method : 메소드가 오버라이드되지 못하도록 만듬

  3. equals와 hashCode를 같이 재정의하는 이유
    해쉬 기반의 컬렉션을 사용하는 HashMap, HashSet, Hashtable 등은 모두 해쉬 기반으로 hashCode()와 equals()을 동시에 사용하는데, 만약 하나만 재정의 하는 경우 기존 규칙을 위반하여 원하는 결과가 나오지 않기 때문입니다.

hashCode 재정의 안하면
: equals로 같은 객체라도 해시값이 다를 수 있다. Collection에서 Hash(hashmap, hashset, hashtable) 쓸 때
equals가 같아도 hashCode값이 다른 애들 구분을 못함.

equals 재정의 안하면
: 객체의 동등성 비교를 해야함.

[HashTable 기준으로 설명하면]
hashCode를 이용해 객체가 저장된 버킷을 찾을 수 있지만, 해당 객체가 자신과 같은지 값을 비교할 수 없기 때문에 null리턴하게 되서 원하는 객체 못찾음.

  1. String 생성 방식 - ""(리터럴 방식) vs new String("") - 생성자 방식
    "" : 힙메모리 내에 String Pool에 값이 있는지 확인하고 없으면 새로운 객체 생성
String str1 = "i";
String str2 = "i";

System.out.println(str1 == str2); // true

new String("") : 힙메모리 내에 객체 생성

  1. 인터페이스와 추상 클래스 차이
  • 정의와 형태의 차이:
    - 인터페이스(Interface): 모든 메서드가 추상 메서드(abstract method)이며, 필드는 상수(constant)만 가질 수 있습니다.
    - 추상 클래스(Abstract Class): 추상 클래스는 일반 메서드와 추상 메서드를 모두 가질 수 있습니다.

  • 다중 상속
    - 인터페이스는 다중상속 지원, 추상클래스는 다중상속 지원 안함.

  • 인터페이스는 implements, 추상 클래스는 extends

  • 목적
    - 추상 클래스는 extends 키워드를 사용해서 자신의 기능들을 하위 클래스로 확장 시키는 느낌이라고 생각합니다.
    - 인터페이스에 정의된 메소드를 각 클래스의 목적에 맞게 기능을 구현하는 느낌(JDBC)
    ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
    [컨테이너]

  1. 자바 컨테이너란 무엇인가요? => 객체를 담고 관리하는 데이터 구조를 의미
    보통 자바에서는 컬렉션 프레임워크가 제공되어 List, Set, Map등의 컨테이너를 사용할 수 있습니다.

  2. Collection과 Collections의 차이는 무엇인가요?

Collection은 컬렉션 프레임워크의 인터페이스를 나타내고,
Collections는 그와 관련된 유틸리티 메서드들을 포함한 클래스.

  1. HashMap과 Hashtable의 차이는 무엇인가요?
    둘다 키-값 쌍을 저장하기 위한 해시 맵 구현체.

HashTable : 동기화 제공, 성능 느림, key나 밸류로 Null 허용 X
HashMap : 동기화 제공X, 성능 빠름, null 허용 O

  1. ArrayList와 Vector의 차이점을 말해주세요.
    Vector : 쓰레드세이프 O, 크기를 늘릴때 일정 비율로 늘어남.
    ArrayList : 쓰레드세이프 X, 동적으로 크기가 조절된다.

  2. iterator 와 listIterator 의 차이는 무엇인가요?
    iterator : 모든 컬렉션 사용 가능, 단방향 조회
    listIterator : 리스트 전용, 양방향 조회, 컬렉션에 추가요소 삽입 및 수정도 가능

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

[ Multi-Threading ]
1. 병렬과 동시성의 차이점
병렬: 실제 여러개의 코어에서 동시에 실행되는 것.
동시: 하나의 코어에서 여러개의 작업이 동시에 실행되고 있는 것처럼 보이는 논리적인 부분

  1. 데몬 스레드는 무엇인가요?
    주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드
    주 스레드가 종료되면 데몬스레드는 강제적으로 자동 종료된다.

  2. Callable vs Runnable
    Callable : return 값이 있고, Exception을 낼 수 있는데, Runnable은 그 반대.

[ reflection ]
1. 런타임 도중에 클래스, 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API

  1. 직렬화, 역직렬화
    자바 시스템 내부에서 사용되는 객체 또는 데이터들을 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 변환하는 기술과 그 반대의 변환인 역직렬화도 포함된다.
    왜 사용되는지 어떤상황에서 사용되는지?

기본적으로 자바의 객체는 JVM메모리에서만 상주를 하기 때문에 JVM이 사라지면 객체의 정보도 사라진다.
영속화가 필요할 때 → JVM 외부에서도 영원히 데이터가 존재할 수 있도록 데이터를 외부(DB 등)에 보내거나 저장할 때 직렬화를 활용한다.

  1. 동적 프록시란?
    리플렉션을 사용하여 런타임(Runtime)에 인터페이스를 구현한 객체를 동적으로 생성하는 프록시(Proxy)입니다.

리플렉션을 활용하므로 속도가 느리다는 단점 또한 존재

프록시(Proxy) : 다른 객체에 대한 대리자 또는 중간 매개체 역할을 하는 객체(자바에서)

[Object copy]

  • 깊은 복사(Deep Copy)는 '실제 값'을 새로운 메모리 공간에 복사하는 것을 의미하며,
  • 얕은 복사(Shallow Copy)는 '주소 값'을 복사한다는 의미입니다.

얕은 복사는 객체의 필드들을 복사하지만 참조 타입의 필드는 참조만을 복사하므로, 원본과 복사본이 같은 객체를 참조할 수 있습니다. 반면에 깊은 복사는 객체의 필드들을 완전히 복사하여 새로운 객체를 생성하므로, 원본과 복사본이 완전히 독립된 객체가 됩니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
[JAVA WEB]

  1. jsp와 servlet의 차이점은 무엇인가요
    • 공통점 : Java 웹 애플리케이션 개발에 사용되는 기술
    • 차이점 : JSP - JSP는 Java 코드를 HTML 문서 안에 삽입하여 동적 웹 페이지를 생성하는 데 사용됩니다.
      Servlet - Java 클래스로 작성된 웹 애플리케이션의 컨트롤러 역할을 합니다(웹 요청의 로직 처리를 담당).
  2. 세션과 쿠키의 차이는 무엇인가요?
  • 공통점: 웹 애플리케이션에서 사용자의 상태 정보 유지하고 정보 저장하는데 활용

  • Session
    - 서버에서 가지고있는 정보

  • Cookie
    - 서버에서 발급된 세션을 열기 위한 키 값(세션 ID 라고 칭함)

  • 차이점
    - 저장 : 쿠키는 사용자의 브라우저, 세션은 서버에 저장
    - 보안 : 쿠키는 브라우저에 저장되어 중간에 데이터가 탈취될 위험이 크다, 세션은 서버에 저장되서 상대적으로 안전, 세션 ID가 노출되면 위험할 수 있기 때문에, 보안을 강화하기 위해 HTTPS 등의 암호화 방식을 사용하는 것이 좋다

    • 수명 : 쿠키는 지정된 만료 날짜까지 유지 / 세션은 클라가 웹브라우저 닫으면 세션 데이터 서버에서 삭제됨
  1. 세션 과정을 설명해주세요.
  • 클라이언트가 웹사이트에 접속해 서버에 로그인 요청한다.

  • 서버는 계정 정보를 읽어 사용자를 확인 후, 사용자의 고유 ID 값을 부여한 후 세션 저장소에 저장하고 접속한 클라이언트에게 세션 ID를 응답한다.

  • 클라이언트는 해당 세션 ID를 받아 쿠키에 저장한 후, 헤더 쿠키에 넣어 데이터를 요청한다.

  • 서버에서는 쿠키를 받아 세션 저장소에서 확인 한 후, 일치하는 정보를 가져옵니다.

  • 세션 단점 : 탈취자가 세션ID를 탈취하여 클라이언트척 위장 가능, 서버에서 세션 저장소를 사용해야 함(관리포인트).

  1. 토큰 인증(JWT)
    https://jhbljs92.tistory.com/entry/1-JWT-%ED%86%A0%ED%81%B0-%EC%9D%B8%EC%A6%9D%EA%B3%BC-%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98-%ED%86%A0%ED%81%B0
  • 사용자가 아이디와 비밀번호로 로그인을 한다.
  • 서버측에서 사용자에게 유일한 토큰을 발급한다.
  • 클라이언트는 서버측에서 전달받은 토큰을 쿠키나 스토리지에 저장해두고,
    서버에 요청을 할 때마다 해당 토큰을 HTTP요청 헤더에 포함시켜 전달한다.
  • 서버는 전달받은 토큰을 검증하고 요청에 응답한다.
    토큰에는 요청한 사람의 정보가 담겨있어서(signature를 Secret Key로 복호화한다)
    서버는 DB를 조회하지않고 누가 요청했는지 알 수 있다.

단점 : 1. 쿠키 / 세션과 다르게 토큰 자체의 데이터 길이가 길어서 인증 요청 많아지면 네트워크 부하 심해짐.
2. 토큰이 탈취당하면 대처가 어려움(만료될때 까지)

  1. SQL Injection을 피할 수 있는 방법을 설명해주세요.
  • ORM기술을 사용한다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

[7. 예외 클래스]
1. throw와 throws차이

  • throw는 개발자가 의도적으로 예외를 발생시키는 것 (주로 RuntimeException(UnCheckedException) 처리를 위해 쓰는 방식이다.)
  • throws는 호출한 메서드에게 책임을 전가하여 호출한 메서드에서 예외처리를 하도록 강요합니다.
    - throws를 쓰면 그 호출한 메서드에서 try-catch 구문을 해줘야되는 것을 잊으면 안된다!, 안하면 에러처리 안하게됨.
  1. final / finally / finalize 의 차이를 설명해주세요
  • final은 클래스, 메소드, 변수 선언시 사용
    - final 변수는 한 번 초기화되면 그 이후에 변경할 수 없습니다.
    - final 메소드는 다른 클래스가 이 클래스를 상속할 때 메소드 오버라이딩을 금지합니다.
    - final 클래스는 다른 클래스에서 이 클래스를 상속할 수 없습니다.
  • finally : try-catch와 함께 사용되며, try-catch가 종료될 때 finally block이 항상 수행
  • finalize : Object 클래스에 정의되어 있는 메소드이며, GC에 의해 호출되는 메소드
    - 자바에서 메모리 할당된 객체를 해제
  1. try-catch-finally에서 생략할 수 있는 부분이 무엇인가요?
  • catch 나 finally 둘 중에 하나는 생략이 가능하며, 둘 다 생략은 불가능하다.
  1. exception 클래스의 예시를 말해주세요.
  • RuntimeException, IOException, NullpointerException 등

[8.Internet]
리다이렉트 : 클라이언트에서 요청한 url에 응답으로 다른 url로 이동하도록 하는 프로세스를 의미
포워드 : 웹 애플리케이션 서버 내에서 요청을 처리하고, 결과를 클라이언트(웹 브라우저)에게 반환하는 것을 의미

  1. 301과 302 상태 코드의 의미와 차이는 무엇인가요?
  • 301 : "영구적인 이동"을 나타내며, 리소스의 URL이 영구적으로 변경되었음을 의미합니다. 클라이언트는 새로운 URL로 리소스에 접근해야 합니다.
  • 302 : "임시적인 이동"을 나타내며, 리소스의 URL이 일시적으로 변경되었음을 의미합니다. 클라이언트는 임시적인 URL로 리소스에 접근하고, 원래 URL을 계속 사용해야 합니다.
    차이 : 검색엔진이 크롤링하는 페이지가 다른 것이다.
  1. forward와 redirect의 차이는 무엇인가요?
    • url의 변화 여부(리다이렉트는 변함)
    • 객체의 재사용 여부(포워드는 재사용함)
      : 시스템에 변화가 생기는 요청(로그인, 회원가입, 글쓰기)의 경우 redirect.

[9. 스프링]

  1. 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; // 메서드의 결과를 그대로 반환
    	}
    }
  2. DI

    • 정의 :객체(빈)들 간의 의존관계를 외부에서 결정하고 주입하는 것이다.
    • 종류 : 생성자 주입, 수정자 주입, 필드 주입(@Configuration)
  3. IOC

    • 객체의 생성과 의존성 관리를 프레임워크에 맡기는 개발 방법입니다.
    • 제어의 역전 원칙에 따라 개발자가 객체의 생명 주기와 의존성을 직접 관리하는 대신, 컨테이너가 이러한 작업을 대신 수행합니다.
    • BeanFactory, ApplicationContext 가 있음.
  4. 스프링빈이란?

    • 스프링 컨테이너에 의해 관리되는 자바 객체
  5. 스프링에서 빈으로 등록하는 방법?

    • 스프링 MVC에서는 @Controller, @Service, @Repository 등으로 빈으로 등록,
      configuration 관련 객체들은 @Bean과 @Component 으로 스프링 컨테이너에 객체를 빈으로 등록할 수 있다.
  6. 스프링 빈에 등록하는 방식인 @Bean 과 @Component의 차이는 무엇일까?

    • @Bean
      매서드에 붙일 수 있다. 클래스 위에는 @Configuration을 붙여줘야 한다.(객체를 생성할 때 싱글톤을 보장하기 위해)
      개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우에 사용된다.

    • @Compononet
      개발자가 직접 컨트롤이 가능한 Class들의 경우엔 @Component를 사용한다.
      class에서만 사용이 가능하다. (뜯어보면 target이 TYPE으로 지정되어 있어서 class에서만 사용이 가능하다.)

  7. 스프링 빈은 thread-safe 한가요?

    • 쓰레드 세이프하지 않다.
    • 해결방안 : 불변 객체 사용, 동기화, 스레드 로컬 변수 사용
  8. 스프링 트랜잭션 고립이란 무엇인가요?

    • 트랜잭션이 동시에 실행될 때 데이터를 어떻게 제어할 것인지 정해놓은 수준
    • read_Uncommited, Read_commited, Repeatable_Read, Serializalbe
  9. @RequestMapping은 어떤 역할을 하나요?

    • 웹 요청과 컨트롤러 메서드 간의 매핑(Mapping)을 설정
  10. @Autowired의 기능은 무엇인가요?

    • 객체 간의 의존성을 자동으로 주입할 수 있습니다.
    • 동작 과정 : 스프링 서버가 올라갈 때 애플리케이션 컨텍스트가 @Bean이나 @Service, @Controller 등 어노테이션을 이용하여 등록한 스프링 빈을 생성하고,
      @Autowired 어노테이션이 붙은 위치 또는 생성자, 수정자를 통해 주입한다.
  11. @Transactional

    • 트랜잭션 AOP를 처리하기 위한 기능
  12. 자바 스프링과 스프링 부트 차이는 뭔가요?

    • 스프링(Spring)은 프레임워크이며, 스프링 부트(Spring Boot)는 스프링 프레임워크를 기반으로 한 도구입니다.
      스프링은 설정 파일을 작성해야 하지만, 스프링 부트는 자동 설정을 제공하여 간편하게 개발할 수 있습니다.
      또한, 스프링 부트는 내장 서버를 제공하여 쉽게 웹 애플리케이션을 실행할 수 있습니다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
20231124 자바 cs 정리
https://thalals.tistory.com/314

[JAVA 특징]

  • 객체지향 프로그래밍 언어, JVM을 이용하기 때문에 운영체제에 독립적임
    - 객체지향 : 프로그래밍에 사용될 데이터의 상태와 행위를 객체로 만들고, 객체간의 상호작용을 통해 비지니스 로직 구성하는 프로그래밍 기법
  • 상속, 다형성, 캡슐화, 추상화 특징 가짐
  • 컴파일시 데이터 타입 결정되는 정적 타입 언어
  • GC지원

[final]

  • 변수, 메소드, 클래스를 변경 불가능하도록 하는 자바 키워드
  • 선언시 무조건 초기화 해야하며, 프로그램 실행 도중 값 수정 불가

[오버로딩, 오버라이딩]

  • 오버로딩 : 매개변수를 다르게 해서 같은 메소드 이름으로 다른 기능으로 정의하여 사용하는 것
  • 오버라이딩 : 하위 클래스에서 상위 클래스의 메서드 재정의함

[Generic]
데이터 타입을 일반화하는 것. 데이터 타입을 컴파일 시 미리 지정해두는것.
장점 : 1.코드의 재사용성과 2.타입 안정성을 향상 (컴파일때 타입체크, 형변환 줄인다)

[static]

  • static이란 ? : 정적 멤버를(static변수, static메서드) 만들수 있는 키워드.
  • 정적 멤버는 클래스가 메모리에 올라갈 때 자동으로 생성되기 때문에 객체 인스턴스를 따로 생성 안해도 사용할 수 있음.
    참고 : 정직 필드와 정적 메소는 인스턴스가 아닌, 클래스에 고정되어 클래스 로더가 클래스 로딩해 메모리 적재할때 클래스별로 관리되어 정적 메모리로 사용할 수 있다
  • 언제 사용하는가 ? 유틸함수, 변하지 않는 자주 사용하는 값
  • 단점 : 메모리에 올라가기 때문에, 남용할 수 있음

[java의 main 메서드가 static인 이유]

  • 객체의 존재 여부에 관계없이 쓰기 위해 static으로 사용한다.
    참고 : 프로그램이 실행되면 운영체제는 해당 자바 애플리케이션의 진입점(entry point)으로 main 메서드를 찾아 실행합니다.

[자바 코드의 실행 과정(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]

  • ThreadLocal ? Thread 내부에서 사용하는 지역변수이다.
    특정 쓰레드가 실행하는 모든 코드에서 그 쓰레드에 설정된 변수값을 사용할 수 있다.
    대표 예시 : 서버에서 클라 요청들에 대해 각 쓰레드 처리시, 해당 유저의 인증 및 세션 정보 저장할때
    주의 사항 : Thread 정보를 key로 하여 Map형식으로 데이터 저장 후 사용하는 자료구조임.
    ThreadPool 이용시 thread 재활용하면 이전에 세팅했던 ThreadLocal정보 남아있으므로, 모든 사용 후 remove 메서드를 이용해서 값 제거해야한다.

[SE와 EE]

  • JAVA SE : 자바 표준 에디션
  • JAVA EE : SE에 확장된 버전 JSP, 서블릿, JPA등의 포함됨

챕터 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에 접근 가능

필터 인터셉터 차이 :

  • Filter는 WAS단에 설정되어 Spring과 무관한 자원에 대해 동작, Interceptor는 Spring Context 내부에 설정되어 컨트롤러 접근 전, 후에 가로채서 기능 동작
  • Filter는 doFilter() 메소드만 있지만, Interceptor는 pre와 post로 명확하게 분리

AOP : 객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다.
로깅, 트랜잭션, 에러처리 등 비지니스단 메서드에서 세밀하게 조정할 때 사용
AOP는 주소, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

[결론]
1. 적용 시점

  • Filter → 디스패처 서블릿 -> Interceptor → AO
  1. 목적
    Filte : 전체적인 Request단에서 어떤 처리가 필요할 때
    Interceptor : 세션 및 쿠키 체크하는 http 프로토콜 단위로 처리해야 하는 업무가 있을 때
    AOP : 비즈니스 단에서 세밀하게 조정하고 싶을 때

0개의 댓글