자바 정리 2

다람·2023년 5월 19일
0

JAVA

목록 보기
26/27

싱글톤 패턴

객체의 인스턴스를 단 하나만 생성하는 것을 보장하는 디자인 패턴
인스턴스가 1개만 존재해야 한다는 것과 보장하고 싶은 경우와 동일한 인스턴스를 자주 생성해야 하는 경우에 주로 사용한다. -> 메모리 낭비 방지 위해

싱글톤 패턴 예시 - Spring Bean

클래스와 객체

클래스 : 객체를 만들어내기 위한 설계도
객체 : 설계도를 기반으로 생성되며, 자신의 고유 이름과 상태(필드), 행동(메소드)을 갖는다.
인스턴스 : 객체에 메모리가 할당되어 실제로 활용되는 실체

생성자

클래스와 같은 이름의 메소드로 객체가 생성될 때 호출되는 메소드
생성자는 파라미터를 다르게 해 오버로딩할 수 있다.

Wrapper Class, Boxing, UnBoxing

기본 자료형(char, int, short, double)에 대한 객체 표현을 Wrapper Class
기본 자료형 -> wrapper class로 변환하는 것을 Boxing라고 하며
wrapper class -> 기본 자료형으로 변환하는 것을 UnBoxing

왜 wrapper class로 변환하나?

박싱과 언박싱

public class Wrapper_Ex {
    public static void main(String[] args)  {
        Integer num = new Integer(17); // 박싱
        int n = num.intValue(); //언박싱
        System.out.println(n);
    }
}

Synchronized

여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터에 접근할 수 없게 막는 개념

new String(), 리터럴("") 차이

new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap영역에 저장되며 ""는 Heap 안에 있는 String Counstant Pool 영역에 저장된다.

String, StringBuffer, StringBuilder 공통점, 차이점

공통점 - 모두 다 문자열을 저장하고 관리하는 클래스

차이점
String : 불변의 속성을 가진다.
StringBuffer : 가변의 속성을 가졌으며 동기화를 지원하여 멀티 쓰레드 환경에서 주로 사용
StringBuilder : 가변의 속성을 가졌으며 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용

String 객체가 불변인 이유

  • 캐싱 기능에 의한 메모리 절약과 속도를 향상
  • thread-safe
  • 보안 가능

접근 제한자

변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 java의 예약어를 의미
public - 접근 제한이 없다.
protected - 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능
default - 해당 패키지 내에서만 접근 가능
private - 해당 클래스에서만 접근 가능

클래스 멤버 변수 초기화 순서

  1. static 변수 선언부 : 클래스가 로드될 때 변수가 제일 먼저 초기화
  2. 필드 변수 선언부 : 객체가 생성될 때 생성자 block보다 앞서 초기화
  3. 생성자 block : 객체가 생성될 때 JVM이 내부적으로 locking

static

  • static 키워드를 사용한 변수나 메소드는 클래스가 메모리에 올라갈 때 자동으로 생성되며 클래스 로딩이 끝나면 바로 사용할 수 있다. 즉 인스턴스 생성 없이 바로 사용 가능하다.
  • 모든 객체가 메모리를 공유한다는 특징이 있고 GC 관리 영역 밖에 있기 때문에 프로그램이 종료될 때까지 메모리에 값이 유지된 채로 존재하게 된다.

static 사용하는 이유

  • 비용도 줄이고 효율을 높일 수 있다.
  • 인스턴스 생성 없이 바로 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 이용

지역변수, 전역변수, 정적변수 차이

지역변수 (Stack영역)

  • 지역 안에서 선언된 변수
  • 사용자가 직접 초기화 해야 한다.
  • 다른 영역에서 접근할 수 없기 때문에 보안성이 뛰어나다.

전역변수 (data영역)

  • 클래스 영역 안에 있고 전체 영역에서 사용 가능한 변수
  • new를 만났을 때 초기화 된다.
  • 프로그램 종료 시 메모리에서 해제된다.
  • 다른 영역에서도 접근 가능해 보안성이 낮다.

정적변수 static (data영역)

  • 컴파일을 하게 되면 가장 먼저 메모리에 올라가고, 어떠한 경우에도 초기화가 되지 않는다.
  • 단 프로그램 종료 시 메모리에서 해제
  • 메모리에 고정되기 때문에 남용 시 메모리 혹은 프로그램 실행 속도에 악영향을 준다.

제네릭

데이터의 타입을 하나로 지정하지 않고 사용할 때마다 범용적이고 포괄적으로 지정한다는 의미
제네릭 타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있어 에러를 사전에 방지할 수 있다.

final / finally 차이

final

  • 클래스, 메소드, 변수, 인자를 선언할 때 사용할 수 있으며 한 번만 할당하고 싶을 때 사용
  • 한 번 초기화되면 그 이후에 변경할 수 없다.
  • 다른 클래스가 이 클래스를 상속할 때 메소드 오버라이딩을 금지
  • 다른 클래스에서 이 클래스를 상속할 수 없다.

finally

  • try-catch와 함께 사용되며 try-catch가 종료될 때 마무리 해줘야 하는 작업이 존재하는 경우 해당하는 코드를 작성해주는 코드 블록

리플렉션

구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 api

어떤 경우에 사용하나?

  • 런타임 시점에 지금 실행되고 있는 클래스를 가져와 실행해야 하는 경우
  • intelliJ의 자동완성 기능, 스프링의 어노테이션이 리플렉션을 이용한 기능

Error, Exception 차이

Error

  • 실행 중 일어날 수 있는 치명적 오류를 말한다.
  • 컴파일 시점에 체크할 수 없고, 오류가 발생하면 프로그램은 비정상 종료되며 예측 불가능함
    Exception
  • error보다 비교적 경미한 오류이며 try-catch를 이용해 프로그램의 비정상 종료를 막을 수 있다.

optional API

개발할 때 많이 발생하는 예외 중 하나가 NPE
NPE를 피하려면 NULL 여부 검사를 필연적으로 하게 되는데 만약 NULL 검사를 해야하는 변수가 많은 경우 코드가 복잡해짐
하지만 JAVA8부터 Optional를 제공하여 null로 인한 예외가 발생하지 않도록 도와주고 otpional 클래스의 메소드를 통해 null을 컨트롤할 수 있다.

profile
안녕

0개의 댓글