Language > Java
65

[Java] 인터페이스
1
0. 학습 목적인터페이스의 구성요소에 대해 이해한다.인터페이스는 언제 쓰는지 이해한다.1. 인터페이스란?인터페이스 란, '무엇을 할 것인가' 에 대한 명세만 적혀있는 계약 형 추상 자료형이다.(1) 계약이란?계약은 실생활에서 상호 간에 지켜야 하는 약속을 말한다. 인터페이스는 사용자와, 또 그것을 구현하고자 하는 class와 두 번 계약을 하게 된다.사용자와의 계약: 사용자가 인터페이스 내 원하는 매서드를 규칙에 맞게 호출하면, 사용자가 예상하는 결과를 반환 해줘야 한다.구현체와의 계약: 구현체는 추상 매서드의 규칙 (인수, 반환값)을 준수하여 구현하여야 하고, 그것의 용도에 맞는 행동을 해야 한다.(2) 인터페이스 활용의 효과구현 분리와 느슨한 결합A. 구현 분리 = 논리적 결합도 낮춤인터페이스가 없었..
3주 전
Language > Java

[Java]map.compute()를 활용해, map 자료구조 쉽게 다루기
0. 들어가며HashMap 자료형을 사용하며 풀어야 했던 문제 중, compute를 쓸 일이 있었는데, 갑자기 해당 내용이 생각이 나지 않아서 다시 정리한다. HashMap의 compute는 putIfPresent, putIfAbsent 등을 전부 포괄하며 내가 하고 싶은 작업의 대부분을 할 수 있어서 편하다. 이번엔 compute에 대해 자세히 알아보겠다.1. 형태V compute(K key, BiFunction remappingFunction);// exmap.compute(key, (key,oldValue) -> {... return newValue});반환형: 반환형의 V는 현재 함수를 부른 Map의 value의 자료형을 뜻한다. 만약 HashMap 였다면 V는 Integer가 되는 형식이다.인수..
2025.04.08
Language > Java

[JAVA] ArrayList<Integer>에서 원하는 숫자 Value 지우기
0. 들어가며...해당 글은 ArrayList에서 원하는 숫자를 지우는 방법에 대한 글이다. ArrayList.remove() 함수로 지우면 되지 않겠냐 생각할 수 있지만 .remove(int i)를 넣으면, remove의 오버로딩된 함수 중 ArrayList.remove(int index)가 호출되어, i를 index로 가지는 Value를 ArrayList에서 삭제한다. 따라서 원래 의도한 'i라는 Value 지우기'는 실패한다.1. ArrayList.remove(int index)위에서 설명했듯이 remove에 원시 자료형 int를 넣으면 해당 인수를 index로 가지는 Value를 ArrayList에서 삭제한다.2. ArrayList.remove(Object o)우리가 실제 i라는 Value를 삭..
2025.01.25
Language > Java

[JAVA] Long보다 큰 수를 다루는 법
0. 들어가며개발을 하거나, 코딩테스트에서 정수론 관련 문제를 만나면 한 번씩 주어지는 입력의 크기가 Long형을 초월할 수 있을 때가 간혹 있다. 먼저 코테에서 자주 쓰이는 자료형인 int와 Long형의 최대, 최소값을 알아보자.정수형 타입데이터 표현 범위int-2,147,483,648 ~ 2,147,483,647 ()long-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 ()long이 정말 많은 수의 범위를 커버할 수 있음에도 불구하고 백준의 거의 소수같은 문제는 이러한 자료형을 뛰어넘는다. 이때의 대처법 2가지를 설명하겠다.1. 실수 자료형인 Double 사용 Double은 64bit 부동 소수점으로 표현된 자료형으로..
2025.01.24
Language > Java

[JAVA] For 문 작동 순서
0. 정리하는 이유코테 문제를 풀다가 갑자기 순서가 헷갈렸다. 그래서 정리해놔야 겠다1. For 문 작동 순서1️⃣: 지역 변수 선언 및 초기화 (해당 부분이 For문 밖에 있어도 된다. 다만 그렇게 하면, for 문이 끝난 뒤에도 i 값이 유지된다.)2️⃣: 중앙의 조건 체크 (여기서 걸리면 for문 내용물에 들어가지 않고 바로 for 문이 끝난다.)3️⃣: 내용물 처리4️⃣: i 크기 올리기5️⃣: 다시 한 번 더 조건 체크
2025.01.24
Language > Java

[JAVA] 코딩테스트 중 실수하기 쉬운 StringBuilder의 생성자
0. 무엇을 정리하나요필자는 문자열을 뒤집는 기술이 필요할 때, StringBuilder클래스의 reverse()를 자주 활용한다. 근데, 펠린드롬 수를 빠르게 구하기 위해, 다음과 같이 문제를 푸니 틀리는 것 아닌가! StringBuilder straight = new StringBuilder(num);StringBuilder reverse = new StringBuilder(num).reverse();콘솔에 찍어보니 두 객체 모두에 어떠한 입력값도 들어가지 않았다! 코테에서 이러한 에러를 겪었으면 적잖이 당황했을 것 같다. 오늘은 필자와 같이 당황할 사람들을 위해, StringBuilder의 생성자에 int i를 넣는 것과 String str을 넣는 것의 차이를 알아보려 한다.1. ne..
2025.01.24
Language > Java

[Java] HashMap에서 Custom Class를 Key로 사용하는 방법, 그림으로 쉽게 이해하기
0. 알아볼 것1. Hash Map 이란? 형태의 데이터 쌍으로 이루어진 자료구조KEY를 활용해 HashMap에 VALUE을 (저장, 삭제, 조회) 하는데 평균 O(1)의 시간이 든다. 쌍을 ENTRY라고 부른다.KEY 값은 중복될 수 없고, VALUE 값은 KEY 값이 다르다면 중복저장이 가능하다.2. HashMap 내부 구조HashMap은 크게 HASH 함수와 Hash Bucket으로 이루어져 있다.Hash Bucket은 값을 저장하는 장소로 Array로 구현되어 있다.Hash 함수는 입력 값 마다의 Hash 값을 반환 하는데, 해당 Hash 값은 Hash Bucket의 Index이다. 따라서 Hash 함수는 입력 값이 저장될 위치를 알려주는 네비게이터 역할을 한다고 생각하면 되겠다.이제 실제 입력값..
2024.12.31
Language > Java

[Java] JSON 직렬화의 모든것
1. JSON 이란 무엇인가요? 💡(1) 정의JSON이란 JavaScript Object Notation의 약자로 Javascript 객체 형태로 되어있는 데이터 교환 양식이다.JS 객체의 형태 : javascript 객체는 (key: value) 형태의 값들이 나열된 구조이다. java에서 HashMap과 유사하다고 볼 수 있다. js에서는 따로 변수에 대한 타입 선언이 필요 없기 때문에 객체 문법이 비교적 간편하다.(2) 특징a. 언어 독립적인 양식이다.분명 JS 객체 형태를 기반으로 만들어진 양식이지만, javascript 뿐만 아니라 대다수의 언어, 그 언어 기반 프레임워크에서 활용할 수 있다.b. 상태를 교환한다.JSON을 통해 주고받는 데이터란 특정 객체 혹은 값들의 상태이다. 기능을 의미하..
2024.11.05
Language > Java

JAVA에서의 객체 직렬화 비교 (Byte Stream 직렬화 vs JSON 직렬화)
0. 알아볼 내용Java의 객체 직렬화에는 두 가지 종류가 있다.첫 번째로, Serializable 인터페이스를 구현한 클래스의 객체를 Byte Stream 직렬화하는 것 이다.두 번째로, RESTful API Sever를 구현할 때, 데이터 교환을 위해 객체를 JSON 직렬화하는 것 이다.두 가지의 차이점은 어렴풋이 알지만, 제대로 구분하여 기억하지 않았더니, 두 방법의 구현 방식과 활용법이 서로 뒤죽박죽 섞여 있었다. 이를 해결하기 위해 두 가지 형태의 직렬화에 대해 정확히 알아보고, 그 차이점을 구분하려 한다.여기서는 먼저 두 직렬화의 의미만 간략히 알아보고 차이점 설명에 더 집중하겠다.만약 더 자세히 알고 싶은 분은 각 항목 별 더 알아보기링크를 통해 확인하기 바란다.다음과 같은 클래스의 객체를 ..
2024.11.04
Language > Java

java TreeMap에 대해 알아보자!
(1) 정의Red-black Tree를 이용하여 구현한 Key 값을 기준으로 정렬되는 Map이다.정렬 기준은 default로 오름차순이고, 매개변수로 Comparator를 넣으면, 개발자 입맛에 따라 바꿀 수 있다. TreeMap map = new TreeMap((o1,o2) -> (return o1.score - o2.score)); Red-black Tree 란? 이진탐색을 보완하여 성능을 개선한 Tree 자료 구조이다. 이진탐색은 일반적으로 O(logN)의 시간복잡도를 가지지만, 데이터가 한쪽으로 치우쳐서, 일자형 Tree가 나올 경우(ex- 계속 작은 값의 데이터만 입력 등) O(n)이라는 시간복잡도가 든다. 이에 비해 Red-black Tree는 부모노드를 기준으로 큰 값은 오른쪽, 작은..
2024.07.18
Language > Java
Enum에 대하여
Enum은 열거형이라고 부른다. (영어로는 enumerated type이라 하고 이것의 줄임말이다.) Enum은 ‘요소’ 혹은 ‘멤버’ 라 불리는 명명된 값의 집합을 이루는 자료형이다. 여기서 ‘명명되다.’란 어떤 물건이나 일에 이름이 지어져 붙여지는 것을 말한다. Enum의 멤버가 되는 녀석들은 주로 어떤 물건이나 일을 식별하기 위한 상수 역할을 한다.
2024.01.16
Language > Java
몰랐던 것
1. Intger 컬랙션 프레임워크를 int 배열로 바꾸기. int [] arr = map.keySet().stream().mapToInt(x->x).toArray(); maptoInt(x->x): 컬랙션 프레임 워크에는 값들을 Wrapper Class인 Integer로 다 저장 했다. 하지만 배열에 저장할려면 type이 원시타입(int, double,...) 여야 한다 해당 maptoInt는 컬랙션 프레임 워크값을 IntStream으로 바꿔준다. (IntStream 원시 타입 int에 대한 Stream 이다.) toArray(): 컬랙션을 배열로 바꿔주는 함수. (원시 타입으로 바꿀 거면, 인수도 원시 타입이어야 한다.) 2. String ArrayList를 String 배열로 바꾸는 방법 String..
2023.05.21
Language > Java
Runnable
runnable도 Thread와 마찬가지로 병렬 수행을 하기 위한 것이다. 둘의 차이는 다음과 같다. Thread는 클래스이고 runnable은 인터페이스란 것이다. 단일 상속 원칙에 따라 Thread를 상속한 자식 클래스는 다른 부모 클래스를 상속하지 못하지만, runnable를 구현한 클래스는 병렬처리 기능을 쓰면서 다른 클래스나 인터페이스를 장착할 수 있다. 1. 코드 리뷰 import Chap_12.clean.CleanRunnable; public class _02_Runnable { public static void main(String[] args) { // 쓰레드를 만드는 방법 2가지 // 1. Thread 라는 클래스 상속해서 만들기 // 2, Runnable 이라는 인터페이스 구현해서 만..
2023.03.11
Language > Java

Thread
1. 용어정리 (1) 프로그램이란? 특정 작업을 수행하기 위해 만들어진 기계. (가동 안하는 상태, 죽은 상태) (2) 프로세서란? 작동하는 상태의 프로그램을 일컫는 말 (가동 중인 상태, 살아있는 상태) (3) 쓰레드란? 프로세서를 작동시키고 있는 녀석으로, 특정 작업을 수행중 (기계를 돌리고 있는 인부) (4) 프로세스란? 프로그램이 들어와 작업을 처리하는 공간. 보통 설정 안하면, 하나의 프로세스에 하나의 쓰레드만 존재한다. 프로세스에 여러 개의 쓰레드를 돌려서 프로그램들이 병렬 처리 되도록 할 수 있다. (하지만 이게 진짜로 일이 동시에 진행되는 것이 아니라, 두 가지 일이 순차적으로 처리되고 있지만, 그 둘이 스위칭 하는 게 나노미터 초로 이루어져서, 사람들 눈에는 그게 병렬 처리 하는 것처럼 ..
2023.03.09
Language > Java
Throws (예외 처리 미루기)
Throws 해당 매소드에서 일어날 수 있는 예외를 자체적으로 해결 안하고, 나 몰라라 하고 밖으로 던지는 명령어 매소드를 호출한 쪽에서 문제를 해결해야 한다. 책임전가하는 명령어 매소드를 호출한 쪽에서 또 throws 쓰면, 그냥 프로그램 퍼져도 책임 안 지겠다는 소리임. import java.io.FileWriter; import java.io.IOException; public class _07_Throws { public static void main(String[] args) { // 호출한 메인 매소드에서 해결하거나, 여기서도 throws로 나몰라라 하거나 // 메인 메소드에서도 throws로 던지면 그냥 문제 생기는 거 감안하고 돌리겠단 소리임. try { writeFile(); } catc..
2023.03.02
Language > Java
사용자 정의 예외
예외를 항상 throw new Exception(" 예외 발생 시 하고 싶은 말"); 로 한다면, 마지막 catch 구문에서 할 일이 너무 많다. Exception이란 특정적이지 않고 모든 걸 포괄하는 예외에 던졌기 때문에, ()안의 말이 아니면 무슨 이유 땜에 예외가 일어났는지 알기도 쉽지 않다. 따라서 우리가 직접 특정 순간에만 작동하는 예외 클래스를 만들고 그 예외 객체를 이용하여 예외 처리를 할려고 한다. public class _06_CustomException { public static void main(String[] args) { // 사용자 정의 예외 int age = 17; try { if(age < 19){ // System.out.println("만 19세 미만에게는 판매하지 않습..
2023.03.02
Language > Java
Try with Resources
1. 설명 AutoClosable이란 인터페이스를 구현한 클래스의 객체를 try구문 ()안에서 생성 했을 때를 가정한다. 해당 객체가 try catch 구문을 다 지나갔으면, try 구문이 자동으로 close 매소드를 호출하여 close의 기능을 수행하게 한다. 해당 스킬은 클래스가 AutoClosable이라는 인터페이스를 구현 해야만 쓸 수 있다. 2. 코드 리뷰 import java.io.BufferedWriter; public class _05_TryWithResources { public static void main(String[] args) { // close 구문도 예외처리가 필요해서 // try-catch-finally 구문 속에 또 try catch 구문이 들어간 걸 볼 수 있다. MyF..
2023.02.28
Language > Java
Finally 구문
1. 설명 예외 구문에서 문제가 발생하건 말건 예외처리 후 무조건 실행해야하는 코드를 적어 놓는 구문 2. 코드리뷰 public class _04_Finally { public static void main(String[] args) { try{ System.out.println("택시의 문을 연다."); throw new Exception("휴무 택시"); // System.out.println("택시에 탑승한다."); // 예외를 던지는 문장 주석 처리 하고 택시를 탑승한다는 정상 출력문이 나와도 finally 구문 실행 } catch (Exception e) { System.out.println("!! 문제 발생: " + e.getMessage()); } finally { System.out.pri..
2023.02.28
Language > Java

Throw
1. 정의 일부러 예외를 발생 시키는 Keyword (1)형태 // 내가 Catch 쪽으로 던질 새로운 예외 객체 생성 throw new Exception("무슨 에러인지 설명"); // throw에서 던진 예외 객체는 Catch에서 받아서 처리한다. 2. 코드 리뷰 public static void main(String[] args) { //나이가 19세 미만일 경우 예외 처리. int age = 17; try { if(age < 19){ throw new Exception("만 19세 미만에게는 판매하지 않습니다."); } else { System.out.println("주문하신 상품 여기 있습니다."); } }catch (Exception e){ //오류가 무엇인지 보여주는 예외 객체 매소드 e.p..
2023.02.24
Language > Java
오류에 따른 맞춤 예외 처리
1. 개별 예외 처리 방법 Exception 클래스는 모든 예외들의 조상 클래스 이다. 그래서 모든 예외를 다형성의 원리에 의해 다 받을 수 있었던 것이다. catch의 () 안에 예외별로 객체를 만들어주면, 해당 예외가 발생 했을 시에만 발동하는 예외 처리 구문을 만들 수 있다. // 배열 인덱스를 벗어난 곳에 대한 소스 실행을 할 경우의 예외처리문, // 잘못된 형변환이 일어났을 경우의 예외처리문을 따로 두었다. // 맨 마지막은 나머지 예외들에 대한 일괄 처리이다. catch (ArrayIndexOutOfBoundsException e){ System.out.println("인덱스를 잘못 설정했어요."); } catch (ClassCastException e) { System.out.println(..
2023.02.23
Language > Java

Run-Time(런타임) 오류와 예외 처리
1. 런타임 오류란? (1)런타임오류와 컴파일 오류 비교 종류 컴파일 에러 런타임 에러 뜻 소스코드를 기계어로 바꿀 때 (컴파일 시) 일어나는 에러. 대게 문법적 오류로 인해 일어난다. 코드 실행 도중에 일어나는 에러 코드가 문법적으로 말은 되지만, 논리적으로 말이 안될 때 일어난다. Run 했을 시 애초에 문법적으로 틀려서 Run 조차 안된다. 런타임 오류 있을 시 프로그램은 코드를 끝까지 실행하지 못하고 종료된다. (런타임 오류가 발생한 지점에서 프로그램이 종료된다.) 예시 int i = "문자열"; (애초에 말이 안되는 구조) int[] arr = new int[3]; arr[5] = 100; 해당 배열은 길이가 3이므로, 5에 값을 집어 넣을 수 없기에 에러가 발생한다. 코드 한 줄 한 줄은 문법..
2023.02.23
Language > Java