객체의 인스턴스를 단 하나만 생성하는 것을 보장하는 디자인 패턴
인스턴스가 1개만 존재해야 한다는 것과 보장하고 싶은 경우와 동일한 인스턴스를 자주 생성해야 하는 경우에 주로 사용한다. -> 메모리 낭비 방지 위해
싱글톤 패턴 예시 - Spring Bean
클래스 : 객체를 만들어내기 위한 설계도
객체 : 설계도를 기반으로 생성되며, 자신의 고유 이름과 상태(필드), 행동(메소드)을 갖는다.
인스턴스 : 객체에 메모리가 할당되어 실제로 활용되는 실체
클래스와 같은 이름의 메소드로 객체가 생성될 때 호출되는 메소드
생성자는 파라미터를 다르게 해 오버로딩할 수 있다.
기본 자료형(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);
}
}
여러 개의 쓰레드가 한 개의 자원을 사용하고자 할 때, 현재 데이터를 사용하고 있는 쓰레드를 제외하고 나머지 쓰레드들은 데이터에 접근할 수 없게 막는 개념
new String()은 new 키워드로 새로운 객체를 생성하기 때문에 Heap영역에 저장되며 ""는 Heap 안에 있는 String Counstant Pool 영역에 저장된다.
공통점 - 모두 다 문자열을 저장하고 관리하는 클래스
차이점
String : 불변의 속성을 가진다.
StringBuffer : 가변의 속성을 가졌으며 동기화를 지원하여 멀티 쓰레드 환경에서 주로 사용
StringBuilder : 가변의 속성을 가졌으며 동기화를 지원하지 않아 싱글 쓰레드 환경에서 주로 사용
변수 또는 메소드의 접근 범위를 설정해주기 위해서 사용하는 java의 예약어를 의미
public - 접근 제한이 없다.
protected - 해당 패키지 내, 다른 패키지에서 상속받아 자손 클래스에서 접근 가능
default - 해당 패키지 내에서만 접근 가능
private - 해당 클래스에서만 접근 가능
지역변수 (Stack영역)
전역변수 (data영역)
정적변수 static (data영역)
데이터의 타입을 하나로 지정하지 않고 사용할 때마다 범용적이고 포괄적으로 지정한다는 의미
제네릭 타입을 사용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있어 에러를 사전에 방지할 수 있다.
final
finally
구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 api
어떤 경우에 사용하나?
Error
개발할 때 많이 발생하는 예외 중 하나가 NPE
NPE를 피하려면 NULL 여부 검사를 필연적으로 하게 되는데 만약 NULL 검사를 해야하는 변수가 많은 경우 코드가 복잡해짐
하지만 JAVA8부터 Optional를 제공하여 null로 인한 예외가 발생하지 않도록 도와주고 otpional 클래스의 메소드를 통해 null을 컨트롤할 수 있다.