기타 자바 개념1 (생성자, 클래스 리터럴, ) 등

TopOfTheHead·2025년 9월 18일

자바 ( JAVA )

목록 보기
1/28

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

  • 기본 생성자
    。아무런 매개변수코드가 작성되지 않은 생성자

    생성자가 따로 정의되있지 않은 경우 JVM에 의해 컴파일 시점에서 기본 생성자를 자동 생성
    생성자( 사용자 정의 생성자 )를 오버로딩한 경우 자동 생성하지 않으므로, 따로 기본 생성자를 정의해야한다.

  • 사용자 정의 생성자
    기본 생성자오버로딩하여 사용자가 정의한 생성자

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

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

    컴파일 단계에서 클래스메타데이터를 포함하는 클래스 타입 객체가 생성됨
    ▶ 해당 클래스메타데이터가 필요한 메서드 등에서 활용됨.

  • 특정클래스.class
    JVM에서 컴파일 단계에서 생성되어 특정 클래스메타데이터를 포함하는 Class Type 객체를 제공하는 간단한 기능
    클래스 리터럴을 참조하는 구문
    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[]으로 반환

매달린 else 문제
if{}을 적용하지 않는 경우 else 구문을 마지막 if 구문에 적용됨

			if(false)
				if(true)
					System.out.println("A");
			else
					System.out.println("B");

▶ 결과값으로 아무런 출력이 발생하지 않는다.

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

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개의 댓글