2026/05 22

자료구조, 알고리즘과 Big O

1. 자료 구조와 Big O1 - 1. 선형 자료구조의 성능ArrayList VS LinkedListArrayList는 조회 속도가 매우 빠르지만 중간 삽입/삭제는 느리다.ArrayList는 연속된 메모리 공간에 데이터를 저장하므로 CPU 캐시 효율이 높다.LinkedList는 중간 삽입/삭제에 유리하지만, 인덱스 접근은 느리다.LinkedList는 분산된 노드를 참조하므로 메모리 접근 비용이 크다.실제로 중간 삽입/삭제가 많지 않다면 대부분의 경우 ArrayList가 더 효율적이다.대용량 데이터를 처리할 때는 메모리 사용량도 성능에 영향을 주므로, 자료구조 선택 시 구조적 차이뿐만 아니라 메모리 최적화 측면도 고려해야 한다.Stack & Queue기본적으로 두 자료구조는 양 끝에서만 접근하기 때문에, ..

자바 고급(JAVA) 2026.05.28

Big O에 대한 이해

1. 알고리즘 성능 분석의 필요성1 - 1. 사용자 경험과 성능의 관계사용자는 시스템이 얼마나 빨리 반응하는지를 체감하며, 대기 시간이 길수록 이탈률이 높아진다. 따라서 응답속도는 사용자 만족도에 직결된다.따라서 성능이 느린 애플리케이션은 첫 방문 시 나쁜 인상을 주게 되고, 장기적으로 사용자의 반복 방문률에도 영향을 준다. 이는 커머스, 콘텐츠 플랫폼 등에서 고객 유지율과 직접 연결된다.모바일 네트워크 환경이나 성능이 낮은 디바이스에서는 알고리즘 효율성이 더 중요하다. 따라서 리소스가 제한된 환경에서는 효율적인 코드가 사용자 경험을 좌우한다.1 - 2. 시스템 자원과 비용의 관계클라우드 기반 인프라에서는 자원 사용량이 곧 요금으로 이어진다.CPU, 메모리, 네트워크 자원을 과도하게 사용하는 알고리즘은..

자바 고급(JAVA) 2026.05.28

JCF 주요 인터페이스

1. List 컬렉션List는 객체를 일렬로 저장하고 인덱스로 관리하는 자료구조로, 배열과 유사하지만 크기가 동적으로 변하고 다양한 편의 메서드를 제공한다. 또한 저장된 순서를 유지하며, 중복된 객체 저장도 허용한다. 대표적인 구현 클래스는 아래와 같다.ArrayListLinkedListVectorStack1 - 1. ArrayList가장 널리 사용되는 List의 구현 클래스. 배열 기반 구조로, 인덱스를 통한 빠른 검색이 장점이며, 내부 배열의 크기를 초과하면 자동으로 크기를 늘려준다. 하지만 중간 삽입/삭제 시에는 배열 이동이 필요하므로 느릴 수 있다.1 - 2. LinkedList연결 리스트 자료구조 기반 구조로, 삽입/삭제가 빠르고 검색이 느리다. 각 요소는 이전/다음 요소의 참조 주소를 저장하고..

자바 고급(JAVA) 2026.05.21

JCF의 필요성과 구조 이해

1. 배열의 한계와 컬렉션의 필요성배열 : Java에서 가장 기본적인 자료구조. 간단하고 성능이 빠르지만, 실무에서는 다양한 이유로 배열만 사용하는 것에 부족함을 느낌JCF(Java Collection Framework) : 배열의 단점을 보완하기 위해 등장한 것. 1 - 1) 배열의 한계1) 고정 크기의 한계배열은 한 번 크기를 지정하면 변경이 불가능하다.배열의 크기가 부족하면 새로운 배열을 생성한 뒤 직접 복사해야 한다.현실 세계의 데이터는 수시로 추가되거나 삭제되는 경우가 많다.2) 타입 안정성 문제배열은 기본형 배열 외에도 객체 배열 선언이 가능하다.하지만 object[] 배열로 선언하면 모든 타입이 저장 가능해지며, 이 경우 런타임 타입 오류가 발생할 수 있다.3) 편의 기능 부족배열은 모든 로..

자바 고급(JAVA) 2026.05.20

익명 클래스(Anonymous Class)

1. 익명 클래스란?이름이 없는 클래스로 일회성으로 사용될 클래스를 정의할 때 유용하며, 주로 인터페이스나 추상 클래스의 구현체를 즉석에서 정의할 때 사용된다. 별도의 클래스를 만들지 않고도 간단하게 원하는 동작을 구현할 수 있어, 이벤트 처리나 콜백 처리 등에 자주 활용된다.1-1. 기본 형식인터페이스의 경우인터페이스타입 변수 = new 인터페이스타입() { // 추상 메서드 구현};추상 클래스의 경우추상클래스 변수 = new 추상클래스() { // 추상 메서드 구현};※ Java 8이후, 함수형 인터페이스를 사용하는 경우라면 익명 클래스는 람다식으로 데체할 수 있다.// 변환 예시btn.setOnClickListener(() -> System.out.println("클릭됨"));1-2. 한..

자바 고급(JAVA) 2026.05.18

내부 클래스(Inner Class)

1. 내부 클래스란?클래스 내부에 선언된 또 다른 클래스로, 외부 클래스의 멤버(필드/메서드)에 자유롭게 접근할 수 있으며, 밀접하게 관련된 기능을 함께 묶어 설계할 수 있도록 도와준다. 또한, 내부 클래스를 활용하면, 코드의 응집도를 높이고, 캡슐화를 강화할 수 있다.1-2. 내부 클래스의 종류구분선언 위치외부 클래스 접근 가능 여부특징1. 인스턴스 내부 클래스외부 클래스의 멤버 위치외부 인스턴스 변수 접근 가능외부 클래스와 강한 결합2. 정적(static) 내부 클래스외부 클래스의 멤버 위치외부의 static 멤버만 접근 가능static 키워드 사용, 독립성 높음3.지역 내부 클래스외부 클래스의 메서드 또는 초기화 블록 내부final 또는 effectively final 지역 변수 접근 가능메서드 ..

자바 고급(JAVA) 2026.05.15

SOLID 원칙 - DIP(Dependency Inversion Principle)

1. DIP의 핵심 개념구체적인 클래스에 직접 의존하지 말고, 인터페이스(추상화)에 의존의존 방향을 뒤집어서, 유연하고 확장 가능한 구조를 만든다.※ DI(Dependency Inversion)과 DI(Dependency Injection)이 이니셜로 나타내면 똑같기 때문에 헷갈리는 경우가 많다. 핵심적으로 보면 같은 개념을 다른 관점에서 설명하는 것이라고 이해하면 편하다.1 - 1. 고수준 모듈과 저수준 모듈- 고수준 모듈 : 핵심 비즈니스 로직 (주문 서비스, 결제 처리 등)- 저수준 모듈 : 세부 구현 로직 (파일 저장, 데이터베이스 연동 등)interface Logger { void log(String msg);}class FileLogger implements Logger { publ..

자바 고급(JAVA) 2026.05.15

SOLID 원칙 - ISP(인터페이스 분리 원칙)

1. ISP란? - 하나의 커다란 인터페이스보다는 작고 구체적인 인터페이스 여러 개로 나누는 것이 좋다는 원칙이다. - 왜 중요할까? - 인터페이스가 너무 크면, 사용하지 않는 기능까지 구현해야 해서 불필요한 의존성과 결합이 생긴다. - 사용자는 자신이 필요한 기능만 정의된 인터페이스에 의존해야 유지보수가 쉬워진다.1 - 1. 인터페이스의 분리 기준 - 핵심 개념하나의 거대한 인터페이스를 쪼개서, 필요한 기능만 포함된 인터페이스를 각각 제공하자.작고 응집도 높은 인터페이스를 여러 개 만드는 것이 더 좋은 설계이다.interface Printer { void print();}interface Scanner { void scan();}interface Fax() { void fax..

자바 고급(JAVA) 2026.05.15

SOLID원칙 - LSP(리스코프 치환 원칙)

1. LSP란?- 상위 타입(부모 클래스)으로 하위 타입(자식 클래스)을 사용해도 프로그램의 동작에 문제가 없어야 한다는 원칙1 - 1. 계약에 의한 설계계약이란?메소드의 입력 조건(사전조건), 출력 조건(사후조건), 불변 조건 등을 명확하게 정해놓고 지키는 설계 방식LSP는 "자식 클래스도 이 계약을 지켜야 한다"는 원칙하위 클래스가 부모의 메소드를 재정의하더라도, 기존 계약을 위반해서는 안된다.위반 예시class Bird { void fly() { System.out.println("날아간다"); }}class Ostrich extends Bird { void fly() { throw new UnsupportedOperationException(); }}Ostrich는 Bird지만 날지 못..

자바 고급(JAVA) 2026.05.15

SOLID 원칙 - OCP(Open/Closed Principle)

1. OCP란? - Open-Closed Principle : “확장에는 열려 있고, 수정에는 닫혀 있어야 한다”는 설계 원칙으로 새 요구사항이 생겼다고 해서, 기존 클래스를 매번 수정하면 오류 위험 증가와 유지보수 비용 상승의 문제가 있기 때문에 기존 코드를 변경하지 않고, 새로운 기능은 확장을 통해 추가할 수 있도록 설계하라는 뜻이다. - 확장과 수정의 분리interface PayStrategy { void pay();}class CardPay implements PayStrategy { public void pay() { System.out.println("카드 결제"); }}class KakaoPay implements PayStrategy { ..

자바 고급(JAVA) 2026.05.14