Thread
·
java
#Thread란?Java로 프로그램을 만들다 보면 자연스럽게 마주치는 개념이 프로세스(Process)와 스레드(Thread)다.처음 접할 때는 단순히 병렬 실행 정도로 이해하기 쉽지만 실제로는 그보다 다양한 상황에 쓰인다.이번 글에서는 기본 구조부터 직접 구현한 예제까지 한 번에 정리해 본다.# 프로세스와 스레드의 역할운영체제에서 프로그램이 실행되면 하나의 프로세스가 만들어진다.프로세스 안에는 기본적으로 메인 스레드(main thread)가 존재하고우리가 코드에서 생성하는 스레드는 여기에 추가로 붙는 작업 단위라고 보면 된다.프로세스(Process): 실행 중인 프로그램 전체스레드(Thread): 프로세스 내부에서 실제로 작업을 수행하는 흐름(실행 단위)한 프로세스에는 최소 1개의 메인 스레드가 존재# ..
Stream
·
java
# Java StreamJava의 Stream은 데이터 처리 방식을 간결하게 만들기 위해 도입된 기능으로 원본 데이터를 변경하지 않고 별도의 메모리에서 동작한다.주로 Collection(List, Set 등)을 대상으로 사용되며 선언형 스타일로 데이터를 처리할 수 있다.# Stream의 구조Stream은 크게 세 단계로 구성된다.1) 생성 (Create)배열 또는 컬렉션에서 스트림을 만든다.2) 중간 연산 (Intermediate Operation)원하는 방식으로 가공한다.대표 연산: map, filter, sorted 등→ 여러 번 이어 붙일 수 있음→ 중간연산은 Lazy, 즉 최종연산이 실행될 때 실제로 동작한다.3) 최종 연산 (Terminal Operation)결과를 만든다.대표 연산: forEa..
Lambda Expression(=람다식)
·
java
# 람다식이란?Java에서 람다식은 익명 함수를 간단하고 직관적으로 표현하기 위한 문법이다.특히 추상 메서드가 하나만 존재하는 인터페이스(함수형 인터페이스)를 구현할 때 자주 사용되며 불필요한 클래스 선언 없이 간편하게 동작을 전달할 수 있다.# 람다식 기본 문법(parameter) -> expression() : 매개변수 선언-> : 함수의 동작을 표현expression 또는 {... } : 실행할 코드(parameter) -> { expression }여러 줄의 코드가 필요한 경우 중괄호 { }를 사용한다. # 람다식 문법 예시1) 매개변수가 없는 경우() -> System.out.println("A");2) 매개변수가 하나인 경우x -> x * x;3) 매개변수가 여러 개인 경우(a, b) -> a..
Generic Type(=제네릭 타입)
·
java
# 제네릭이란?Java에서 제네릭은 코드를 재사용하기 쉽게 만들고 동시에 타입 안정성(type safety) 을 보장하기 위한 문법이다.클래스나 메서드를 선언할 때 타입을 미리 정하지 않고 실제 사용할 시점에서 타입을 결정하는 형태로 동작한다.제네릭은 (다이아몬드) 기호로 표현된다.제네릭을 사용할 경우 컴파일 시점에서 타입을 보장할 수 있어 형변환 오류처럼 런타임에서 발생하는 문제를 방지할 수 있다.# 제네릭을 사용하는 이유타입 안정성(Type Safety)제네릭을 사용하지 않으면 모든 값이 Object 형태로 저장된다.이 경우 꺼낼 때 직접 캐스팅해야 하고 잘못된 타입으로 캐스팅하면 런타임 오류가 발생한다.List list = new ArrayList();list.add("hello");list.add..
Abstract class(=추상화)
·
java
# 추상화란?시스템에서 중요한 개념만 노출시키고 세부 구현은 감추는 객체지향 기법이다.실무에서는 서비스, API, 모듈화 시스템에서 많이 사용한다.특징일반 메서드 + 추상 메서드 동시 사용 가능하위 클래스는 추상 메서드 반드시 구현 (강제 구현)new 연산자 사용 불가abstract 키워드 사용 예제: 데이터베이스 트랜잭션 처리public abstract class Authenticator { // 인증 방식별로 구현 protected abstract boolean validateCredentials(String name, String password); public void login(String name, String password) { if(validateCredent..
Encapsulation(=캡슐화)
·
java
# 캡슐화(Encapsulation)캡슐화란 변수와 함수를 하나의 단위로 묶는 것이다.클래스는 변수 + getter/setter + 메서드를 묶어 객체를 정의한다.외부에서 객체의 내부 상태를 직접 변경하지 못하도록 private 접근 제한자를 사용한다.예제: 시간 클래스public class TimeT { private int hour; public int getHour() { return hour; } public boolean setHour(int hour) { if (hour 24) return false; this.hour = hour; return true; }}hour 변수를 직접 접근하지 않고 getter/sett..
Java 문법 – Overload vs Override
·
java
# 다형성, 오버로딩/오버라이딩, equals/hashCode자바에서 객체 지향 프로그래밍을 이해하기 위해 알아야 할 개념 중 하나가 다형성(Polymorphism)이다.다형성을 이해하면 메서드 재사용과 코드 확장을 더 효율적으로 관리할 수 있다.# 다형성(Polymorphism)다형성은 하나의 이름이 여러 형태로 동작할 수 있는 성질을 의미자바에서 대표적으로 나타나는 형태는 오버로딩(Overloading)과 오버라이딩(Overriding)이다.# 오버로딩 (Overloading)같은 클래스 안에서 메서드 이름은 같지만 매개변수 개수나 타입이 다른 경우반환타입만 다른 경우는 오버로딩 불가void simpleMethod(int n) {...}void simpleMethod(int n, double d) {..
Java 문법 – 변수, 메서드, 다형성, CallByValue/Reference
·
java
# 변수, 메서드, 다형성, CallByValue/Reference자바를 공부하면서 가장 많이 마주치는 개념 중 하나는 변수의 종류, static 키워드, 메서드, 객체 전달 방식이다.이번 글에서는 구체적인 코드 예제와 함께 개념과 차이점을 정리한다.# 변수의 종류와 메모리 구조 변수 종류 선언 위치 메모리 할당 시점 소멸 시점 클래스 변수= static 변수클래스 영역클래스가 메모리에 올라갈 때 (정적 바인딩 → 메소드 영역)프로그램 종료 시인스턴스 변수= 멤버 변수클래스 영역인스턴스가 생성될 때 (new 키워드 → 힙 영역)GC가 구동될 때지역 변수함수, 생성자, 초기화 블록 등스택 영역함수 블록 종료 시예제 – Person 클래스public class Person { static int ..
Java 문법 - 클래스, 진법, 비트 연산
·
java
# 클래스, 진법, 비트 연산자바를 공부하다 보면 클래스, 숫자 표현, 비트 연산을 이해하는 것이 중요하다.이번 글에서는 자바 윈도 애플리케이션 구성과 진법 변환, 비트 연산 예제를 중심으로 설명한다.# 자바 프로그램 구성자바 프로그램은 하나 이상의 클래스(class)로 구성된다.클래스는 필드(변수)와 메서드(함수)를 포함할 수 있다.class Student { int age; void moveHome() { System.out.println("집에갑니다"); } } main() 메소드자바 프로그램이 실행되면 먼저 main() 메서드를 찾아 순차적으로 실행하나의 자바 프로그램에는 반드시 main() 메소드를 가진 클래스가 존재해야 한다.public class Helloworl..
OOP란?
·
java
# OOP란 무엇인가?프로그래밍을 공부하다 보면 절차지향과 객체지향이라는 개념을 마주치게 된다.둘의 가장 큰 차이는 데이터(상태)와 행동(동작)을 어떻게 조직하느냐에 있다.# 절차지향 vs 객체지향절차지향(Procedural Programming)프로그램이 함수와 절차 중심으로 구성된다.상태(데이터)와 행동(함수)이 서로 분리되어 있다.흐름 중심으로 코드를 작성하며 함수 호출 순서에 따라 프로그램이 동작한다.class Main { public static void main(String[] args) { int a = 8; int b = 10; int sum = sumFunc(a, b); System.out.println(sum); } pu..