반응형

사경인 회계사님이 쓴 재무제표 모르면 주식투자 절대로 하지마라에 나오는 공식인 S-RIM을 계산하여 해당하는 종목을 매주 제공합니다.

 

재무제표 정보를 제공하는 사이트(http://comp.fnguide.com)를 크롤링하여 필요한 정보를 구했습니다.

 

특히, ROE 같은 경우는  당해에 컨센서스가 추측하는 ROE를 기준으로 하였고, 컨센서스가 존재하지 않을 경우 대상에서 제외합니다.

 

목표 수익률은 9%로 하였습니다.

 

당기순이익이 어떠한 이유로 인해(투자, 매각 등) 너무 높아 ROE가 비정상적으로 다른 해보다 높은 기업이 존재합니다.

따라서 아래 종목 리스트는 투자에 참고만 해주시고, 반드시 해당 기업의 재무제표를 다시 확인해주시기 바랍니다.

 

종목명 시가총액 현재가격 매수가격 중간가격 매도가격
NAVER 669373 407500 512701 780744 1644441
기아 338073 83400 92386 101469 130739
POSCO 264612 303500 592496 632810 762708
KB금융 239505 57600 110747 112858 119661
SK텔레콤 224828 312000 370223 381915 419590
신한지주 206898 40050 90391 91046 93157
LG 148807 94600 148111 161076 202850
하나금융지주 138562 46150 110743 112813 119482
HMM 117361 28950 39189 58136 119188
우리금융지주 92828 12750 34449 34963 36618
한화솔루션 81963 42850 45603 48202 56577
롯데케미칼 81404 237500 438085 461800 538218
LG유플러스 64837 14850 17636 17848 18533
LG디스플레이 63691 17800 36650 38359 43863
CJ제일제당 59313 394000 410540 431159 497596
미래에셋증권 56162 8840 16643 17237 19152
금호석유 54385 178500 280369 383883 717427
한국금융지주 48816 87600 160052 194723 306441
DB손해보험 46799 66100 95016 98714 110628
삼성증권 43087 48250 76097 85013 113744
GS 40790 43900 105366 111583 131615
NH투자증권 36865 13100 23862 26166 33589
GS건설 35302 41250 54730 56772 63353
메리츠증권 33541 4920 8262 9083 11728
팬오션 32823 6140 6355 6839 8396
KCC 31280 352000 609006 614478 632112
키움증권 28317 108000 206207 249913 390745
포스코인터내셔널 27451 22250 28885 30478 35610
대우건설 27306 6570 9125 10506 14957
효성티앤씨 26096 603000 683419 1011231 2067513
현대해상 25613 28650 51675 51686 51718
한화 25186 33600 71037 77449 98111
효성 22335 106000 146778 171077 249371
영원무역 20317 45850 46151 47491 51810
DGB금융지주 18014 10650 31078 31170 31465
JB금융지주 17709 8990 21695 22899 26778
HDC현대산업개발 17103 25950 47466 50322 59524
동국제강 16319 17100 31847 37541 55889
두산 15929 96400 151558 182579 282538
DL 14250 68000 302910 385963 653578
SK가스 13245 143500 229510 236217 257828
대한유화 13195 203000 323656 334520 369524
유니드 10979 123500 154525 189930 304011
LX인터내셔널 10969 28300 50838 59630 87959
한섬 10689 43400 48090 48688 50616
GS홈쇼핑 10165 154900 198218 205333 228258
풍산 9500 33900 63278 68749 86378
대한해운 9017 2825 3784 4104 5134
동원산업 8459 230000 381471 393173 430880
대상 8368 24150 34478 35679 39547
현대건설기계 8235 41800 69727 71004 75119
동원F&B 8143 211000 217479 228290 263124
세아베스틸 8105 22600 52335 55309 64892
SNT모티브 7648 52300 57629 58899 62994
현대두산인프라코어 7372 9270 14001 15004 18233
코오롱글로벌 6441 25550 32615 40526 66018
국도화학 6136 68100 110750 140779 237540
한국토지신탁 5971 2365 3994 4164 4712
매일유업 5514 70300 71633 79867 106400
한국자산신탁 5505 4440 7464 8207 10600
한라홀딩스 5299 50600 99092 104989 123987
한진 5142 34400 104108 117894 162315
대한제강 4720 19150 33895 41984 68048
금호건설 4359 11900 19918 24662 39950
태영건설 4337 11150 21827 24885 34736
이수화학 4264 15250 18366 24893 45926
원익머트리얼즈 4028 31950 34042 37365 48069
인탑스 4008 23300 33691 36480 45465
한솔제지 3594 15100 27126 27260 27689
동부건설 3467 15250 26456 29723 40249
화신 3290 9420 9466 10599 14248
코리아써키트 3271 13850 15867 16467 18402
계룡건설 3242 36300 86231 98726 138988
풍산홀딩스 3076 29550 106661 125239 185104
KPX케미칼 2851 58900 115141 116308 120071
랩지노믹스 2782 24300 34235 51552 107351
유니퀘스트 2761 10100 11776 13494 19030
현대코퍼레이션 2527 19100 26986 28623 33899
도이치모터스 2293 7740 11737 12681 15724
한라 2147 5670 12396 14204 20032
금화피에스시 1938 32300 46145 47469 51733
백산 1924 7950 8453 10319 16331
디와이파워 1424 12900 22156 24406 31656
SGC이테크건설 1409 69600 141070 181937 313621
엑시콘 1294 12350 18816 23711 39484
현대코퍼레이션홀딩스 1206 13250 22817 24129 28356
코메론 1122 12400 19743 20388 22466
이노인스트루먼트 856 2125 2280 2418 2862
10월4주차 매수가격 돌파          
에스엘 16510 34250 32996 34396 38907

 

반응형

'주식' 카테고리의 다른 글

[21년 11월 2주차] S-RIM 종목  (0) 2021.11.07
[21년 11월 1주차] S-RIM 종목  (0) 2021.11.01
[21년 10월 4주차] S-RIM 종목  (0) 2021.10.19
[21년 10월 3주차] S-RIM 종목  (0) 2021.10.10
[21년 10월 2주차] S-RIM 종목  (0) 2021.10.02
반응형

싱글턴 패턴은 안티 패턴이라고 주장하는 사람도 많지만 여전히 많은 곳에서 사용되고 있다.

 

싱글턴이란 애플리케이션이 실행 중에 객체를 하나만 가질 수 있는 클래스를 의미한다.

 

싱글턴을 구현하는 방법은 무수히 많으며 이펙티브 자바에서는 세 가지를 설명한다.

 

public static final 변수로 접근 가능한 싱글턴

public class PublicStaticFinalSingleton {
	public static final PublicStaticFinalSingleton INSTANCE = new PublicStaticFinalSingleton();

	private PublicStaticFinalSingleton() {

	}

	public void hello() {
		System.out.println("hello");
	}
}


public class Rule3 {

	public static void main(String[] args) {
		PublicStaticFinalSingleton.INSTANCE.hello();

		new PublicStaticFinalSingleton(); // private 생성자 뿐이므로 컴파일 에러
	}
}

 

getInstance()와 같은 정적 팩토리 메서드로 접근 가능한 싱글턴

public class GetInstanceSingleton {
	private static final GetInstanceSingleton INSTANCE = new GetInstanceSingleton();

	private GetInstanceSingleton() {

	}

	public static GetInstanceSingleton getInstance() {
		return INSTANCE;
	}

	public void hello() {
		System.out.println("hello");
	}
}

public class Rule3 {

	public static void main(String[] args) {
		GetInstanceSingleton.getInstance().hello();

		new GetInstanceSingleton(); // private 생성자 뿐이므로 컴파일 에러
	}
}

 

위 두 방법은 거의 비슷한 방법으로 Eager initialization을 사용한 싱글톤 방식이라고도 한다. 하지만 몇 가지 문제점이 있다.

 

1. 클래스가 로드하게 되면 바로 객체를 생성한다. 만약 해당 싱글톤 클래스가 객체를 생성하는데 많은 시간과 비용이 발생한다면, 애플리케이션이 로드되는데 오래 걸리는 문제가 있을 수 있다. 

 

2. 리플렉션을 사용한다면 생성자가 private여도 호출할 수 있다. 생성자가 두 번 호출되면 예외를 던지도록 처리하여 방어할 수 있다.

 

3. 싱글턴 클래스가 Serializeable이 가능하다면 역직렬화 때마다 새로운 객체가 생성된다. 나중에 포스팅할 내용을 미리 포스팅하여 설명하자면 아래와 같다.

 

/**
 * 싱글턴 클래스는 오직 하나의 객체만 생성되게 하는 클래스이다.
 * 만약 Serializable을 구현한다면 readObject에 의해서 새로운 객체가 만들어지므로 싱글턴 클래스가 아니게 된다.
 *
 * @author gwon
 * @history
 *          2019. 6. 8. initial creation
 */
public class SingletonElvis implements Serializable {
	public static final SingletonElvis INSTANCE = new SingletonElvis();

	private SingletonElvis() {

	}

}

public class Rule77 {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		// 싱글턴으로 미리 구현된 동일한 객체만 사용 가능
		SingletonElvis elvis = SingletonElvis.INSTANCE;

		// 직렬화 후, 역직렬화
		SingletonElvis newElvis = (SingletonElvis) deserialize(serialize(elvis));

		System.out.println(elvis == newElvis); // false
	}
}

위와 같이 싱글톤을 역직렬 화하면 새로운 객체가 생성되어 객체가 2개 이상이 된다.

 

이를 방어하기 위해서는 아래와 같이 역직렬화 후 호출되는 메서드인 readResolve() 메서드를 항상 동일한 객체를 리턴하도록 작성하면 된다.

/**
 * 이를 막기 위해 readResolve 메서드를 구현하면 싱글턴 속성을 만족하게 오직 하나의 객체만 반환하게 하면 된다.
 *
 * @author gwon
 * @history
 *          2019. 6. 8. initial creation
 */
public class SingletonElvisWithReadResolve implements Serializable {
	public static final SingletonElvisWithReadResolve INSTANCE = new SingletonElvisWithReadResolve();

	private SingletonElvisWithReadResolve() {

	}

	// 역직렬화가 끝난 후, 해당 메서드가 호출되므로 항상 동일한 객체(싱글턴)을 반환하도록 함.
	private Object readResolve() {
		return INSTANCE;
	}

}

 

Enum을 사용한 싱글턴

위에서 언급한 리플렉션, 직렬화를 위한 방어 로직을 작성하기 귀찮다면 Enum을 사용하는 것도 좋은 방법이다.

public enum EnumSingleton {
	INSTANCE;

	public void hello() {
		System.out.println("hello");
	}
}

public class Rule3 {

	public static void main(String[] args) {
		EnumSingleton.INSTANCE.hello();
	}
}

Enum은 직렬화가 자동으로 처리되며, 리플렉션을 통한 공격에도 안전하다.

 

위까지가 이펙티바 자바에서 설명하는 싱글톤 내용이다.

 

Lazy Initialization, Lazy Holder

Eager initialization 싱글톤이 있다면 Lazy initialization 싱글톤도 있다. 소스는 아래와 같다.

public class LazyInitializationSingleton {
	private static LazyInitializationSingleton INSTANCE;

	private LazyInitializationSingleton() {}

	public static LazyInitializationSingleton getInstance() {
		if (INSTANCE == null) {
			INSTANCE = new LazyInitializationSingleton();
		}
		return INSTANCE;
	}

	public void hello() {
		System.out.println("hello");
	}
}

Lazy Initialization은 INSTANCE 필드에 바로 초기화하지 않고 getInstance()를 최초로 호출될 때 객체를 생성하는 방식이다. 따라서 호출되지 않는다면 객체 생성이 미루어지므로 애플리케이션이 로드되는데 부담이 없다.

 

하지만 여러 쓰레드가 동시에 getInstance()를 호출할 경우 객체가 두 번 이상 호출될 수 있는 위험이 존재한다. 이를 방지하기 위해 getInstance()에 synchronized 키워드를 사용하여 해결할 수 있지만, 해당 싱글톤이 자주 사용된다면 효율적이지 않다.

 

따라서 이를 해결하는 방법이 Lazy Holder이다.

 

Lazy Holder는 JVM 클래스 로더의 동작 방식을 이용하여 Lazy Initialization를 만족하면서, 동기화 문제도 해결한다.

https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom

public class LazyHolderSingleton {
	private LazyHolderSingleton() {};

	public static LazyHolderSingleton getInstance() {
		return LazyHolder.INSTANCE;
	}

	private static class LazyHolder {
		private static final LazyHolderSingleton INSTANCE = new LazyHolderSingleton();
	}

	public void hello() {
		System.out.println("hello");
	}
}

Lazy Holder의 원리는 다음과 같다.

 

1. LazyHoladerSingleton은 static 필드가 없기 때문에, 즉 초기화할 것이 없으므로 아주 빠르게 클래스가 로드된다.

2. LazyHolder는 LazyHolder가 실행되기 전까지는 로드가 되지 않는다.

3. 어디선가 LazyHoladerSingleton.getInstance()를 호출하면 LazyHolder를 로드를 수행하고 초기화를 진행한다.

4. LazyHolder가 로드되면서 static 필드인 INSTANCE를 초기화할 때는 JVM 원리상 동시에 수행할 수 없다.

5. 따라서 LazyHolder는 멀티스레드에서도 안전하게 LazyHolderSingleton의 생성자를 호출하여 초기화를 완료한다.

반응형
반응형

사경인 회계사님이 쓴 재무제표 모르면 주식투자 절대로 하지마라에 나오는 공식인 S-RIM을 계산하여 해당하는 종목을 매주 제공합니다.

 

재무제표 정보를 제공하는 사이트(http://comp.fnguide.com)를 크롤링하여 필요한 정보를 구했습니다.

 

특히, ROE 같은 경우는  당해에 컨센서스가 추측하는 ROE를 기준으로 하였고, 컨센서스가 존재하지 않을 경우 대상에서 제외합니다.

 

목표 수익률은 9%로 하였습니다.

 

당기순이익이 어떠한 이유로 인해(투자, 매각 등) 너무 높아 ROE가 비정상적으로 다른 해보다 높은 기업이 존재합니다.

따라서 아래 종목 리스트는 투자에 참고만 해주시고, 반드시 해당 기업의 재무제표를 다시 확인해주시기 바랍니다.

 

 

종목명 시가총액 현재가격 매수가격 중간가격 매도가격
NAVER 651304 396500 515344.7907 785284.7909 1655091.458
기아 341316 84200 92275.6582 101280.3881 130295.6289
POSCO 278562 319500 592496.2299 632809.6438 762708.4219
KB금융 232437 55900 110063.0445 111683.8053 116906.257
SK텔레콤 213298 296000 370222.9019 381915.0507 419589.7523
신한지주 203282 39350 90366.81458 91004.0423 93057.3316
LG 150694 95800 148111.2018 161075.7226 202850.2897
하나금융지주 133608 44500 110713.3233 112761.627 119361.7169
HMM 117969 29100 39100.88719 57984.96057 118833.6414
우리금융지주 87367 12000 34448.8811 34962.70268 36618.34999
한화솔루션 83780 43800 45602.64708 48201.85839 56577.09485
롯데케미칼 83289 243000 438419.8966 462375.9546 539567.6969
LG디스플레이 65122 18200 36612.61763 38293.8118 43710.99299
LG유플러스 64400 14750 17649.89598 17872.84832 18591.25033
CJ제일제당 61722 410000 411171.9697 432243.7294 500141.6217
미래에셋증권 55400 8720 16673.08769 17289.3626 19275.13731
금호석유 54690 179500 280369.0153 383882.8147 717427.2795
한국금융지주 48314 86700 159713.1929 194141.0464 305075.2411
DB손해보험 46232 65300 95016.28404 98713.76093 110627.8531
삼성증권 42507 47600 76096.96351 85013.47156 113744.442
GS 42137 45350 105365.937 111582.7729 131614.8
NH투자증권 36724 13050 23867.5798 26175.52619 33612.24236
GS건설 35645 41650 54844.16105 56968.66799 63814.30143
메리츠증권 33473 4910 8226.479685 9021.96353 11585.18925
KCC 33058 372000 609006.0707 614478.4725 632111.7673
포스코인터내셔널 28561 23150 28884.72873 30477.66076 35610.44174
키움증권 28186 107500 206086.3633 249706.5393 390260.4395
대우건설 27514 6620 9124.842647 10506.16332 14957.0855
효성티앤씨 27178 628000 683419.2244 1011230.846 2067512.739
한화 25448 33950 71037.25003 77449.42727 98110.88728
현대해상 25256 28250 51675.32516 51685.54486 51718.47502
효성 22757 108000 146778.2469 171076.5566 249371.1098
JB금융지주 17788 9030 21684.03698 22879.86601 26733.09287
DGB금융지주 17422 10300 31069.15398 31154.86928 31431.063
동국제강 17369 18200 31847.27574 37541.36774 55888.9975
HDC현대산업개발 17202 26100 47490.28821 50363.37456 59621.09728
두산 16293 98600 151557.5948 182579.2034 282537.72
에스엘 15859 32900 32996.06373 34396.2341 38907.89417
DL 14460 69000 302910.0799 385963.0902 653578.3458
SK가스 14215 154000 229509.5573 236216.545 257827.95
대한유화 13488 207500 325188.3841 337150.196 375693.812
LX인터내셔널 11899 30700 50838.3908 59630.07224 87958.82353
유니드 11379 128000 154525.1943 189929.7434 304011.0682
한섬 10517 42700 47998.42973 48531.27487 50248.22033
GS홈쇼핑 10165 154900 198218.4544 205333.0791 228257.981
풍산 10019 35750 62986.06146 68248.09658 85203.54308
대한해운 9384 2940 3482.849862 3586.530053 3920.610671
세아베스틸 9001 25100 52334.77083 55308.91773 64892.27998
동원산업 8514 231500 381471.0946 393173.2068 430880.0125
대상 8368 24150 34478.32288 35678.86056 39547.25975
동원F&B 8104 210000 217479.0141 228289.7826 263124.4811
현대건설기계 7841 39800 69727.17046 71004.09613 75118.6344
SNT모티브 7750 53000 57628.69715 58899.41154 62993.9357
현대두산인프라코어 7372 9270 13059.15418 13385.77486 14438.21925
코오롱글로벌 7009 27800 32471.73227 40280.57973 65442.42155
국도화학 6632 73600 110749.8977 140779.0988 237539.8579
한국토지신탁 5997 2375 3993.909104 4164.08767 4712.440826
한라홀딩스 5550 53000 99092.48058 104988.6593 123987.4574
한국자산신탁 5548 4475 7464.238005 8206.919 10600.0022
매일유업 5514 70300 71633.2132 79867.41276 106399.8336
한진 5247 35100 104107.5764 117893.5977 162315.2219
대한제강 5065 20550 33895.28427 41984.02493 68047.74485
금호건설 4506 12300 19917.95741 24662.38253 39949.9746
태영건설 4473 11500 21827.05341 24884.54941 34736.48098
이수화학 4404 15750 18365.7773 24893.15126 45925.80067
원익머트리얼즈 4198 33300 34042.46455 37364.50207 48068.84518
인탑스 3947 22950 33691.01524 36479.61506 45465.10336
한솔제지 3570 15000 27126.32119 27259.55699 27688.87237
계룡건설 3434 38450 86230.52816 98725.74798 138988.1229
동부건설 3421 15050 26456.22618 29722.91079 40248.89451
코리아써키트 3260 13800 15866.64492 16467.21117 18402.36908
풍산홀딩스 3175 30500 106660.7121 125239.3111 185103.6858
KPX케미칼 2875 59400 115140.7125 116308.3863 120070.8907
랩지노믹스 2771 24200 34235.43351 51552.22243 107350.7645
유니퀘스트 2761 10100 11775.79456 13494.00868 19030.47637
현대코퍼레이션 2375 17950 26986.29867 28623.4011 33898.50894
도이치모터스 2257 7620 11737.31093 12681.45358 15723.69102
한라 2207 5830 12395.77145 14204.44681 20032.40074
백산 2001 8270 8453.22542 10319.1231 16331.46006
금화피에스시 1947 32450 46145.32414 47468.61579 51732.55556
디와이파워 1480 13400 22156.24237 24406.12115 31655.73056
SGC이테크건설 1417 70000 141069.9318 181937.2469 313620.818
엑시콘 1325 12650 18815.54523 23710.77946 39484.31197
현대코퍼레이션홀딩스 1174 12900 22816.57762 24128.51789 28355.88096
코메론 1086 12000 19743.25437 20388.15499 22466.16809
이노인스트루먼트 866 2150 2280.079941 2418.021125 2862.498273
영원무역          
SK디앤디          
웅진씽크빅          
화신          
한세예스24홀딩스          
하이비젼시스템          
제우스          
반응형

'주식' 카테고리의 다른 글

[21년 11월 2주차] S-RIM 종목  (0) 2021.11.07
[21년 11월 1주차] S-RIM 종목  (0) 2021.11.01
[21년 10월 5주차] S-RIM 종목  (0) 2021.10.24
[21년 10월 3주차] S-RIM 종목  (0) 2021.10.10
[21년 10월 2주차] S-RIM 종목  (0) 2021.10.02
반응형

규칙 1에서는 생성자 대신 정적 팩토리 메서드를 사용을 고려해보자는 규칙이었다.

 

하지만 생성자 뿐만아니라 정적 팩토리 메서드의 인자가 많을 때는 어떤 위치에 어떤 값이 들어가야 하는지 클라이언트가 하나씩 확인하면서 값을 채워줘야 하기 때문에 사용하기 불편한다.

 

따라서 이를 개선하고자 점진적 생성자 패턴(telescoping constructor pattern)이 만들어졌다.

 

점진적 생성자 패턴

점진적 생성자 패턴이란 필수 인자를 받는 생성자를 하나 정의하고, 선택적 인자를 받는 생성자를 여러개 점진적으로 만드는 방식이다.

 

아래는 Netty의 io.netty.handler.proxy.HttpProxyHandler 예시이다.

public final class HttpProxyHandler extends ProxyHandler {


    private final HttpClientCodecWrapper codecWrapper = new HttpClientCodecWrapper();
    private final String username;
    private final String password;
    private final CharSequence authorization;
    private final HttpHeaders outboundHeaders;
    private final boolean ignoreDefaultPortsInConnectHostHeader;
    private HttpResponseStatus status;
    private HttpHeaders inboundHeaders;

    public HttpProxyHandler(SocketAddress proxyAddress) {
        this(proxyAddress, null);
    }

    public HttpProxyHandler(SocketAddress proxyAddress, HttpHeaders headers) {
        this(proxyAddress, headers, false);
    }

    public HttpProxyHandler(SocketAddress proxyAddress,
                            HttpHeaders headers,
                            boolean ignoreDefaultPortsInConnectHostHeader) {
		...
    }

    public HttpProxyHandler(SocketAddress proxyAddress, String username, String password) {
        this(proxyAddress, username, password, null);
    }

    public HttpProxyHandler(SocketAddress proxyAddress, String username, String password,
                            HttpHeaders headers) {
        this(proxyAddress, username, password, headers, false);
    }

    public HttpProxyHandler(SocketAddress proxyAddress,
                            String username,
                            String password,
                            HttpHeaders headers,
                            boolean ignoreDefaultPortsInConnectHostHeader) {
  		...
    }

 

아래와 같이 생성자가 필요한 인자에 따라서 여러개가 존재하기 때문에 많은 인자가 들어있는 하나의 생성자보다는 사용하기가 편한다.

하지만 만약 해당 클래스의 필드가 추가되게 되면, 생성자를 추가로 생성해야 한다는 문제가 있다.

옵셔널 한 필드라면 생성자가 하나만 추가하게 코드를 작성할 수 있지만, 필수로 입력해야 하는 필드라면 여태 만들어 둔 생성자에 모두 추가해야 하므로 고쳐야 하는 부분이 더욱 많아진다.

 

필드 개수에 따라서 생성자를 추가하는 방법이 아닌 다른 방법은 없을까? 다음 대안인 자바빈 패턴(JavaBeans) 패턴을 보자.

 

자바 빈 패턴

자바 빈 패턴은 한국에서 제일 많이 사용하는 패턴이 아닐까 싶다.

 

자바 빈 패턴은 디폴트 생성자로 객체를 만들고 필드의 setter 메서드로 필요한 값을 하나씩 호출하여 채우는 방식이다.

public class User {
	private String name;
	private int age;
	private String addr;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}
}

public static void main(String[] args) {
	User user = new User();
	user.setName("홍길동");
	user.setAge(10);
	user.setAddr("서울");
}

 

점층적 생성자 패턴보다 복잡하지 않기 때문에 생성하기도 쉬우며, 코드 읽기에도 어려움이 없다.

 

하지만 자바 빈 패턴은 요즘(?) 대세인 클래스 생성 규칙을 위반한다.

 

다른 객체 생성 방식과는 다르게 한 번의 함수 호출로 객체 생성을 끝낼 수 없기 때문에 객체의 일관성이 깨질 수 있다.

하나의 함수로 객체를 생성하게 된다면, 해당 객체의 필드에 값들이 유효한지를 보장하도록 코드를 작성할 수 있지만 각각 필드에 대한 setter에서는 그 유효성을 보장하도록 코드를 작성하기 어렵고, 그렇게 한다고 하더라도 잘못 코드를 작성할 경우, 버그를 디버깅하기 어렵다.

 

또한 setter가 존재한다는 것은 값을 변경할 수 있기 때문에 Immutable 클래스를 만들 수가 없다.

 

인자가 많은 생성자, 점진적 생성자 패턴, 그리고 자바 빈 패턴을 단점을 커버할 객체 생성 방법은 없을까? 그 대안이 바로 빌더 패턴(Builder Pattern)이다.

 

빌더 패턴

빌더 패턴은 GOF 디자인 패턴 중에 하나이다. 하지만 여기서 설명하는 빌더 패턴은 GOF에서 설명하는 빌더 패턴을 객체 생성 관점에서 변형에서 사용한 예라고 할 수 있다.

 

빌더 패턴은 객체를 생성할 클래스안에 빌더 클래스를 작성하고, 이 빌더 클래스를 이용하여 객체를 생성한다.

일반적인 빌더 패턴 만드는 순서는 다음과 같다.

 

1. 필수로 입력받아야하는 필드만을 가진 생성자를 작성한다.

2. 옵셔널로 입력받아야하는 필드는 setter로 만들고 추가적으로 자신을 리턴하도록 한다.

3. build() 메서드를 만들고 실제 객체 생성자에 자신을 넘겨 해당 객체를 리턴한다.

NutritionFacts cocaCola = new NutriFacts.Builder(240, 8)
      .calories(100).sodium(35).carbohydrate(30).build();
public class NutritionFacts {
	private final int servingSize;
	private final int servings;
	private final int calories;
	private final int fat;
	private final int sodium;
	private final int carbohydrate;

	private NutritionFacts(Builder builder) {
		servingSize = builder.servingSize;
		servings = builder.servings;
		calories = builder.calories;
		fat = builder.fat;
		sodium = builder.sodium;
		carbohydrate = builder.carbohydrate;
	}

	public static class Builder {
		private final int servingSize;
		private final int servings;

		private int calories = 0;
		private int fat = 0;
		private int sodium = 0;
		private int carbohydrate = 0;

		public Builder(int servingSize, int servings) {
			this.servingSize = servingSize;
			this.servings = servings;
		}

		public Builder calories(int val) {
			calories = val;
			return this;
		}

		public Builder fat(int val) {
			fat = val;
			return this;
		}

		public Builder sodium(int val) {
			sodium = val;
			return this;
		}

		public Builder carbohydrate(int val) {
			carbohydrate = val;
			return this;
		}

		public NutritionFacts build() {
			return new NutritionFacts(this);
		}
	}
}

 

빌더 패턴은 위에 다른 패턴의 단점을 해결하면서 여러 장점이 존재한다.

 

1. 빌더 패턴은 build() 메서드에서 한 번에 객체를 생성하기 때문에 필드의 유효성을 판단할 수 있다.

 

2. build()로 만들어진 객체 자체에 setter을 두지 않도록 하여 Immutable 하게 객체를 생성할 수 있다.

 

3. 빌더 객체는 재사용할 수 있다.

NutriFacts.Builder builder = new NutriFacts.Builder(240, 8)
      .calories(100).sodium(35).carbohydrate(30);
      
NutriFacts n1 = builder.build();

builder.sodium(0);
NutriFacts n2 = builder.build();

 

4. 빌더에 부가적인 기능을 추가 할 수 있다.

public class NutritionFacts {
    ...

	public static class Builder {
    	private static int count = 0;
        
        ...

		public NutritionFacts build() {
			count++;
			return new NutritionFacts(this);
		}
        
	}
}

 

단점으로는 코드의 양이 증가할 수 있으며, 다른 패턴보다는 성능이 약간 떨어진다.

 

하지만 요즘 여러 라이브러리에서 어노테이션만으로 빌더 패턴을 적용할 수 있도록 제공하고 있기 때문에 첫 번째 단점은 쉽게 해결할 수 있다. (lombok 등)

@Builder
public class Member {...}
반응형
반응형

사경인 회계사님이 쓴 재무제표 모르면 주식투자 절대로 하지마라에 나오는 공식인 S-RIM을 계산하여 해당하는 종목을 매주 제공합니다.

 

재무제표 정보를 제공하는 사이트(http://comp.fnguide.com)를 크롤링하여 필요한 정보를 구했습니다.

 

특히, ROE 같은 경우는  당해에 컨센서스가 추측하는 ROE를 기준으로 하였고, 컨센서스가 존재하지 않을 경우 대상에서 제외합니다.

 

목표 수익률은 9%로 하였습니다.

 

당기순이익이 어떠한 이유로 인해(투자, 매각 등) 너무 높아 ROE가 비정상적으로 다른 해보다 높은 기업이 존재합니다.

따라서 아래 종목 리스트는 투자에 참고만 해주시고, 반드시 해당 기업의 재무제표를 다시 확인해주시기 바랍니다.

 

종목명 시가총액 현재가격 매수가격 중간가격 매도가격
NAVER 638163 388500 515345 785285 1655091
기아 331993 81900 92188 101129 129941
POSCO 278998 320000 586431 622395 738278
KB금융 229110 55100 110093 111735 117026
SK텔레콤 219423 304500 369735 381077 417624
신한지주 201990 39100 90243 90792 92560
LG 144560 91900 145887 157257 193893
하나금융지주 133908 44600 110624 112608 119002
HMM 117767 29050 38414 56806 116067
우리금융지주 84455 11600 34449 34963 36618
롯데케미칼 81747 238500 438755 462951 540918
한화솔루션 80337 42000 45545 48102 56344
LG디스플레이 64049 17900 36461 38034 43102
LG유플러스 63090 14450 17650 17873 18591
CJ제일제당 60066 399000 411699 433148 502263
금호석유 54232 178000 280369 383883 717427
미래에셋증권 53557 8430 16560 17095 18818
DB손해보험 46799 66100 94322 97522 107832
한국금융지주 46754 83900 158635 192289 300731
삼성증권 41167 46100 75939 84742 113108
GS 40697 43800 105366 111583 131615
NH투자증권 35317 12550 25109 27484 35139
GS건설 35046 40950 55016 57264 64506
KCC 33546 377500 609006 614478 632112
메리츠증권 32178 4720 8226 9022 11585
키움증권 27662 105500 205726 249087 388808
포스코인터내셔널 27451 22250 28922 30541 35759
대우건설 26932 6480 9101 10465 14861
효성티앤씨 26399 610000 684917 1013803 2073547
한화 26123 34850 71037 77449 98111
효성 22862 108500 146778 171077 249371
영원무역 20295 45800 46188 47554 51958
HDC현대산업개발 17169 26050 47814 50920 60926
DGB금융지주 16898 9990 30958 30964 30984
JB금융지주 16842 8550 21601 22738 26399
동국제강 16414 17200 31570 37066 54773
에스엘 15449 32050 32979 34367 38839
두산 14673 88800 151558 182579 282538
DL 14648 69900 302910 385963 653578
SK가스 13430 145500 229510 236217 257828
대한유화 13260 204000 329954 345334 394890
유니드 11735 132000 154525 189930 304011
LX인터내셔널 11395 29400 50838 59630 87959
GS홈쇼핑 10165 154900 198218 205333 228258
한섬 9704 39400 47777 48151 49356
세아베스틸 9091 25350 52561 55697 65802
풍산 9024 32200 63001 68274 85265
대한해운 8714 2730 3483 3587 3921
동원산업 8367 227500 391141 409778 469830
대상 8177 23600 34515 35741 39693
동원F&B 8143 211000 216865 227235 260651
현대건설기계 7802 39600 69202 70103 73005
SNT모티브 7443 50900 57952 59455 64297
현대두산인프라코어 7372 9270 15386 17380 23807
SK디앤디 6901 31100 31661 35622 48384
코오롱글로벌 6731 26700 32400 40158 65155
국도화학 6316 70100 110750 140779 237540
한국토지신탁 5921 2345 3994 4164 4712
한국자산신탁 5467 4410 7464 8207 10600
매일유업 5451 69500 70638 78158 102390
한라홀딩스 5404 51600 98315 103654 120857
한진 5164 34550 104693 118899 164673
대한제강 4806 19500 34139 42402 69028
금호건설 4396 12000 19918 24662 39950
태영건설 4357 11200 21226 23853 32317
이수화학 4348 15550 18366 24893 45926
원익머트리얼즈 3959 31400 33539 36501 46043
인탑스 3879 22550 33691 36480 45465
웅진씽크빅 3777 3270 3391 3578 4179
한솔제지 3618 15200 27126 27260 27689
화신 3457 9900 10034 11574 16535
계룡건설 3403 38100 86231 98726 138988
동부건설 3285 14450 26456 29723 40249
코리아써키트 3189 13500 15867 16467 18402
한세예스24홀딩스 3180 7950 13136 14789 20112
풍산홀딩스 3014 28950 106661 125239 185104
랩지노믹스 2977 26000 34235 51552 107351
KPX케미칼 2928 60500 115141 116308 120071
유니퀘스트 2632 9630 11776 13494 19030
현대코퍼레이션 2348 17750 26986 28623 33899
하이비젼시스템 2286 15300 15775 19652 32148
한라 2185 5620 12396 14204 20032
도이치모터스 2071 6990 11671 12568 15457
제우스 1952 18800 24325 24724 26012
백산 1861 7690 8453 10319 16331
금화피에스시 1860 31000 46145 47469 51733
디와이파워 1441 13050 22775 25469 34149
SGC이테크건설 1364 67400 141070 181937 313621
엑시콘 1299 12400 18816 23711 39484
현대코퍼레이션홀딩스 1147 12600 22817 24129 28356
코메론 1077 11900 19743 20388 22466
이노인스트루먼트 838 2080 2280 2418 2862
반응형

'주식' 카테고리의 다른 글

[21년 11월 2주차] S-RIM 종목  (0) 2021.11.07
[21년 11월 1주차] S-RIM 종목  (0) 2021.11.01
[21년 10월 5주차] S-RIM 종목  (0) 2021.10.24
[21년 10월 4주차] S-RIM 종목  (0) 2021.10.19
[21년 10월 2주차] S-RIM 종목  (0) 2021.10.02
반응형

객체를 만드는 방법인 생성자(Constructor) 대신 객체를 리턴하도록 하는 public으로 선언된 메서드인 정적 팩터리 메서드를 사용하는 것이 좋은 점이 많다.

 

정적 팩터리 메서드는 다양한 클래스에서 볼 수 있는데, String 클래스의 valueOf 메서드가 그중 하나이다.

    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

    
    public static String valueOf(char data[]) {
        return new String(data);
    }

 

장점

1. 이름이 있다.

  • 생성자는 이름이 없어 오직 메소드 인자의 시그니처를 보고 파악해야 한다.
  • 정적 팩터리 메서드는 메서드 이름으로 어떤 의미의 객체를 리턴하는지 쉽게 파악할 수 있다.

 

2. 생성자처럼 반드시 새로운 객체를 만들도록 하지 않을 수 있다.

  • 내가 생각하는 가장 큰 장점 중에 하나로, 반드시 새로운 객체를 생성하지 않고, 이미 만들어져 있는 객체를 제공할 수도 있다.
  • 동일한 객체 생성을 요청하는 경우, 이미 만들어 놓은 객체 변수를 리턴할 수 도 있으며 또는 캐시를 사용하여 제공할 수 도 있다.
  • 객체 생성하는데 비용이 클 경우, Immutable 클래스인 경우 사용하기에 좋을 것이다.
    // Boolean code
        public static final Boolean TRUE = new Boolean(true);
        public static final Boolean FALSE = new Boolean(false);
    
        public static Boolean valueOf(boolean b){
            return b ? TRUE : FALSE;
        }

 

3. 생성자처럼 반드시 해당 클래스의 객체를 생성하지 않고, 하위 계층의 클래스를 생성할 수 있다.

  • 생성자는 반드시 자신의 객체만을 리턴한다.
  • 정적 팩터리 메서드는 반환형에 하위 계층 또는 구현체를 리턴할 수 있으므로 더욱 유연하다.
  • java.util.Collections는 다양한 정적 팩터리 메서드가 존재하는데 아래 예제에서는 리턴하는 객체가 Collections에서만 호출 가능한 inner class인 SynchronizedCollection를 생성하여 리턴한다. 이처럼 외부에서는 객체 생성 불가능한 클래스도 정적 메서드 클래스를 통해 리턴할 수 제공할 수 있다.
    package java.util;
    ...
    
    public class Collections {
        ...
    
        public static <T> Collection<T> synchronizedCollection(Collection<T> c) {
            return new SynchronizedCollection<>(c);
        }
    
    
        static class SynchronizedCollection<E> implements Collection<E>, Serializable {
            private static final long serialVersionUID = 3053995032091335093L;
    
            final Collection<E> c;  // Backing Collection
            final Object mutex;     // Object on which to synchronize
    
            SynchronizedCollection(Collection<E> c) {
                this.c = Objects.requireNonNull(c);
                mutex = this;
            }
            
            ...
        }
        
        
        ...
        
    }

 

4. 제네릭을 사용한 객체를 만들 때 편리하다. (JDK  1.7부터는 생성자에서도 지원한다.)

 

단점

1. 정적 팩터리 메서드만 제공하는 클래스라면, 즉 생성자가 private로 되어 있어 생성자를 이용하여 객체를 생성할 수 없다면, 하위 클래스를 만들 수 없다.

 

2. 정적 팩터리 메서드는 일반 메서드와 다른 점이 없으므로 해당 메서드가 정적 팩터리 메서드인지 바로 알 수는 없다. 따라서 문서를 읽어야지 파악 가능하다.

 

 

2번 단점으로 인해, 일반적으로 정적 팩터리 메서드의 네이밍은 아래와 같이 작성한다.

  • valueOf : 주어진 값과 같은 값을 갖는 객체를 반환한다.
        // String.valueOf
        public static String valueOf(Object obj) {
            return (obj == null) ? "null" : obj.toString();
        }​
  • of : valueOf와 동일
        // Optional.of
        public static <T> Optional<T> of(T value) {
            return new Optional<>(value);
        }​
  • getInstance : 일반적으로 이미 존재하는 객체를 반환한다.
    // Singleton example
    public class ExampleClass {
        private static ExampleClass instance = new ExampleClass();
        private ExampleClass() {}
        public static ExampleClass getInstance() {
            return instance;
        }
    }​
  • newInstance : 일반적으로 항상 새로운 객체를 만들어 반환한다.
    // Class.newInstance
    clazz.newInstance()​
  • getType : 특정 클래스에서 Type의 객체를 생성할 경우 사용한다. 일반적으로 이미 존재하는 객체를 반환한다.
  • newType : 특정 클래스에서 Type의 객체를 생성할 경우 사용한다. 일반적으로 항상 새로운 객체를 만들어 반환한다.

 

반응형
반응형

사경인 회계사님이 쓴 재무제표 모르면 주식투자 절대로 하지마라에 나오는 공식인 S-RIM을 계산하여 해당하는 종목을 매주 제공합니다.

 

재무제표 정보를 제공하는 사이트(http://comp.fnguide.com)를 크롤링하여 필요한 정보를 구했습니다.

 

특히, ROE 같은 경우는  당해에 컨센서스가 추측하는 ROE를 기준으로 하였고, 컨센서스가 존재하지 않을 경우 대상에서 제외합니다.

 

목표 수익률은 9%로 하였습니다.

 

당기순이익이 어떠한 이유로 인해(투자, 매각 등) 너무 높아 ROE가 비정상적으로 다른 해보다 높은 기업이 존재합니다.

따라서 아래 종목 리스트는 투자에 참고만 해주시고, 반드시 해당 기업의 재무제표를 다시 확인해주시기 바랍니다.

 

종목명 시가총액 현재가격 매수가격 중간가격 매도가격
NAVER 627486 382000 514847 784429 1653085
기아 317400 78300 92298 101318 130384
POSCO 282485 324000 581401 613758 718018
SK텔레콤 235637 327000 369735 381077 417624
KB금융 229526 55200 110063 111684 116906
신한지주 205090 39700 90169 90665 92262
LG 146290 93000 145457 156518 192159
하나금융지주 137661 45850 110565 112506 118763
HMM 128915 31800 37329 54943 111698
우리금융지주 83727 11500 34440 34947 36581
롯데케미칼 82947 242000 438867 463143 541368
한화솔루션 82154 42950 45649 48281 56764
LG디스플레이 66196 18500 37019 38992 45348
LG유플러스 65710 15050 17650 17873 18591
CJ제일제당 60367 401000 410856 431701 498869
금호석유 54842 180000 280256 383690 716974
미래에셋증권 54002 8500 16529 17042 18695
한국금융지주 47701 85600 157248 189908 295146
DB손해보험 46162 65200 93777 96585 105636
삼성증권 41792 46800 75693 84320 112118
GS 41069 44200 105366 111583 131615
두산밥캣 38997 38900 43909 44021 44384
NH투자증권 35598 12650 25018 27329 34776
GS건설 35559 41550 55130 57460 64967
KCC 35501 399500 609006 614478 632112
메리츠증권 33712 4945 8226 9022 11585
포스코인터내셔널 30042 24350 29024 30718 36173
키움증권 27793 106000 205886 249363 389453
대우건설 27390 6590 9099 10462 14853
효성티앤씨 27221 629000 685354 1014554 2075307
한화 25261 33700 71397 78067 99560
효성 23705 112500 146778 171077 249371
영원무역 19054 43000 46090 47386 51564
HDC현대산업개발 17762 26950 47814 50920 60926
JB금융지주 17138 8700 21568 22681 26266
동국제강 16844 17650 31293 36590 53658
DL 15507 74000 302910 385963 653578
두산 15367 93000 151558 182579 282538
SK가스 14261 154500 228234 234027 252691
대한유화 13943 214500 330890 346941 398660
LX인터내셔널 13411 34600 50040 58260 84744
에스엘 12485 25900 33287 34896 40081
유니드 11690 131500 154525 189930 304011
GS홈쇼핑 10165 154900 198218 205333 228258
한섬 9618 39050 47764 48128 49303
대한해운 9575 3000 3483 3587 3921
풍산 9108 32500 62863 68037 84709
세아베스틸 8876 24750 52827 56153 66873
동원산업 8348 227000 391141 409778 469830
대상 8212 23700 34578 35850 39948
동원F&B 8123 210500 216195 226085 257952
현대건설기계 8008 40650 69334 70328 73533
SNT모티브 7355 50300 58337 60116 65849
현대두산인프라코어 7276 9150 15386 17380 23807
코오롱글로벌 7160 28400 32484 40301 65490
SK디앤디 7012 31600 31661 35622 48384
국도화학 6650 73800 110750 140779 237540
한국토지신탁 6072 2405 3994 4164 4712
한라홀딩스 5676 54200 98691 104300 122372
한국자산신탁 5511 4445 7464 8207 10600
한진 5396 36100 104833 119140 165239
대한제강 5065 20550 34139 42402 69028
이수화학 4921 17600 18366 24893 45926
KG이니시스 4827 17300 17319 20286 29847
금호건설 4598 12550 19316 23629 37526
태영건설 4473 11500 21226 23853 32317
인탑스 4283 24900 33116 35491 43147
원익머트리얼즈 4022 31900 33539 36501 46043
웅진씽크빅 3794 3285 3391 3578 4179
한솔제지 3760 15800 27126 27260 27689
동부건설 3364 14800 26465 29732 40261
계룡건설 3345 37450 86231 98726 138988
한세예스24홀딩스 3264 8160 13136 14789 20112
코리아써키트 3177 13450 15543 15912 17100
랩지노믹스 3149 27500 34235 51552 107351
풍산홀딩스 3144 30200 106661 125239 185104
KPX케미칼 2943 60800 115141 116308 120071
화신 2930 8390 10034 11574 16535
유니퀘스트 2725 9970 11776 13494 19030
현대코퍼레이션 2500 18900 26986 28623 33899
한라 2364 6080 12396 14204 20032
도이치모터스 2115 7140 11671 12568 15457
제우스 2077 20000 24325 24724 26012
백산 1902 7860 8453 10319 16331
금화피에스시 1860 31000 46145 47469 51733
이건산업 1462 13350 19520 21293 27009
디와이파워 1424 12900 22775 25469 34149
SGC이테크건설 1364 67400 141070 181937 313621
엑시콘 1325 12650 18816 23711 39484
현대코퍼레이션홀딩스 1179 12950 22817 24129 28356
코메론 1041 11500 19743 20388 22466
이노인스트루먼트 854 2120 2280 2418 2862
반응형

'주식' 카테고리의 다른 글

[21년 11월 2주차] S-RIM 종목  (0) 2021.11.07
[21년 11월 1주차] S-RIM 종목  (0) 2021.11.01
[21년 10월 5주차] S-RIM 종목  (0) 2021.10.24
[21년 10월 4주차] S-RIM 종목  (0) 2021.10.19
[21년 10월 3주차] S-RIM 종목  (0) 2021.10.10
반응형

Hex2Bytes

1. BigInteger(String val, int radix)

	public static void main(String args[]) {
		String hex = "aaaaaa";
		byte[] bytes = new BigInteger(hex, 16).toByteArray();
	}

 

2. 순수 자바

	public static byte[] hexStringToByteArray(String s) {
		int len = s.length();
		byte[] data = new byte[len / 2];
		for (int i = 0; i < len; i += 2) {
			data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
			        + Character.digit(s.charAt(i + 1), 16));
		}
		return data;
	}

 

3. javax.xml.bind.DatatypeConverter.parseHexBinary(String lexicalXSDHexBinary)

 

4. org.apache.commons.codec.binary.Hex.decodeHex(char[] data)

성능 비교

BigInteger는 10^7부터는 너무 오래걸려서 테스트 불가능했다.

 

 

차트에는 BigInteger의 10^6데이터는 표현하지 않았다.

 

 

- BigInterger가 성능이 제일 좋지 않은것으로 판단된다. BigInteger라도 너무 큰 숫자를 처리하기에는 성능 이슈가 있는것으로 판단된다.

 

- DatatypeConverter.parseHexBinary는 작은 데이터도 평균적으로 0.15초는 적어도 소요되었다. 신기해서 소스를 보니, 아래 소스처럼 처음 수행될 때 실제 컨버터 구현체를 인스턴스화 한다. 만약 실시간성이 중요하다면, 미리 인스턴스화 하는게 좋을 것 같다. 

    public static java.math.BigInteger parseInteger( String lexicalXSDInteger ) {
        if (theConverter == null) initConverter();
        return theConverter.parseInteger( lexicalXSDInteger );
    }
    
    private static synchronized void initConverter() {
        theConverter = new DatatypeConverterImpl();
    }

 

- DatatypeConverter 초기화 시간만 제외한다면 BigInteger를 제외한 세 개는 거의 동일한 성능을 보인다.

 

- DatatypeConverter 또는 Hex를 기본적으로 어플리케이션에서 사용하지 않는다면, 순수자바로 구현된 hexStringToByteArray를 사용하는 것이 좋다고 생각된다.

반응형

+ Recent posts