JavaRush /Java Blog /Random-KO /ํ•˜์œ„ ๋ฌธ์ž์—ด(..)์ด ๋‚˜๋ฅผ ๊ดด๋กญํ˜”์Šต๋‹ˆ๋‹ค.
IgorBrest
๋ ˆ๋ฒจ 33

ํ•˜์œ„ ๋ฌธ์ž์—ด(..)์ด ๋‚˜๋ฅผ ๊ดด๋กญํ˜”์Šต๋‹ˆ๋‹ค.

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์‚ฌ์‹ค, ์ฃผ์ œ ๋•Œ๋ฌธ์— String.substring(..)์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ์•„๋งˆ๋„ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์นœ์• ํ•˜๋Š” Javorashovites ์—ฌ๋Ÿฌ๋ถ„๊ณผ ๊ณต์œ ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งํ•˜์ž๋ฉด, ๊ทธ๊ฒƒ์„ ๋‹น์‹ ์˜ ํŒ๋‹จ์— ๋งก๊ธฐ์‹ญ์‹œ์˜ค. ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค. substring(..) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด์€ ์›๋ž˜ ๋ฌธ์ž์—ด์˜ ๋ฌธ์ž ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์„ค๋ช…์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋‹ค์Œ์€ ์กด๊ฒฝ๋ฐ›๋Š” ๊ธฐ์‚ฌ ์—์„œ ์ตœ๊ทผ ์ฝ์€ "Java Reference. Static Strings" ๊ธฐ์‚ฌ์—์„œ ๋ฐœ์ทŒํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค .
ํ•˜์œ„ ๋ฌธ์ž์—ด ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ฐธ๊ณ  ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ ๋ฌธ์ž์—ด์€ ์›๋ž˜ ๋ฌธ์ž์—ด๊ณผ ๋™์ผํ•œ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฌผ๋ก  Javarash ๊ฐ•์˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. 12์›” 22์ผ์ž ์ธ์šฉ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
substring ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜์œ„ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋ฉด ์ƒˆ๋กœ์šด String ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฐ์ฒด๋Š” ์ƒˆ๋กœ์šด ๋ฌธ์ž ์ง‘ํ•ฉ์ด ํฌํ•จ๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋Œ€์‹  ์ด์ „ ๋ฌธ์ž ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋™์‹œ์— ์›๋ž˜ ๋ฌธ์ž ๋ฐฐ์—ด์˜ ์–ด๋Š ๋ถ€๋ถ„์ด ์†ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ... ํ•˜์œ„ ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋˜๋ฉด ๋ฌธ์ž ๋ฐฐ์—ด์ด ์ƒˆ String ๊ฐœ์ฒด์— ๋ณต์‚ฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‘ ๊ฐœ์ฒด ๋ชจ๋‘ ๋™์ผํ•œ ๋ฌธ์ž ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ! ๋‘ ๋ฒˆ์งธ ๊ฐ์ฒด๋Š” ์ด ๋ฐฐ์—ด์˜ ์–ด๋–ค ๋ฌธ์ž์™€ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋ฌธ์ž๊ฐ€ ๊ธฐ๋ก๋˜๋Š”์ง€๋ฅผ ํฌํ•จํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ๋” ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ... ๋”ฐ๋ผ์„œ 10,000์ž ๊ธธ์ด์˜ ๋ฌธ์ž์—ด์„ ๊ฐ€์ ธ์™€์„œ ์ž„์˜ ๊ธธ์ด์˜ ํ•˜์œ„ ๋ฌธ์ž์—ด 10,000๊ฐœ๋ฅผ ๋งŒ๋“ค๋ฉด ์ด๋Ÿฌํ•œ "ํ•˜์œ„ ๋ฌธ์ž์—ด"์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฑฐ์˜ ์ฐจ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž ๋ฐฐ์—ด์€ ์ค‘๋ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋Š” ๋ฌธ์ž์—ด์€ ๋ช‡ ๋ฐ”์ดํŠธ๋งŒ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋“  ๊ฒƒ์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์“ฐ์—ฌ ์žˆ๊ณ  ์‹ฌ์ง€์–ด ์”น์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์˜์–ด ์‹ค๋ ฅ์„ ๋Š˜๋ฆฌ๋ ค๊ณ  ํ•˜๋‹ค ๋ณด๋‹ˆ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ž์ฃผ ์ฐพ์•„๋ณด๋Š”๋ฐ, ์–ด์ฉ์ง€ ์ด ์‚ฌ์‹ค์„ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์—†๋”๋ผ๊ณ ์š”... ์ œ ๋ถ€์ฃผ์˜ ํƒ“์ธ์ง€ ๊ณ„์†ํ•ด์„œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค. substring() (IDEA ๋•๋ถ„์— ๋ฒ„ํŠผ์„ ํ•œ ๋ฒˆ๋งŒ ํด๋ฆญํ•˜๋ฉด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค). public String substring(int beginIndex, int endIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } if (endIndex > value.length) { throw new StringIndexOutOfBoundsException(endIndex); } int subLen = endIndex - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return ((beginIndex == 0) && (endIndex == value.length)) ? this : new String(value, beginIndex, subLen); } ํฅ๋ฏธ๊ฐ€ ์ƒ๊ฒจ ๋” ๋‚˜์•„๊ฐ”์Šต๋‹ˆ๋‹ค. * Allocates a new {@code String} that contains characters from a subarray * of the character array argument. The {@code offset} argument is the * index of the first character of the subarray and the {@code count} * argument specifies the length of the subarray. The contents of the * subarray are copied; subsequent modification of the character array does * not affect the newly created string. public String(char value[], int offset, int count) { if (offset < 0) { throw new StringIndexOutOfBoundsException(offset); } if (count < 0) { throw new StringIndexOutOfBoundsException(count); } // Note: offset or count might be near -1>>>1. if (offset > value.length - count) { throw new StringIndexOutOfBoundsException(offset + count); } this.value = Arrays.copyOfRange(value, offset, offset+count); } ์—ฌ๊ธฐ์„œ Arrays.copyOfRange๋Š” char์—์„œ ๋ฐฐ์—ด์˜ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค... ์•„์ฃผ ์‚ฌ์†Œํ•œ ์ฝ”๋“œ์ด๋ฉฐ, ์ƒˆ ๋ฌธ์ž ์ง‘ํ•ฉ์ด ํฌํ•จ๋œ ์ƒˆ ํ–‰์ด ๊ฐ„๋‹จํžˆ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด ๋ณด์˜€์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋ญ”๊ฐ€๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค... ๊ทธ๋ž˜์„œ ๋‚ด ๊ฒฐ๋ก ์„ ์™„์ „ํžˆ ๋ฏฟ์ง€ ์•Š๊ณ  ๊ฐ•์˜์˜ ๋ฌธ๊ตฌ์— ์˜์กดํ•˜์—ฌ ์–ด๋–ป๊ฒŒ๋“  ์ด ํ•˜์œ„ ๋ฌธ์ž์—ด()์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ 10,000์ž ๊ธธ์ด์˜ ๋ฌธ์ž์—ด์„ ๊ฐ€์ ธ์™€์„œ ์ž„์˜ ๊ธธ์ด์˜ ํ•˜์œ„ ๋ฌธ์ž์—ด 10,000๊ฐœ๋ฅผ ๋งŒ๋“ค๋ฉด ์ด๋Ÿฌํ•œ "ํ•˜์œ„ ๋ฌธ์ž์—ด"์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฑฐ์˜ ์ฐจ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
10_000 ๋Œ€์‹  ์ฆ‰์‹œ 100_000_000์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™œ ์‚ฌ์†Œํ•œ ์ผ์— ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ์žฌ๋นจ๋ฆฌ ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ง‘์–ด๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. bigString.substring(..)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ํ•˜์œ„ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๋ฌธ์ž ๋ฐฐ์—ด์ด ์ค‘๋ณต๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„ ์ฆ๊ฐ€๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ ํ›„ ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ String.substsring() ๋ฉ”์†Œ๋“œ์˜ ์ž‘๋™์— ๋Œ€ํ•ด ๋” ์ด์ƒ ์˜์‹ฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? public class Test { public static void main(String[] args) { System.out.println("ะะฐั‡ะธะฝะฐะตะผ:"); print(); System.out.println("********************************"); char[]big=new char[100_000_000];//ัะพะทะดะฐะตะผ ะฝะพั€ะผะฐะปัŒะฝั‹ะน ั‚ะฐะบะพะน ะผะฐััะธะฒ int j=0;//ะธ ะทะฐะฟะพะปะฝัะตะผ ัั‚ะพั‚ ะผะฐััะธะฒ ะฒััะบะพะน ะตั€ัƒะฝะดะพะน for (int k=0;k list=new ArrayList<>();//ะทะดะตััŒ ะฑัƒะดัƒั‚ ััั‹ะปะบะธ ะฝะฐ ัั‚ั€ะพะบะธ, ั‡ั‚ะพ ะฑั‹ ัะฑะพั€ั‰ะธะบ ะผัƒัะพั€ะฐ ะฝะต ัƒะดะฐะปัะป //ะฝะต ะธัะฟะพะปัŒะทัƒะตะผั‹ะต, ะฟะพ ะตะณะพ ะผะฝะตะฝะธัŽ, ัั‚ั€ะพะบะธ. System.out.println("************************************"); System.out.println("ะขะตะฟะตั€ัŒ ะฑัƒะดะตะผ ัะพะทะดะฐะฒั‚ัŒ ะฟะพะดัั‚ั€ะพะบะธ ั ะฟะพะผะพั‰ัŒัŽ substring(..) ะธ ะฝะฐะฑะปัŽะดะฐั‚ัŒ," + "ั‡ั‚ะพ ะถะต ะฟั€ะพะธัั…ะพะดะธั‚ ั ะฟะฐะผัั‚ัŒัŽ"); for (int i = 2; i <10; i++) { //ัะพะทะดะฐะตะผ ะฟะพะดัั‚ั€ะพะบัƒ, ะธัะฟะพะปัŒะทัƒั ะผะตั‚ะพะด String.substring(..) String sub= bigString.substring(1,bigString.length()-1); //ะตัะปะธ ัั‚ะพั‚ ะผะตั‚ะพะด ะฝะต ัะพะทะดะฐะตั‚ fully ะฝะพะฒั‹ะน ะผะฐััะธะฒ ัะธะผะฒะพะปะพะฒ, ะฐ ั‚ะพะปัŒะบะพ ะฟะพะปัŒะทัƒะตั‚ัั //ะธัั…ะพะดะฝั‹ะผ ะธะท bigString // ั‚ะพ ะฟั€ะธ ัะพะทะดะฐะฝะธะธ ะฝะพะฒะพะน ัั‚ั€ะพะบะธ sub ะผั‹ ะฝะต ะฑัƒะดะตะผ ะฝะฐะฑะปัŽะดะฐั‚ัŒ ะพั‰ัƒั‚ะธะฟั‹ะน ั€ะฐัั…ะพะด ะฟะฐะผัั‚ะธ list.add(sub);//ัั‚ะธ ััั‹ะปะบะธ ะผั‹ ะดะพะปะถะฝั‹ ะณะดะต ะฝะธะฑัƒะดัŒ ั…ั€ะฐะฝะธั‚ัŒ, ะธะฝะฐั‡ะต ัะฑะพั€ั‰ะธะบ ะผัƒัะพั€ะฐ //ะธะทะฑะฐะฒะธั‚ัั ะพั‚ ะฝะตะธะฟะพะปัŒะทัƒะตะผั‹ั… ะพะฑัŠะบั‚ะพะฒ String System.out.print(String.format("ะกะพะทะดะฐะตะผ %d-ัƒัŽ ะฟะพะดัั‚ั€ะพะบัƒ, ะฟั€ะธ ัั‚ะพะผ ", i - 1)); print(); } System.out.println("***************************************"); print(); } static void print(){ System.out.println("ะŸะฐะผัั‚ะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั "+(Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/1024/1024 + " mb"); } } ะะฐั‡ะธะฝะฐะตะผ: ะŸะฐะผัั‚ะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั 0 mb ******************************** ัะพะทะดะฐะป ะฑะพะปัŒัˆัƒัŽ ัั‚ั€ะพะบัƒ bigString ะฝะฐ ะพัะฝะพะฒะต ะผะฐััะธะฒะฐ big. ะขะตะฟะตั€ัŒ: ะŸะฐะผัั‚ะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั 382 mb ************************************ ะขะตะฟะตั€ัŒ ะฑัƒะดะตะผ ัะพะทะดะฐะฒั‚ัŒ ะฟะพะดัั‚ั€ะพะบะธ ั ะฟะพะผะพั‰ัŒัŽ substring(..) ะธ ะฝะฐะฑะปัŽะดะฐั‚ัŒ,ั‡ั‚ะพ ะถะต ะฟั€ะพะธัั…ะพะดะธั‚ ั ะฟะฐะผัั‚ัŒัŽ ะ”ะพะฑะฐะฒะปัะตะผ 1-ัƒัŽ ะฟะพะดัั‚ั€ะพะบัƒ, ะฟั€ะธ ัั‚ะพะผ ะŸะฐะผัั‚ะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั 573 mb ะ”ะพะฑะฐะฒะปัะตะผ 2-ัƒัŽ ะฟะพะดัั‚ั€ะพะบัƒ, ะฟั€ะธ ัั‚ะพะผ ะŸะฐะผัั‚ะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั 763 mb ะ”ะพะฑะฐะฒะปัะตะผ 3-ัƒัŽ ะฟะพะดัั‚ั€ะพะบัƒ, ะฟั€ะธ ัั‚ะพะผ ะŸะฐะผัั‚ะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั 954 mb ะ”ะพะฑะฐะฒะปัะตะผ 4-ัƒัŽ ะฟะพะดัั‚ั€ะพะบัƒ, ะฟั€ะธ ัั‚ะพะผ ะŸะฐะผัั‚ะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั 1145 mb ะ”ะพะฑะฐะฒะปัะตะผ 5-ัƒัŽ ะฟะพะดัั‚ั€ะพะบัƒ, ะฟั€ะธ ัั‚ะพะผ ะŸะฐะผัั‚ะธ ะธัะฟะพะปัŒะทัƒะตั‚ัั 1336 mb Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:3658) at java.lang.String. (String.java:201) at java.lang.String.substring(String.java:1956) at com.javarush.test.tests.Test.main(Test.java:42) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:483) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) Process finished with exit code 1
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION