생성자( 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을 활용하여 원하는 형태의배열orCollection으로 반환
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 > 0이true인 경우 뒷 조건을 검사하지 않음.
。그러나 현업에서는 위처럼 단일조건문에 다중조건을 정의하기보다는가독성을 위해 여러개의조건문을 선언하는 방식을 더 선호
삼항연산자:값 = (조건)? 값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
。a의bit를 왼쪽으로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
。a의bit를 오른쪽으로b칸 이동하면서 왼쪽에0채움
▶a / (2^b)와 같은 효과 도출int x = 20; // 0001 0100 int y = x >> 2; // 0000 0101 (10진수 5)▶
20 / (2^2) = 5
a >>> b
。부호에 상관없이a의bit를 오른쪽으로 이동시키고 왼쪽을 무조건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(); } }