근 10년만에 컴퓨터를 맞추게 되었다.

아직은 그래픽 카드를 구매하지 않아 반본체 상태임.

 

As-is

CPU : i5-4570

메인보드 : ASRock B85M Pro4

램 : DDR3 16G 시금치

글카 : inno 3D 1060 3G

파워 : 기억안남

 

 

To-be

CPU : i7-13700K

메인보드 : GIGABITE Z790 AORUS ELITE

램 : DDR5-5600 KLEVV 흑금치 32G(16x2) -> 나중에 64G로 갈예정

그래픽카드 : MSI Geforce RTX 4090 SUPRIM X

                     GIGABYTE Geforce RTX 4090 Gaming OC D6X 24GB

파워 : FSP HYDRO G PRO 1000W 80PLUS Gold Full Modular ATX 3.0

쿨러 : 3RSYS Socoool RC1800 ARGB (BLACK)

케이스 : 리안리 LANCOOL 216

SSD : 삼성전자 PM9A1 M.2 NVMe 병행수입(1TB)

 

스펙선택 기준

우선 나의 컴퓨터 이용 스타일을 보자면 

스팀게임 고사양(토탈워 등) + 크롬창 수십개 켜놓기 + 프로젝트 빌드

램과 멀티성능 고성능 그래픽 카드가 필요하다. 

그러므로 기왕 맞출거 하이엔드로 맞추려고 투자했고

환율 상승과 물가 상승으로 생각보다 예산이 더 들어갔다..

CPU 언더볼팅, 램오버도 진행할 예정이다.

 

 

제품선택기준

CPU : i7-13700K 

일하는 거는 회사에서 맥북프로를 써서 어짜피 넘사벽이지만

집에서도 i9까지는 아니더라도 i7이상 쓰고 싶었음.

 

메인보드 : GIGABITE Z790 AORUS ELITE

제일 중요하다고 생각하는 부품. 정말 고민을 많이 했는데

MSI Z690 토피도 vs GIGABITE Z790 AORUS ELITE 

(인텔랜 I225v 이슈 vs 고주파)

인텔랜이 LG인터넷과 이슈가 많다고 해서 결국 기가바이트 선택.

현재 메인보드 가격들이 미쳐 돌아가지만

상대적으로 기가바이트가 가격 포지션 정말 잘 잡은거 같음. 

비싸지만 가성비가 좋은거 같아서 선택함.

파워는 같이 못찍었다
rev1.1 버전
ssd 방열판

 

: DDR5-5600 KLEVV 흑금치 32G(16x2)

램오버 적당히 하다가 삼성 시금치 고클럭 나오면 변경 예정.

방열판도 구매했다.

 

파워 : FSP HYDRO G PRO 1000W 80PLUS Gold Full Modular ATX 3.0

파워는 무지성으로 비싸고 좋은거 지름.

 

쿨러 : 3RSYS Socoool RC1800 ARGB (BLACK)

쿨러도 고민을 많이 했는데 작업을 24시간 돌리지 않는 이상 수냉이 필요없다는 결론을 냈음.

언더볼팅도 계획이 있기 때문에 수냉쓰면서 누수위험에 스트레스 받느니

걍 공냉 선택.나중에 심각하게 문제가 되면 바꿀예정.

바꾸게 된다면 아틱프리저 시리즈로 할 예정.

 

케이스 : 리안리 LANCOOL 216

적당한듯?

 

SSD : 가성비로 4세대 중 구매시 젤 싼거일단 무지성으로 질렀음.

1. 삼성 980 PRO(2TB)

2. 삼성 PM9A1 M.2 NVMe 병행수입(1TB)

추가 구입 예정. 아마도 슬롯 꽉 채울듯.

 

그래픽카드 : MSI Geforce RTX 4090 SUPRIM X

GIGABYTE Geforce RTX 4090 Gaming OC D6X 24GB

Colorful  Advanced OC vs  GIGABYTE Gaming OC 

사실 어뱅이 더 끌렸음. 중고도 알아봤지만 가격이 만족스럽지 못했음.

그러던 중 약 2개월 주기로 특가가 뜨는 것을 확인하고(3월 6일 구입) 4월까지 기다릴 수 없어서

가성비 제일 좋은 기가바이트 선택( AS+1년, 이벤트 캐시백).

메인보드도 마찬가지고 기가바이트가 가격 포지션 잘 잡은거 같다.

 

특가로 떠서 기가바이트 환불하고 걍 지름.

찌프림 이슈가 있지만 안고 갈 예정(끝판왕이자나?).

 

굳이 비싼 4090을 선택하는 이유?

1. 자기만족 - 최고성능 짱쎈 4090쓰고 싶다.

2. 4k 고사양게임.

3. AI 공부(?)

 

실제 조립 후 시스템 사진은 추가 예정이다.

Check out 11 Github Repositories that will make you a Good Android developer


1- Google l/0 Android App
https://github.com/google/iosched

2- Android - Clean Architecture- Kotlin

https://github.com/android10/Android-CleanArchitecture-Kotlinnkd.in/d5NZzXGN

 

3- Open Source guides for Android Developers

https://github.com/codepath/android_guides/wikinkd.in/dRyYNeep

 

4- Best practices in Android development

https://github.com/futurice/android-best-practices

 

5- collection of samples using the Architecture Components

https://github.com/android/architecture-components-samplesnkd.in/dVWeJE6v

 

6- Collection of excellent Android UI/UX libraries.

https://github.com/wasabeef/awesome-android-ui

 

7- Another Github Cheatsheet repository for tips and tricks on Android
https://github.com/nisrulz/android-tips-tricks

 

8- Android example with Clean Architecture

https://github.com/mitchtabian/Clean-Notes

 

9- Android Architecture Blueprints is a project to showcase different architectural approaches to developing Android apps.
https://github.com/android/architecture-samples

 

10- Trackr App to explore common Ul patterns

https://github.com/android/trackr

  • && 을 이용하여 명령을 순서대로 실핼할 수 있다.
bhyoo@DESKTOP-MQPJ46K:~/zoo$ ls
birds  mammals  reptiles
bhyoo@DESKTOP-MQPJ46K:~/zoo$ cd birds/ && touch eagle.txt && cd ..
bhyoo@DESKTOP-MQPJ46K:~/zoo$ ls birds/
eagle.txt

 

  • ln [src] [dst] : 심볼릭 링크 생성
bhyoo@DESKTOP-MQPJ46K:~/zoo$ ln -s birds/eagle.txt strongestAnimal.txt
bhyoo@DESKTOP-MQPJ46K:~/zoo$ ls -l
total 0
drwxr-xr-x 1 bhyoo bhyoo 512 Jan 10 15:37 birds
drwxr-xr-x 1 bhyoo bhyoo 512 Jan 10 15:40 mammals
drwxr-xr-x 1 bhyoo bhyoo 512 Jan 10 15:39 reptiles
lrwxrwxrwx 1 bhyoo bhyoo  15 Jan 10 15:41 strongestAnimal.txt -> birds/eagle.txt

 

  • find : 파일 검색
bhyoo@DESKTOP-MQPJ46K:~$ find . -name eagle.txt
./zoo/birds/eagle.txt
bhyoo@DESKTOP-MQPJ46K:~$ find . -empty
./.landscape/sysinfo.log
./.motd_shown
./Documents
./Downloads
./Images
./Videos
./zoo/birds/eagle.txt
./zoo/mammals/koala.txt
./zoo/reptiles/trex.txt

 

  • head [filename]: 파일의 첫 10라인을 출력
bhyoo@DESKTOP-MQPJ46K:~$ head workers.csv
1,Area of Expertise,Name,Hourly Rate,Favorite Number,38.94,35,Nunavut,Storage & Organization,Compression Score
44,Avery 49,Aaron Bergman,4132,1.32,2.88,0.5,Nunavut,Labels,0.36
64,Boston Electric Pencil Sharpener Model 1818 Charcoal Black,Adrian Hane,6535,-19.33,28.15,8.99,Nunavut,Pens & Art Supplies,0.57
33,Self-Adhesive Address Labels for Typewriters by Universal,Alan Barnes,2532,140.01,7.31,0.49,Nunavut,Labels,0.38
34,Accessory37,Alan Barnes,2532,-78.96,20.99,2.5,Nunavut,Telephones and Communication,0.81
89,Avery 506,Alan Barnes,2532,75.13,4.13,0.5,Northwest Territories,Labels,0.39
17,"#10-4 1/8"" x 9 1/2"" Premium Diagonal Seam Envelopes",Allen Rosenblatt,998,93.8,15.74,1.39,Nunavut,Envelopes,0.4
67,Crate-A-Files™,Andrew Gjertsen,6916,-141.27,10.9,7.46,Nunavut,Storage & Organization,0.59
56,Avery Arch Ring Binders,Ann Chong,5894,87.68,58.1,1.49,Nunavut,Binders and Binder Accessories,0.38
57,APC 7 Outlet Network SurgeArrest Surge Protector,Ann Chong,5894,-68.22,80.48,4.5,Nunavut,Appliances,0.55

 

  • cat [filename]: 파일내용 전체출력

 

 

  • grep [needle] [filename] : 파일내용 검색 
bhyoo@DESKTOP-MQPJ46K:~$ grep "carlos" workers.csv -i
13,Holmes HEPA Air Purifier,Carlos Daly,868,134.72,21.78,5.94,Nunavut,Appliances,0.5
14,DS/HD IBM Formatted Diskettes 200/Pack - Staples,Carlos Daly,868,114.46,47.98,3.61,Nunavut,Computer Peripherals,0.71
5,Holmes HEPA Air Purifier,Carlos Soltero,515,30.94,21.78,5.94,Nunavut,Appliances,0.5
6,G.E. Longer-Life Indoor Recessed Floodlight Bulbs,Carlos Soltero,515,4.43,6.64,4.95,Nunavut,Office Furnishings,0.37
22,Avery 52,Carlos Soltero,515,26.92,3.69,0.5,Nunavut,Labels,0.38
23,Plymouth Boxed Rubber Bands by Plymouth,Carlos Soltero,515,-5.77,4.71,0.7,Nunavut,Rubber Bands,0.8
29,Tenex Personal Project File with Scoop Front Design Black,Carlos Soltero,515,-5.45,13.48,4.51,Nunavut,Storage & Organization,0.59

※ 파이프라인( | )을 이용하여 검색도 가능 

bhyoo@DESKTOP-MQPJ46K:~$ cat workers.csv | grep "Carlos"
13,Holmes HEPA Air Purifier,Carlos Daly,868,134.72,21.78,5.94,Nunavut,Appliances,0.5
14,DS/HD IBM Formatted Diskettes 200/Pack - Staples,Carlos Daly,868,114.46,47.98,3.61,Nunavut,Computer Peripherals,0.71
5,Holmes HEPA Air Purifier,Carlos Soltero,515,30.94,21.78,5.94,Nunavut,Appliances,0.5
6,G.E. Longer-Life Indoor Recessed Floodlight Bulbs,Carlos Soltero,515,4.43,6.64,4.95,Nunavut,Office Furnishings,0.37
22,Avery 52,Carlos Soltero,515,26.92,3.69,0.5,Nunavut,Labels,0.38
23,Plymouth Boxed Rubber Bands by Plymouth,Carlos Soltero,515,-5.77,4.71,0.7,Nunavut,Rubber Bands,0.8
29,Tenex Personal Project File with Scoop Front Design Black,Carlos Soltero,515,-5.45,13.48,4.51,Nunavut,Storage & Organization,0.59

 

 

 

  • man : 명령어의 메뉴얼을 볼 수있는 명령어
bhyoo@DESKTOP-MQPJ46K:~$ man man

 

  • pwd : 현재 경로 출력
bhyoo@DESKTOP-MQPJ46K:~$ pwd
/home/bhyoo

 

  • ls : 현재 위치의 파일 표시
bhyoo@DESKTOP-MQPJ46K:~$ ls
Documents  Downloads  Images  Videos

※ -a : 숨김파일 표시

    -l : 상세 리스트포맷

 

  • mkdir : 폴더 생성
bhyoo@DESKTOP-MQPJ46K:~$ mkdir stuff
bhyoo@DESKTOP-MQPJ46K:~$ ls
Documents  Downloads  Images  Videos  stuff

 

  • touch : 파일 생성
bhyoo@DESKTOP-MQPJ46K:~$ cd stuff
bhyoo@DESKTOP-MQPJ46K:~/stuff$ touch the_stuff.txt
bhyoo@DESKTOP-MQPJ46K:~/stuff$ ls
the_stuff.txt

 

  • cp [src] [dst]: 파일 복사
bhyoo@DESKTOP-MQPJ46K:~/stuff$ cp the_stuff.txt other_stuff.txt
bhyoo@DESKTOP-MQPJ46K:~/stuff$ ls
other_stuff.txt  the_stuff.txt

 

  • rm : 파일삭제
bhyoo@DESKTOP-MQPJ46K:~/stuff$ rm other_stuff.txt
bhyoo@DESKTOP-MQPJ46K:~/stuff$ ls
the_stuff.txt

※ -r : 폴더내부의 모든파일을 삭제하고 폴더까지 삭제

bhyoo@DESKTOP-MQPJ46K:~$ rm stuff
rm: cannot remove 'stuff': Is a directory
bhyoo@DESKTOP-MQPJ46K:~$ rm -r stuff
bhyoo@DESKTOP-MQPJ46K:~$ ls
Documents  Downloads  Images  Videos
bhyoo@DESKTOP-MQPJ46K:~$

 

#!/bin/bash
export LANG=ko_KR.UTF-8
echo "Shutdown tomcat now...."
bash /WAS/apache-tomcat-9.0.19/bin/shutdown.sh
echo "tomcat is now terminated..."
sleep 10
if [ -z "`ps -eaf | grep java | grep /WAS/apache-tomcat-9.0.19/bin`" ]; then
        echo "Tomcat was terminated successfully."
else
        ps -eaf | grep java | grep /WAS/apache-tomcat-9.0.19/bin | awk '{print $2}' |
        while read PID
                do
                echo "Killing $PID... "
                kill -9 $PID
                echo "Tomcat is being shutdowned"
                done
fi
 
echo "tomcat restart now"
bash /WAS/apache-tomcat-9.0.19/bin/startup.sh
if [ -z "`ps -eaf | grep java | grep /WAS/apache-tomcat-9.0.19/bin`" ]; then
        echo "Error!!! Cannot start tomcat server."
else
        echo "Tomcat restart succcessfully. "
fi
echo "Job finished"

 

 

 

Java에서 array를 List로 바꾸려면 어떻게 해야될까?

for문을 쓰는것이 당연하지만 왠지 복잡해 보이고..

Arrays.asList가 List를 리턴한다. 간단해 보이므로 이걸쓰자.

 

하지만 잘 살펴보지 않으면 여기에 함정이 있다.

다음 코드를 살펴보자.

 

Integer[] arr = new Integer[]{1, 2, 3, 4, 5};
List<Integer> list = Arrays.asList(arr);
list.add(6);
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.base/java.util.AbstractList.add(AbstractList.java:153)
	at java.base/java.util.AbstractList.add(AbstractList.java:111)
	at ArrayAsList.main(ArrayAsList.java:10)

흠..List인데 add가 안된다?

 

Arrays.asList 구현을 보자.

public static <T> List<T> asList(T... a) {
	return new ArrayList<>(a);
}

ArrayList리턴인데 머지..?

 

하지만 이건 java.util.ArrayList 가 아니다.(머여그럼)

바로 밑에 코드를 보면 Arrays 안에 private static 으로 구현되어있다. 생성자로 array를 받고 전역변수로 array로 관리한다.

 

private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }
        ...
 }

 

그리고 add 메소드가 구현이 안되어있다. AbstractList 로 따라가다 보면 다음과 같이 UnsupportedOperationException을 발생시키는걸 볼 수 있다.

public void add(int index, E element) {
	throw new UnsupportedOperationException();
}

Arrays.asList 에서 나오는 결과로는 동적 List를 만들 수 없다. 

 

동적 List로 만들고 싶다면 오브젝트를 생성하여 반복문으로 새로 값을 할당해야 한다.

'Java' 카테고리의 다른 글

[Java] Wrapper 클래스 Cache  (0) 2020.06.18
[Java] Java에서 Map 관련 Iterate(반복문) 방법  (0) 2016.11.10

 

 

 

다음 코드를 보자.

Integer a = 1000;
Integer b = 1000;

System.out.println(a==b);

출력 : false

 

매우 당연하다. a와 b는 값이 같아도 다른 오브젝트이기 때문이다.

 

그럼 다음 코드를 보자.

Integer a = 127;    
Integer b = 127;

System.out.println(a==b);

출력 : true

 

잉? 당연히 출력이 false일 것이라 예상했지만 아니다.

Java의 일부 Wrapper 클래스들은 내부에서 캐시값을 가지고 있다.

 

Integer 클래스 내부 코드를 살펴보자.

private static class IntegerCache {
	static final int low = -128;
	static final int high;
	static final Integer cache[];

	static {
	// high value may be configured by property
		int h = 127;
		String integerCacheHighPropValue =
		VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
		if (integerCacheHighPropValue != null) {
			try {
				int i = parseInt(integerCacheHighPropValue);
				i = Math.max(i, 127);
				// Maximum array size is Integer.MAX_VALUE
				h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
			} catch( NumberFormatException nfe) {
				// If the property cannot be parsed into an int, ignore it.
			}
		}
		high = h;

		cache = new Integer[(high - low) + 1];
		int j = low;
		for(int k = 0; k < cache.length; k++)
			cache[k] = new Integer(j++);

		// range [-128, 127] must be interned (JLS7 5.1.7)
		assert IntegerCache.high >= 127;
	}

	private IntegerCache() {}
}

private statc으로 IntegerCache 클래스를 가지고 있다.

-128 ~ 127 까지의 오브젝트를 array로 생성해 놓고 있다.

 

high값은 "java.lang.Integer.IntegerCache.high" 세팅으로 수정이 가능하다.

 

그리고 오브젝트를 생성할 때 사용한다.

public static Integer valueOf(int i) {
	if (i >= IntegerCache.low && i <= IntegerCache.high)
	return IntegerCache.cache[i + (-IntegerCache.low)];
	return new Integer(i);
}

 

그러면 캐싱을 왜 사용할까?

 

Java Language Specification(JLS)의 Boxing Conversion 에서 다음과 같이 나와있다.

 

If the value p being boxed is an integer literal of type int between -128 and 127 inclusive (§3.10.1), or the boolean literal true or false (§3.10.3), or a character literal between '\u0000' and '\u007f' inclusive (§3.10.4), then let a and b be the results of any two boxing conversions of p. It is always the case that a == b.

위의 문구에서 숫자 -128~127 까지의 reference가 동일하다고 얘기하고 있다. (boolean 포함, character도 0~127)

 

Ideally, boxing a primitive value would always yield an identical reference. In practice, this may not be feasible using existing implementation techniques. The rule above is a pragmatic compromise, requiring that certain common values always be boxed into indistinguishable objects. The implementation may cache these, lazily or eagerly. For other values, the rule disallows any assumptions about the identity of the boxed values on the programmer's part. This allows (but does not require) sharing of some or all of these references. Notice that integer literals of type long are allowed, but not required, to be shared.
This ensures that in most common cases, the behavior will be the desired one, without imposing an undue performance penalty, especially on small devices. Less memory-limited implementations might, for example, cache all char and short values, as well as int and long values in the range of -32K to +32K.

 

간단히 요약하면 이상적으로는 모든 primitive 값이 boxing이 되면 같은 reference를 가져야 하지만 실제적으로 이것을 모든 부분에 구현하는것은 어렵기 때문에 그래서 일단 일정 범위에 대해서만 java에서 적용하고 실제 구현에 있어서 프로그래머가 알아서 하라고 하는것이다.

'Java' 카테고리의 다른 글

Arrays.asList는 동적 List가 아니다.  (0) 2020.06.19
[Java] Java에서 Map 관련 Iterate(반복문) 방법  (0) 2016.11.10

+ Recent posts