JAVA
1. 생성자 대신 정적 팩터리 메서드를 고려하라
클래스의 인스턴스를 얻는 전통적인 방법은 public 생성자이다. 하지만 클래스는 생성자와 별도로 클래스의 인스턴스를 반환하는 static factory method를 제공 할 수 있다. 이 방식에는 장단점이 모두 존재한다. 장점 1. 이름을 가질 수 있다. 생성자는 매개변수와 생성자만으로는 반환될 객체를 제대로 설명 할 수 없다. 하지만 정적 팩터리 메소드는 네이밍을 통해 반활될 객체의 특성을 설명할 수 있다. 예를들어 생성자인 BingInteger(int , int , Random) 과 정적 팩터리 BingInteger.probablePrime 중, 어느 쪽이 값이 소수인 BigInteger를 반환하는 것에 대하여 잘 설명할 수 있을지를 생각해보자. 프로젝트 중 하나의 인터페이스에서 특정 매개변수를 ..
JAVA 병렬 프로그래밍 [5] - 화장실 스케쥴링
조건 화장실의 칸은 n개 이며, m명의 사람들이 급한 볼 일을 보기 위해 대기한다. 이를 이용하는 사람마다 이용 시간은 최소 1분에서 10분까지 걸린다. 화장실을 대기하는 사람들을 공평하고 안전하게 볼 일을 보고 나갈 수 있도록 시뮬레이터를 작성 처리 조건 화장실 칸 수는 실행 전에 인수로 받도록 하고 각 화장실을 스레드로 구현하도록 한다. 대기 하는 사람은 실행전 인수로 받도록 하고 랜덤 함수에 의하여 생성하도록 한다. 실행을 빨리 돌려야 하므로 1분을 1초로 환산하여 처리하도록 한다. 아래의 예와 같이 1분 단위로 상태 변화를 출력하여 스케줄링 상태를 확인할 수 있도록 한다. 최초 대기열 : [ 1 ( 7 / 7 ) ] [ 2 ( 10 / 10 ) ] [ 3 ( 8 / 8 ) ] [ 4 ( 9 / 9..
![JAVA 병렬 프로그래밍 [4] - Sharing Objects ( 객체 공유 )](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCt62m%2FbtrDYMcpAku%2Ffd9pun5RWp3JK8w2CdoxKK%2Fimg.png)
JAVA 병렬 프로그래밍 [4] - Sharing Objects ( 객체 공유 )
병렬 프로그램 작성은 상태가 바뀔 수 있는 내용을 어떻게 잘 공유해 사용하도록 관리하는 지에 대한 문제라고 했다. 여러 개 스레드에서 특정 객체를 동시에 사용하려 할 때 안전하게 동작하도록 객체를 공유하고 공개해야 한다. 1. 가시성 - 메모리 가시성 : 한 스레드에서 변경한 특정 메모리 값이 다른 스레드에서 제대로 읽어지는지 - 가시성 보장 : mutex , critical section을 사용하여 memory barrier를 만든다. ! mutex , semaphore 란? 뮤텍스란 MUTual EXclusion으로 상호배제 를 뜻한다. Critical Section는 프로그램 상에서 동시에 실행될 경우 문제를 일으킬 수 있는 부분을 지칭한다. 그런 부분을 가진 스레드들의 동작시간이 서로 겹치지 않게..
![JAVA 병렬 프로그래밍 [3] - 멀티 스레드로 1-100까지의 합 구하기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9Utrr%2FbtrD1gKxYSP%2FnTmgIZf3AFWZPMPcBnI6M0%2Fimg.png)
JAVA 병렬 프로그래밍 [3] - 멀티 스레드로 1-100까지의 합 구하기
이번엔 스레드 10개를 이용해서 1-100까지의 합을 구하는 구현을 해보려고 한다. 결과물 [pool-1-thread-1 ] n = 2, sum = 3 [pool-1-thread-10 ] n = 10, sum = 55 [pool-1-thread-9 ] n = 9, sum = 45 [pool-1-thread-8 ] n = 8, sum = 36 [pool-1-thread-2 ] n = 5, sum = 15 [pool-1-thread-3 ] n = 1, sum = 1 [pool-1-thread-5 ] n = 4, sum = 10 [pool-1-thread-7 ] n = 7, sum = 28 [pool-1-thread-6 ] n = 6, sum = 21 [pool-1-thread-4 ] n = 3, sum = ..
![JAVA 병렬 프로그래밍 [2] - Thread Safety](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpIqbx%2FbtrDKHgGx9n%2FyHdVemDbgilptGkCDKn3B0%2Fimg.png)
JAVA 병렬 프로그래밍 [2] - Thread Safety
병렬 프로그래밍이란? 공유되고 변경할 수 있는 상태에 대한 접근 관리를 하는 것이다. 공유 : 여러 스레드가 특정 변수에 접근 할 수 있고 변경 할 수 있다는 의미 이러한 접근 관리에는 스레드 안정성이 필요하다. 스레드 안정성 - 데이터 제어 없이 동시접근을 막음을 의미 - 객체가 스레드에 안전해야 하느냐는 해당 객체에 여러 스레드의 접근여부에 달렸다. - 스레드가 하나 이상의 상태 변수에 접근하고 그 중 하나 이상의 변수에 값을 쓰면 , 해당 변수에 접근 할 때 관련된 모든 스레드가 동기화 조율 대상 JAVA의 동기화 수단 - synchronized 키워드 - volatile, 명시적인 lock, 단일 연산 변수(atomic variable) ! 여러 스레드가 변경 할 수 있는 상태 변수를 적절한 동기..
JAVA 병렬 프로그래밍 [1]
프로그램을 제대로 돌아가게 작성하는 일은 정말 어렵다. 하지만 여러 작업을 동시에 실행하는 프로그램을 제대로 돌아가게 작성하기는 훨씬 더 어렵다. 그럼에도 불구하고 왜 작업을 동시에 실행하는 문제에 신경을 써야할까? 스레드는 자바 언어에서 피할 수 없는 특성이고, 복잡한 비동기 코드를 더 단순한 순차적 코드로 바꿔 복잡한 시스템을 단순하게 개발할 수 있게 해주기 때문이다. 초창기 컴퓨터에는 운영체제 자체가 없었다. 운영체제 없이 하드웨어 위에서 바로 실행되는 프로그램은 작성하기도 힘들었을 뿐만 아니라 한 번에 하나의 프로그램만 실행하느라 그 값비싸던 자원을 비효율적으로 사용 할 수 밖에 없었다. 영화 이미테이션 게임에 나오는 튜링머신과 같이, 배선이나 진공관을 직접 계산시마다 바꿔줘야 했기 때문에 다수의..
![[JAVA] SOLID 객체지향 설계 5원칙](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frtk2Y%2FbtruiQWisk6%2FKWfhptNSlR8kTwDkuVJlE0%2Fimg.png)
[JAVA] SOLID 객체지향 설계 5원칙
이번 포스팅에선 객체지향 설계 5원칙인 SOLID에 대해 알아보려고 한다. 객체지향의 4가지 특성인 캡슐화, 추상화, 다향성, 상속과 더불어 설계 원칙을 공부해보자. SOLID 는 자기 자신 클래스의 응집도는 내부적으로 높이고 , 타 클래스들간 결합도는 낮추는 High Cohesion - Loose Coupling 원칙을 객체 지향의 관점에서 도입한 것 이다. 정보처리자격증을 공부할 때, 응집도가 높고 결합도가 낮을 수록 객체지향의 설계에 적합하고, 이렇게 설계된 SW는 재사용성이 증가하고, 수정이 최소화 되기 때문에 유지보수가 용이해진다고 배웠다. SRP ( Single Responsibility Principle ) 단일 책임 원칙 " 어떤 클래스를 변경해야 하는 이유는 오직 하나 뿐이어야 한다" 클..
[JAVA] Static과 Final
Static이란? java에서 Static 키워드를 사용한다는 것은 메모리에 한번 할당되어 프로그램이 종료될 때 해제되는 것을 의미한다. 일반적으로 우리가 만든 Class는 Static 영역에 생성되고 , new 연산을 통해 생성한 객체는 Heap 영역에 생성된다. 객체 생성 시 할당된 힙은 가비지 컬렉터를 통해 수시로 관리를 받는다. 하지만 Static 키워드를 통해 Static 영역에 할당된 메모리는 모든 객체가 공유하는 메모리가 되고, 가비지컬렉터의 관리 영역 밖에 존재하므로 프로그램 종료시 까지 메모리가 할당된 상태로 존재한다. 때문에 자주 사용하게 되는 static은 성능에 도움을 줄 수 있지만 자주 사용하지 않는 프로그램이나 static을 무분별하게 사용한다면 성능에 악영향을 주게 된다. 전에..
![[JAVA] 스택과 힙 , 가비지 컬렉터](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSpYFc%2Fbtrul22jf1R%2Fx3iKPk8hgEo5gfiFX8kLa0%2Fimg.jpg)
[JAVA] 스택과 힙 , 가비지 컬렉터
자바에서 일반적으로 구성되는 메모리의 구조는 다음과 같이 Stack 과 Heap 메모리로 구성된다. Stack 스택 메모리는 heap 영역에 존재하는 객체들에 대한 참조를 가지고 있다. 또한 객체들 뿐만 아니라 기본형 타입 , main() 함수를 포함한 각 함수의 지역변수도 Stack 메모리 영역에 저장된다. Stack에 존재하는 변수들은 유효범위(scope)라고 하는 특정한 가시성을 가진다. 오직 활성화 된 범위의 객체들만 사용이 가능하다. scope란 무엇일까? 유효범위는 쉽게 말하면 명명충돌을 방지하는 기능이라고 생각하면 되겠다. public class DemoScope { static void a () { int i = 0; } public static void main(String[] args)..
![[JAVA] String에서 ==와 equals()의 차이점](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyRbDm%2FbtrtTMyvhC0%2F1tZvhoL7NVd9QYoX5MwQOK%2Fimg.png)
[JAVA] String에서 ==와 equals()의 차이점
전에 작성한 포스팅 중, null과 inEmpty의 차이점에 대해 작성했던 적이 있었다. isEmpty와 ==null - 객체가 비어있는지 확인하는 방법 — 간편 웹프로그래밍 (tistory.com) isEmpty와 ==null - 객체가 비어있는지 확인하는 방법 객체가 비어있는지 확인할 때에는 'isEmpty'와 '==null'을 사용한다. 두가지의 차이점은 isEmpty()는 객체가 값이 존재하지 않으면 true를 리턴한다 ex ) String a =""; 이면 true 객체에 ""라는 값(a)이 들어가 kimfk567.tistory.com 이번엔 ==과 equals()에 대해 포스팅해보려고 한다. 일단 null은 메모리영역이 아예 비워있을 때 true이고, isEmpty는 객체가 비어있을 때 tru..