배씌 2024. 10. 6. 00:43

[Java]

프리미티브 타입(Primitive type) : int, long, float, double

레퍼런스 타입(Reference type) : Integer, Long, Float, Double

 

대부분 프리미티브 타입이 빠름. 그러나, 컬렉션에서 정수형 or 부동소수형을 저장할때 사용하기 때문에 반드시 알아야함.

 

엡실론을 포함한 연산에 주의할 것 !

System.out.println(10.0 % 3.2) # 모듈러 / 0.399999999999947

10 % 3.2 의 결과값이 0.4가 아니라, 위와 같다.

자바는 부동소수형 데이터를 이진법으로 표현하기 때문 -> 엡실론

 

 

// 프리미티브 타입 사용법
int i = 0;
long[] longs = new long[10];
float f = 10.5f;
double d = 10 / 3.0;

// 레퍼런스 타입 사용법(꼭 필요한 경우 아니면 굳이 사용X)
Integer I = 0;
Long[] Longs = new Long[10];
Float F = 10.5f;
Double D = 10 / 3.0;

// 문법 오류 발생
ArrayList<int> arrayList = new ArrayList<>();
Stack<long> stack = new Stack<>();
Queue<float> queue = new Queue<>();
ArrayDeque<double> arrayDeque = new ArrayDeque<>();

// 올바른 코드
ArrayList<Integer> arrayList = new ArrayList<>();
Stack<Long> stack = new Stack<>();
Queue<Float> queue = new Queue<>();
ArrayDeque<Double> arrayDeque = new ArrayDeque<>();

컬렉션 프레임워크

리스트(ArrayList), 스택(Stack), 큐(Queue), 데크(ArrayDeque), 해시맵(HashMap)

1. 리스트

일반적으로 ArrayList를 의미함.

// 리스트 객체 생성
ArrayList<Integer> list = new ArrayList<>();
// 값 추가
list.add(1);
list.add(2);
list.add(4);
list.add(6);

System.out.println(list.get(2));	// 4
System.out.println(list);			// [1, 2, 4, 6]

 

2. 해시맵

키(key)와 값(value) 쌍을 저장하는 해시 테이블로 구현되어 있음.

// 해시맵 초기화
HashMap<String, Integer> map = new HashMap<>();

// 해시맵 값 삽입
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
// 해시맵 값 출력
System.out.println(map);	// {banana=2, orange=3, apple=1}

// 해시맵 데이터 검색
String key = "apple";

if (map.containsKey(key)){
	int value = map.get(key);
    System.out.println(key + ": " + value);	// apple: 1
}
else{
	System.out.println(key + "는 해시맵에 없습니다.");
}

// 해시맵 수정 : 해시맵 내부는 해시 테이블로 구성되어 있어 키를 찾거나 하지 않아도 됨
map.put("banana", 4);
System.out.println(map);	// {banana=4, orange=3, apple=1}

// 해시맵 삭제
map.remove("orange")
System.out.println(map);	// {banana=4, apple=1}

3. StringBuffer, StringBuilder

일반적으로 String s = "abc"; 후에 s += "def" 를 실행하면

1) 새로운 String s 객체 생성

2) s가 가진 "abc" 값을 하나씩 복사

3) "abc" 뒤에 "def" 저장

=> 코드 한줄에서 총 6번의 내부 연산이 수행됨

 

이를 해결하기 위해 StringBuffer, StringBuilder 클래스 사용

// StringBuilder 객체 생성
StringBuilder sb = new StringBuilder();

// 문자열 Add
sb.append(10);
sb.append("ABC");

// 출력
System.out.println(sb);	// 10ABC
sb.deleteCharAt(3);		// 3번째 인덱스 문자 삭제
System.out.println(sb); // 10AC
sb.insert(1, 2);		// 1번째 인덱스에 2라는 문자 추가
System.out.prinln(sb);	// 120AC

코딩 테스트 코드 구현 노하우

조기 반환

코드 실행 과정이 함수 끝까지 도달하기 전에 반환하는 기법

public static void main(String[] args){
	System.out.println(totalPrice(4, 50));
}

static int totalPrice(int quantity, int price){
	int toal = quantity * price;
    if(total > 100)
    	return (int)(total * 0.9);
    return total;
}

 

보호 구문

본격적인 로직을 진행하기 전 예외 처리 코드를 추가하는 기법

import java.util.List;

static double calculateAverage(List<Integer> numbers){
	if(numbers == null) // null 이면 종료(예외)
    	return 0;
        
    if(numbers.isEmpty()) // 데이터가 없으면 종료(예외)
    	return 0;
        
    int total = numbers.stream().mapToint(i -> i).sum(); // 예외 처리 후 기능 구현
    return (double) total / numbers.size();
}

 

제네릭(generic)

빌드 레벨에서 타입을 체크하여 타입 안정성을 제공하고, 타입 체크와 형변환을 생략할 수 있게 해주어 코드를 간결하게 만듬

List list = new ArrayList();
list.add(10);
list.add("abc");

int sum1 = (int)list.get(0) + (int)list.get(1); // 런타임 오류 발생

List<Integer> genericList = new ArrayList<>();
genericList.add(10);
genericList.add("abc"); // 문법(빌드 레벨) 오류 발생

int sum2 = genericList.get(0) + genericList.get(1);