JAVA 11

[JAVA] 객체 생성 전략 - 정적 팩토리 메서드 & 빌더 패턴

부트캠프를 다닐 때 이펙티브 자바 책을 받았다. 그 중 초기 부분에는 정적 팩토리 메서드와 빌더 패턴에 대해서 설명한다.(사실 부트캠프 초기에는 이펙티브 자바가 너무 어려웠어서 이해하지 못했다... 이제는 조금씩 읽히는게 그만큼 실력이 늘었나 뿌듯하다.) Car car = new Car(); 라는 단순한 생성자 사용을 지양하고 정적 팩토리 메서드나 빌터 패턴을 사용하는 데에는 불변 객체의 캡슐화 라는 의미가 가장 크다고 생각한다.   하지만 두 패턴 중 어떤게 더 나은 방법인지, 어떨때 써야하는지에 대한 개인적인 방향성은 항상 잡지 못했었다. 두 방식을 다시 공부해보며 개인적인 선택 기준을 정립하고자 이 글을 적게 되었다.  1. 정적 팩토리 메서드 (static factory method)정적 팩토리 ..

JAVA 2024.05.08

자료구조 Collection - List, Set, Map

1. Collection 자바에서 컬렉션이란 데이터의 집합, 그룹을 의미한다. JCF(Java Collections Framework)는 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다. 주요구현체 List, Set, Map 2. List 저장공간이 필요에 의해 자동으로 늘어난다. 입력순서 유지 O, 데이터의 중복 허용 O ArrayList - 단방향 포인터 구조 - 데이터 순차적 접근 (조회에 용이하다) LinkedList - 양방향 포인터 구조 - 데이터 삽입, 삭제가 빠르다 - 스택, 큐, 양방향 큐 등을 만들기 위한 용도로 쓰인다. - Iterator를 사용한다. Iterator : 추출 전용 인터페이스 데이터를 추출하기 위한 데이터 임시 저장공간..

JAVA 2023.06.02

[JAVA] 멀티쓰레드 & 동기화/비동기화 & Sync/Async

1. 멀티스레드 실제 동시에 처리될 수 있는 프로세스의 개수는 CPU 코어의 개수와 동일한데, 이보다 많은 개수의 프로세스가 존재하기 때문에 모두 함께 동시에 처리할 수는 없다. 각 코어들은 아주 짧은 시간동안 여러 프로세스를 번갈아가며 처리하는 방식을 통해 동시에 동작하는 것처럼 보이게 한다. 이와 마찬가지로, 멀티스레딩이란 하나의 프로세스 안에 여러개의 스레드가 동시에 작업을 수행하는 것을 말한다. 스레드는 하나의 작업단위이다. 멀티스레드 적용하기 위한 조건 병행성(concurrency) : 다수의 스레드 생성방법 존재 동기화(synchronization) : 작업이 방해받지 않고 각 스레드의 동기화 방법 존재 통신(communication) : 서로 다른 스레드가 정보를 교환할 수 있는 방법이 존재..

JAVA 2023.02.06

[JAVA] Thread 란

1. Thread (스레드) 더보기 스레드란 하나의 작업 단위이다. Runnable 인터페이스 구현 Thread 클래스 상속 모두 run() 메소드를 오버라이딩 한다. public class MyThread implements Runnable { @Override public void run() { // 수행 코드 } } public class MyThread extends Thread { @Override public void run() { // 수행 코드 } } 하지만 두 방법은 인스턴스 생성 방법에 차이가 있다. Runnable 인터페이스를 구현한 경우, 해당 클래스를 인스턴스화해서 Thread 생성자에 argument로 넘겨줘야한다. 그리고 run()을 호출하면 Runnable 인터페이스에서 구현..

JAVA 2023.02.06

[JAVA] GC 동작 알고리즘

1. GC 대표적인 알고리즘 2가지 Reference Counting Root Space : 스택 변수, 전역 변수 등 heap 영역 참조를 담은 변수 Reference Count : 몇 가지 방법으로 해당 객체에 접근할 수 있는지를 뜻한다. 카운트가 0이 되면(객체에 접근할 수 있는 방법이 0이 되면) GC에 의해 삭제된다. 순환참조 문제 등의 한계점이 있다. Mark and Sweep 루트에서부터 해당 객체에 접근 가능한지를 해제의 기준으로 삼는다. 루트부터 그래프 순회를 통해 연결된 객체들을 찾아내고(Mark) 연결이 끊어진 객체는 삭제한다.(Sweep) 루트로부터 연결된 객체는 Reachable이라 한다. (반대는 Unreachable) Sweep 이후 분산되어 있던 메모리를 한 곳으로 정리하는 ..

JAVA 2023.02.05

[JAVA] Call by Value & Call by Reference

1. Call by Value 값에 의한 호출 함수가 호출될 때, 메모리 공간 안에서는 함수를 위한 별도의 임시공간이 생성된다.(종료 시 사라짐) call by value 호출 방식은 함수 호출 시 전달되는 변수 값을 복사해서 함수 인자로 전달 이때 복사된 인사는 함수 안에서 지역적으로 사용되기 때문에 지역변수 속성을 가진다. 따라서 함수 안에서 인자 값이 변경되더라도 외부 변수 값은 변경 안됨 동작 방식 프로그래머가 어떤 함수를 호출한다고 하면 Stack 메모리에 먼저 함수의 Return Address가 쌓이고 그 위에 매개변수 등의 값이 쌓이게 된다. main 함수를 호출하였기 때문에 main 함수의 내용이 Stack에 먼저 존재할 것이고, 그 중에서 지역 변수로 선언한 someValue가 존재할 것..

JAVA 2023.02.05

[JAVA] 예외처리와 올바른 예외처리 방법

1. 에러와 예외 에러 : 프로그램 코드에 의해서 수습될 수 없는 심각한 오류 예외 : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 체크 예외 언체크 예외 체크예외 체크예외는 복구가능성이 있는 예외이므로 반드시 예외를 처리하는 코드를 함께 작성해야 한다. 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 ex) IOException, SQLException 예외를 처리하지 않으면 컴파일 에러가 발생한다. 실제 프로그래밍에서 발생하는 예외들은 복구 불가능한 경우가 많다. 예를 들어 SQLException과 같은 DB예외는 체크 예외를 catch해도, 쿼리를 수정하여 재배포하지 않는 이상 복구되지 않는다. 따라서 실제 개발에서는 대부분 언체크 예외를 사용한다. 언체크예외 복구가능성이 없는 ..

JAVA 2023.01.29

[JAVA] Object 클래스 - equals와 hashCode 함수

1. equals와 hashCode equals와 hashCode는 모든 JAVA 객체의 부모 객체인 Object 클래스에 정의되어 있다. 따라서 모든 JAVA 객체는 Object 클래스의 함수를 상속받는 것이다. equals() boolean equals(Object obj)로 정의된 equals 메소드는 기본적으로 2개의 객체가 동일한지 검사하기 위해 사용된다. equals가 구현된 방법은 2개의 객체가 참조하는 것이 동일한지를 확인하는 것이며, 이는 동일성(Identity)을 비교하는 것이다. 즉, 2개의 객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체가 된다. public boolean equals(Object obj) { return (this == obj); } 그러나 실제 프..

JAVA 2023.01.29

[JAVA] static에 대하여

1. Static이란 자바에서 static 키워드를 사용한다는 것은 메모리에 한 번 할당되어 프로그램이 종료될 때 해제되는 것을 의미한다. 이를 정확히 이해하기 위해선 메모리 영역을 알아야 한다. Class는 Static 영역에 생성된다. new 연산을 통해 생성된 객체는 Heap 영역에 생성된다. 객체의 생성시에 할당된 Heap 영역의 메모리는 가비지 콜렉터(GC)를 통해 수시로 관리된다. Static 키워드를 통해 Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리 GC영역밖에 존재하므로 Static을 과용할 경우 시스템의 퍼포먼스에 악영향을 주게 된다. static 변수와 static 메소드는 객체가 생성되기 이전에 이미 할당되어 있다. 따라서 객체의 생성없이 바로 사용할 수 있다. 2..

JAVA 2023.01.29

[JAVA] 객체지향언어2

1. 상속 상속관계 기존의 클래스를 재사용하여 새로운 클래스를 작성 생성자와 초기화블럭은 상속되지 않는다. 멤버만 상속된다. 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다. class Parent{ //조상클래스 int age; } class Child extends Parent { //자손클래스 void play() { System.out.printkln("놀자~"; } } class grandChild extends Child { int weight; } //Parent 클래스의 멤버는 age //Child 클래스의 멤버는 age, play() //greandChild 클래스의 멤버는 age, Play(), weight class ParentTest { public static void..

JAVA 2023.01.29