기타 자바 개념1

TopOfTheHead·2025년 9월 18일

자바 ( JAVA )

목록 보기
1/23

생성자 ( Constructor )
개발자에게 객체 생성초기화강제하는것
new Emp()Emp 클래스생성자 함수 호출.

클래스 리터럴 ( Class literal ),
리터럴 : 개발자가 직접 작성하는 코드

  • Class 클래스
    Java Reflection API 중 일부로서 특정 클래스인터페이스메타데이터에 접근할 수 있도록하는 기능을 제공
    특정 클래스에 대한 정보를 캡슐화하여 메서드로 요청 시 정보를 제공

  • 특정클래스.class
    특정 클래스Class 객체를 획득하기에 가장 간단한 방법
    클래스 리터럴을 참조하는 구문
    ex ) String.class의 경우 String 클래스Class 객체를 참조

이스케이프 문자 : \
문자열 내부에 포함시키는 문자
특정 문자를 포함시키거나, 문자열 출력을 제어가능
ex ) '\'', tab : \t, new line : \n

조기 반환 ( Early Return )
。함수 실행 시 함수가 완전탐색으로 끝까지 실행하기 전 조건을 만족하는 경우 조기에 반환하여 함수를 종료하는 기법
예외를 더 깔끔하게 처리 가능.

public static int totalPrice(int quantity , int price) {
		int total = quantity * price;
		if ( total > 100 ) return total*2; // 조기 반환
		return total;
	}

보호 구문 ( Guard Clauses )
。본격적인 로직을 실행하기 이전 사전에 예외처리를 추가하는 기법
▶ 처음부터 입력값에 대한 예외를 작성하여 입력값결측값이 입력된 경우 함수를 종료하여 안전하게 코드 작성이 가능.

public static int totalPrice(List<Integer> lst) {
		if ( lst == null ) return 0; // 보호구문
	}

Java Stream을 활용하여 원하는 형태의 배열 or Collection으로 반환
Java Stream
ex )

import java.util.ArrayList;
class Solution {
    static ArrayList<Integer> a = new ArrayList<Integer>();
    public int[] solution(int[] numbers) {
        for(int i = 0 ; i < numbers.length ; i++){
            for(int j = i + 1 ; j < numbers.length ; j++){
                a.add(numbers[i]+numbers[j]);
            }
        }
        int[] answer = a.stream().distinct().sorted().mapToInt(Integer::intValue).toArray();
        return answer;
    }
}

ArrayList<Integer>Stream<Integer>로 변환 후 중복제거오름차순정렬IntStream으로 변환 후 int[]으로 반환

단축평가
논리연산 ( && , || )에서 표현식 결과가 중간에 확정 시 나머지 논리연산을 생략하고 즉시 결과를 반환

if( name != null && name.length() > 0 )인 경우 앞 조건 ( name != null )이 false인 경우 뒷 조건을 검사하지 않음.

if ( num > 0 || expensiveCheck() )인 경우 앞 조건 num > 0true인 경우 뒷 조건을 검사하지 않음.

。그러나 현업에서는 위처럼 단일 조건문에 다중조건을 정의하기보다는 가독성을 위해 여러개의 조건문을 선언하는 방식을 더 선호

삼항연산자 : 값 = (조건)? 값1 : 값2

switch / case / default문
단일값을 여러 case와 비교하는 용도로 유지보수성 향상 및 사이드이펙트 최소화

。주로 enum과 함께 사용

int a = switch( grade ) {
			case "A" -> 0;
			case "B" -> 1;
			case "C" -> 2;
			case "D" -> {
				yield 99;
			}
          	default -> -1;
		};

블록 내 여러 줄의 코드를 작성가능.

표현식 ( -> ) : java 12에서 추가된 기능
break를 선언하지 않아도 됨.
표현식이므로 변수에 값을 입력.

yield : java 13에서 추가된 기능
블록 내 값을 return

text-block
JAVA 15에서 등장했으며 SQL 작성 시 템플릿으로 활용
▶ 여러줄의 문자열을 쉽게 작성 가능하며 쿼리 형식을 그대로 유지해준다.

。이전 자바는 한줄씩 1줄문자열\n + 2줄문자열\n + ... 형식으로 작성

    """
    여러줄
    """

시프트 연산자 ( Shift Operation )
bit를 이동시키는 역할을 수행하는 연산자
byte , short , int 등의 정수형에 적용이 가능.

  • a << b
    abit를 왼쪽으로 b칸 이동하면서 오른쪽에는 0을 채움.
    a * ( 2^b )와 같은 효과 도출
int x = 5; // 0000 0101
int y = x << 1; // 0000 1010 → 10
int c = x << 2; // 0001 0100 → 20

5 * ( 2^1 ) = 10
5 * ( 2^2 ) = 20

  • a >> b
    abit를 오른쪽으로 b칸 이동하면서 왼쪽에 0 채움
    a / (2^b)와 같은 효과 도출
int x = 20;       // 0001 0100
int y = x >> 2;   // 0000 0101 (10진수 5)

20 / (2^2) = 5

  • a >>> b
    부호에 상관없이 abit를 오른쪽으로 이동시키고 왼쪽을 무조건 0으로 채움
    음수를 다룰때만 >>와 차이 존재

Time API
JDK 8 이전은 java.util.Date , java.util.Calendar을 사용
UTC , KST 등을 표현하기가 어려웠음

JDK 8 이후 LocalDate , LocalTime , LocalDateTime , ZonedDateTime , OffsetDateTime , Instant , Period , Duration이라는 Class 사용
불변하면서 명확한 특징을 가짐
▶ 주로 사용하는 클래스LocalDateTime : 한국에서 서비스용 , Instant : 다국적으로 사용

		// UTC 기준
		LocalDateTime ldt = LocalDateTime.now();
		System.out.println(ldt);
		// 현지시간
		Instant instant = Instant.now();
		System.out.println(instant);
		// UTC 기준 차이가 발생한 시간
		OffsetDateTime ot = OffsetDateTime.now();
		System.out.println(ot);
		// 존별 시간도 지시
		ZonedDateTime zdt = ZonedDateTime.now();
		System.out.println(zdt);


yyyy-MM-dd HH:mm:ss : 현지시간
yyyy-MM-dd HH:mm:ssZ : UTC
yyyy-MM-dd HH:mm:+09 : Offset : UTC 기준 9시간 차이
yyyy-MM-dd HH:mm:+09[존] : Offset + 존시간 : 해당 기준 Offset 시간

객체, 배열 등의 참조형 변수를 를 복제하는 경우 얕은복사 , 깊은복사 두 유형으로 복제가 수행
참조형 변수Heap 영역에 데이터를 저장하고 주소값을 저장.

  • 얕은복사 ( Shallow Copy )
    참조형변수가 가지는 주소값만 복사하는 경우
    ▶ 복사된 변수를 통해 수정하는 경우 원본 참조형변수Heap 영역의 데이터도 수정된다
int[] a = { 1,2,3 };
int[] b = a ; // 얕은 복사 발생

.

  • 깊은복사 ( Deep Copy )
    원본 참조형변수가 참조하는 Heap영역의 데이터까지 모두 복제하여 완전히 독립된 복사본을 생성
    clone() 또는 copyOf()를 사용하여 복제.
class SomeClass implements Cloneable {
	private final int id1 ; // 불변변수
	private final int id2 ;
	public SomeClass(int id1 , int id2) {
		this.id1 = id1;
		this.id2 = id2;
	}
	@Override
    public SomeClass clone() {
        try {
            return (SomeClass) super.clone(); 
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}
public class testcase1  {
	public static void main(String[] args) {
		SomeClass s = new SomeClass(1,2);
		SomeClass copied_s = s.clone();
	}
}
profile
공부기록 블로그

0개의 댓글