Java 22

[Java] 자바 알고리즘 풀 때 int vs long 언제 써야할까?

알고리즘 문제 풀다가 자바에서는 종종 int 를 쓰면 값이 이상하게 나오는 경우가 많다.파이썬은 숫자 범위 제한이 없어서 그냥 막 써도 괜찮은데, 자바는 자료형에 따라 범위가 정해져 있어서 조심해야함✔️ 기본 정수 자료형 범위자료형범위int약 ±21억long약 ±900경✔️ 자료형 선택 기준입력값의 최대 범위 확인하기배열 크기, 원소 값, 반복 횟수 등 다 확인단순히 값이 작아 보여도, 곱하거나 누적될 경우 주의곱셈, 누적합 등 중간 결과가 커지는 경우ex) 1_000_000 * 1_000_000 → 10^12 (int 넘음)이럴 땐 반드시 long 사용지수 연산이 있는 경우문제에서 "행렬 제곱", "A^B" 같이 나오는 경우반복적인 곱셈이 발생해서 수가 커질 수 있음✔️ 자주 하는 실수int a = 1..

Java/알고리즘 2025.03.23

[Spring] 프록시 패턴(Proxy Pattern)

✏️ 한 줄 정리프록시 패턴은 실제 객체 대신 프록시 객체가 요청을 가로채어, 추가적인 기능(트랜잭션, 로깅, 보안 등)을 수행한 후 실제 객체를 호출하는 디자인 패턴 프록시 패턴(Proxy Pattern) 이란 ?프록시 패턴은 객체에 대한 접근을 제어하기 위해 대리자(Proxy) 객체를 두는 디자인 패턴이다.즉, 실제 객체 대신 프록시 객체가 먼저 호출을 가로채고, 필요하면 실제 객체를 호출하는 구조를 가진 패턴 Spring에서 프록시 패턴을 사용하는 경우1. 트랜잭션 관리 (@Transaction)- 트랜잭션을 시작하고, 메서드 실행 후 커밋 또는 롤백 2. AOP (Aspect-Oriented Programming, @Aspect)- 로깅, 성능 모니터링, 보안 검증 등 부가기능 적용- @Befor..

Java/Spring 2025.03.17

[Spring] 트랜잭션

1. Spring에서 트랜잭션 관리Spring 프레임워크에서는 @Transactional 어노테이션을 사용해 간단히 트랜잭션을 관리할 수 있다. 트랜잭션은 보통 서비스 계층에서 사용되며, 데이터베이스의 상태를 변경하는 작업을 안전하게 처리한다.@Servicepublic class ExampleService { @Transactional public void insertDatabase() { // logic }} 위 코드에서 @Transactional 을 메서드에 적용하면, 메서드가 실행되는 동안 트랜잭션이 활성화된다. 만약 메서드 내에서 예외가 발생하면 트랜잭션이 자동으로 롤백된다.2. 전파 레벨(Propagation)Spring의 트랜잭션은 다양한 전파 레벨(Propagat..

Java/Spring 2025.03.16

[Spring Boot] 의존성 주입(DI)

✏️ 한 줄 정리생성자 주입을 사용하자Spring Boot에서 의존성 주입(Dependency Injection, DI) 방식에는생성자 주입, 필드 주입, 세터 주입이 있다. 1. 생성자 주입 (Constructor Injection) 가장 권장@Componentpublic class ExampleService { private final ExampleRepository exampleRepository; @Autowired // 최신 Spring 버전에서는 생략 가능 public ExampleService(ExampleRepository exampleRepository) { this.exampleRepository = exampleRepository; }} ✅ 불변성 유..

Java/Spring 2025.03.16

자료구조 (ArrayList, HashMap, Stack, Queue, Deque)

🔹 1) 배열 (int[])int[] arr = new int[5]; // 크기 5인 배열int[] arr2 = {1, 2, 3, 4, 5}; // 배열 초기화 🔹 2) 리스트 (ArrayList)- 배열보다 크기 변경이 자유로움import java.util.ArrayList;ArrayList list = new ArrayList();list.add(10); // 추가list.add(20);System.out.println(list.get(0)); // 첫 번째 원소list.remove(0); // 첫 번째 원소 삭제System.out.println(list.size()); // 리스트 크기 🔹 3) 해시맵 (HashMap)- Key-Value 저장, 탐색이 빠름 (O(1))import java.u..

Java/알고리즘 2025.03.12

빠른 입력 (Scanner vs BufferedReader)

알고리즘 문제를 풀 때 입력 속도는 매우 중요하다. 특히, 입력 데이터가 많으면 Scanner와 BufferedReader 중 어떤 것을 사용하느냐에 따라 실행 시간이 크게 차이 나서 시간 초과가 날 수도 있다.📌 결론부터 말하면?→ Java는 기본적으로 입력이 느리기 때문에 BufferedReader를 쓰는 것이 좋다!→ 단순한 문제에서는 Scanner도 괜찮지만, 대부분의 경우 BufferedReader + StringTokenizer 조합을 추천한다. 입력 방법속도장점단점Scanner느림공백 및 개행을 기준으로 쉽게 입력을 분리할 수 있음내부적으로 정규 표현식 기반 파싱을 하기 때문에 속도가 느림BufferedReader빠름버퍼를 활용하여 대량의 데이터를 빠르게 읽을 수 있음입력을 문자열로만 받기..

Java/알고리즘 2025.03.12

[Java] 객체지향 프로그래밍

객체지향(Object-Oriented Programming, OOP)프로그램을 객체(Obejcts)라는 독립적 단위들로 나누고,이 객체들이 서로 상호작용하며 전채 시스템을 구성하도록 설계하는 프로그래밍 패러다임이다. 객체지향의 핵심 개념객체 (Object)▶ 객체는 데이터(속성)와 기능(메서드)를 가진 프로그램의 독립적 단위이다.▶ 예를 들어, 자동차 라는 객체에는 색상, 모델명 같은 속성이 있고, 운전하다(), 정지하다() 와 같은 기능이 있을 수 있다.클래스 (Class)▶ 클래스는 객체를 생성하기 위한 설계도이다. 객체의 속성과 기능을 정의한다.▶ 예를 들어, 자동차 라는 클래스를 만들어두면, 이 클래스를 통해 다양한 자동차 객체(예: 빨간 자동차, 파란 자동차)를 생성할 수 있다.상속 (Inher..

Java/기본 2024.11.14

[Java] 참조란 무엇일까?

참조 (Reference) 는 프로그래밍에서 변수나 객체가 다른 객체나 값을 가리키는 방법을 의미한다.즉, 변수나 객체가 실제 데이터를 담고 있지 않고, 그 데이터가 저장된 위치(메모리 주소)를 가리키는 방식이다.참조를 이해하려면 값 자체와 그 값을 가리키는 주소의 차이를 이해하는 것이 중요하다. 1. 기본 데이터 타입과 참조값 타입 (Primitive Type)값 자체를 변수에 저장한다Int, double, char값이 그대로 저장되므로 다른 변수에 값을 할당할 때 값 복사가 이루어진다.int a = 10; // a 변수에 10 이라는 값을 저장int b = a; // b 변수에 a 라는 값을 복사 -> b 는 10  참조 타입 (Reference Type)실제 값을 저장한 메모리 위치(주소)를 저장한..

Java/기본 2024.11.14

[Java] 컴파일 오류? 런타임 오류?

컴파일 오류 (Compile-Time Error)시점: 코드를 작성하고 컴파일할 때 발생하는 오류발생 이유: 문법 오류나 잘못된 데이터 타입 사용 등 코드의 형식이나 문법이 맞지 않을 때 발생int number = "문자열"; // 정수형 변수에 문자열을 할당하려고 할 때컴파일러가 오류를 발견하고, 코드가 실행되지 않으며 수정이 필요하다런타임 오류 (Runtime Error)시점: 코드가 컴파일된 후, 프로그램이 실행중일 때 발생하는 오류발생 이유: 컴파일 과정에서는 문제가 없었지만, 실행 중에 예기치 못한 상황이 발생했을 때 나타난다. 예를 들어, 배열의 범위를 벗어난 인덱스에 접근하려 할 때, 또는 null 값을 찾모하려 할 때 발생한다.String text = null;System.out.print..

Java/기본 2024.11.14

[Java] 순환참조

순환참조객체나 클래스가 서로를 참조하는 상황이 계속 순환되는 구조를 말한다.예를 들어, 클래스 A 가 클래스 B 를 참조하고, 클래스 B 도 다시 클래스 A 를 참조하게 되면, 두 클래스가 서로를 필요로 하게 되어 순환 참조가 발생한다.예를 들어보면,1. 클래스 간 순환 참조class A { private B b; public A(B b) { this.b = b; }}class B { private A a; public B(A a) { this.a = a; }} 여기서 A 와 B 는 서로를 생성자에서 참조하므로, A 를 생성하려면 B 가 먼저 필요하고, B 를 생성하려면 A 가 필요하다. 이 때문에 객체를 생성하는 과정에서 무한 루프가 생기거나 ..

Java/기본 2024.11.14