item 51 sijun - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

[์•„์ดํ…œ51] ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์‹ ์ค‘ํžˆ ์„ค๊ณ„ํ•˜๋ผ

๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜

๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜(Method Signature): ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ์˜ ์กฐํ•ฉ์œผ๋กœ ๋ฉ”์„œ๋“œ์˜ ์„ ์–ธ๋ถ€์˜ ์ผ๋ถ€๋ถ„์ด๋‹ค.

// ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜ -> doSomething(String name)
public static void doSomething(String name){

}

๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์‹ ์ค‘ํžˆ ์ง“์ž

ํ•ญ์ƒ ํ‘œ์ค€ ๋ช…๋ช… ๊ทœ์น™(์•„์ดํ…œ 68)์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค.

์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ณ , ๊ฐ™์€ ํŒจํ‚ค์ง€์— ์†ํ•œ ๋‹ค๋ฅธ ์ด๋ฆ„๋“ค๊ณผ ์ผ๊ด€๋˜๊ฒŒ ์ง€์–ด์•ผ ํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋„๋ฆฌ ๋ฐ›์•„๋“ค์—ฌ์ง€๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๋ฉฐ, ๊ธด ์ด๋ฆ„์„ ํ”ผํ•ด์•ผ ํ•œ๋‹ค.

์• ๋งคํ•˜๋ฉด ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ API ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋ผ. ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์›Œ๋‚™ ๋ฐฉ๋Œ€ํ•˜๋‹ค ๋ณด๋‹ˆ ์ผ๊ด€๋˜์ง€ ์•Š์€ ์ด๋ฆ„๋„ ์ œ๋ฒ• ๋งŽ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ ๋‚ฉ๋“ํ•  ๋งŒํ•œ ์ˆ˜์ค€์ด๋‹ค.

ํŽธ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๋งŒ๋“ค์ง€ ๋งˆ๋ผ

๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ๊ฐ๊ฐ ์ž์‹ ์˜ ์†Œ์ž„์„ ๋‹คํ•ด์•ผ ํ•œ๋‹ค.

ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ๋ชจ๋‘ ๋ฉ”์„œ๋“œ๊ฐ€ ๋งŽ์œผ๋ฉด ์ตํžˆ๊ณ , ์‚ฌ์šฉํ•˜๊ณ , ๋ฌธ์„œํ™”ํ•˜๊ณ , ํ…Œ์ŠคํŠธํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ž์‹ ์˜ ๊ฐ ๊ธฐ๋Šฅ์„ ์™„๋ฒฝํžˆ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค. ์•„์ฃผ ์ž์ฃผ ์“ฐ์ผ ๊ฒฝ์šฐ์—๋งŒ ๋ณ„๋„์˜ ์•ฝ์นญ ๋ฉ”์„œ๋“œ๋ฅผ ๋‘๊ธฐ ๋ฐ”๋ž€๋‹ค. ํ™•์‹ ์ด ์„œ์ง€ ์•Š์œผ๋ฉด ๋งŒ๋“ค์ง€ ๋ง์ž.

๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์€ ์งง๊ฒŒ ์œ ์ง€ํ•˜์ž.

๋งค๊ฐœ๋ณ€์ˆ˜๋Š” 4๊ฐœ ์ดํ•˜๊ฐ€ ์ข‹๊ณ , ๊ฐ™์€ ํƒ€์ž…์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์—ฐ๋‹ฌ์•„ ๋‚˜์˜ค๋ฉด ์‹ค์ˆ˜๋กœ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋‹ˆ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

๊ณผํ•˜๊ฒŒ ๊ธด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ• 3๊ฐ€์ง€๋ฅผ ์†Œ๊ฐœํ•œ๋‹ค.

  1. ์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ๋กœ ์ชผ๊ฐ ๋‹ค.

    ์ชผ๊ฐœ์ง„ ๋ฉ”์„œ๋“œ ๊ฐ๊ฐ์€ ์›๋ž˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์„ ๋ฐ›๋Š”๋‹ค. ์ž˜๋ชปํ•˜๋ฉด ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ง๊ต์„ฑ์„ ๋†’์—ฌ ์˜คํžˆ๋ ค ๋ฉ”์„œ๋“œ ์ˆ˜๋ฅผ ์ค„์—ฌ์ฃผ๋Š” ํšจ๊ณผ๋„ ์žˆ๋‹ค.

    ์ง๊ต์„ฑ์ด ๋†’๋‹คโ†’๊ณตํ†ต์ ์ด ์—†๋Š” ๊ธฐ๋Šฅ๋“ค์ด ์ž˜ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค. ๊ธฐ๋Šฅ์„ ์›์ž์ ์œผ๋กœ ์ชผ๊ฐœ ์ œ๊ณตํ•œ๋‹ค.

    ์˜ˆ๋ฅผ๋“ค์–ด, List์˜ ์ง€์ •๋œ ๋ฒ”์œ„์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

    ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด, ์ง€์ •๋œ ๋ฒ”์œ„์˜ (์‹œ์ž‘, ๋, ์ฐพ์„ ์›์†Œ) 3๊ฐ€์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

    ํ•˜์ง€๋งŒ subList ๋ฉ”์„œ๋“œ์™€ indexOf ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ค„์ด๋ฉฐ ์ง๊ต์„ฑ๋„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

  2. ๋งค๊ฐœ๋ณ€์ˆ˜ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋ฌถ์–ด์ฃผ๋Š” ๋„์šฐ๋ฏธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.

    ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฐ ๋„์šฐ๋ฏธ ํด๋ž˜์Šค๋Š” ์ •์  ๋ฉค๋ฒ„ ํด๋ž˜์Šค๋กœ ๋‘”๋‹ค. ํŠนํžˆ ์ž‡๋”ฐ๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ช‡ ๊ฐœ๋ฅผ ๋…๋ฆฝ๋œ ํ•˜๋‚˜์˜ ๊ฐœ๋…์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์„ ๋•Œ ์ถ”์ฒœํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

    ์˜ˆ๋ฅผ๋“ค์–ด, ์นด๋“œ๊ฒŒ์ž„์„ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์นด๋“œ์˜ ์ˆซ์ž(rank)์™€ ๋ฌด๋Šฌ(suit)๋ฅผ ๋œปํ•˜๋Š” ๋‘ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•ญ์ƒ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ „๋‹ฌํ•  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๋‘˜์„ ๋ฌถ๋Š” ๋„์šฐ๋ฏธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ํ•˜๋‚˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉด API๋Š” ๋ฌผ๋ก  ํด๋ž˜์Šค ๋‚ด๋ถ€ ๊ตฌํ˜„๋„ ๊น”๋”ํ•ด์งˆ ๊ฒƒ์ด๋‹ค.

    public class CardGame {
    
    	...
    
    	static class Card{
    		int rank;
    		String suit;
    		
    		public Card(int rank, String suit) {
    			super();
    			this.rank = rank;
    			this.suit = suit;
    		}
    	}
    }
  3. ๊ฐ์ฒด ์ƒ์„ฑ์— ์‚ฌ์šฉํ•œ ๋นŒ๋” ํŒจํ„ด์„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ์‘์šฉํ•œ๋‹ค.

    ์•ž์„  ๋‘ ๊ธฐ๋ฒ•์„ ํ˜ผํ•ฉํ•œ ๊ฒƒ์œผ๋กœ, ๊ฐ์ฒด ์ƒ์„ฑ์— ์‚ฌ์šฉํ•œ ๋นŒ๋” ํŒจํ„ด์„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ์‘์šฉํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ์ด ๊ธฐ๋ฒ•์€ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์„ ๋•Œ, ํŠนํžˆ ๊ทธ์ค‘ ์ผ๋ถ€๋Š” ์ƒ๋žตํ•ด๋„ ๊ดœ์ฐฎ์„ ๋•Œ ๋„์›€์ด ๋œ๋‹ค.

    ๋จผ์ € ๋ชจ๋“  ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ์ •์˜ํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์—์„œ ์ด ๊ฐ์ฒด์˜ ์„ธํ„ฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ํ•„์š”ํ•œ ๊ฐ’์„ ์„ค์ •ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋‹ค ์„ค์ •ํ•œ ๋‹ค์Œ, execute ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ์•ž์„œ ์„ค์ •ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.

    public class NutritionFacts {
    
    	...
      private final int calories;
    	...
    
      public static class Builder {
    		...
        private int calories      = 0;
    		...
    
    	  public Builder calories(int val){
    			calories = val;      return this;
    		}
    		...
    			
    		public execute(Builder builder){
    			// ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค
    		}
    	  public NutritionFacts build() {
    			return new NutritionFacts(this);
    		}
    
        private NutritionFacts(Builder builder) {
    			calories     = builder.calories;
    			...
    		}
    }

๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํƒ€์ž…์œผ๋กœ๋Š” ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋‚ซ๋‹ค

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ ํ•ฉํ•œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ž. ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๊ตฌํ˜„์ฒด๋„ ์ธ์ˆ˜๋กœ ๊ฑด๋„ฌ ์ˆ˜ ์žˆ๊ณ , ์‹ฌ์ง€์–ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ตฌํ˜„์ฒด๋„ ์ „๋‹ฌ๊ฐ€๋Šฅํ•˜๋‹ค (์„ฑ๋Šฅ ์ข‹์€ ์ƒˆ๋กœ์šด ๊ตฌํ˜„์ฒด๊ฐ€ ๋‚˜์˜ค๋ฉด ์ „๋‹ฌ ๊ฐ€๋Šฅ).

// ํ•˜์ž
public void doSomethingGood(List<String> list) {	
}

// ํ•˜์ง€๋ง์ž
public void doSomethingBad(ArrayList<String> list) {	
}

Boolean ๋ณด๋‹ค๋Š” ์›์†Œ 2๊ฐœ์งœ๋ฆฌ ์—ด๊ฑฐ ํƒ€์ž…์ด ๋‚ซ๋‹ค.

์—ด๊ฑฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์“ฐ๊ธฐ๊ฐ€ ๋” ์‰ฌ์›Œ์ง„๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด, ํ™”์”จ์˜จ๋„์™€ ์„ญ์”จ์˜จ๋„๋ฅผ ์ „๋‹ฌํ•˜์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

public enum TemperatureScale { FARENHEIT, CELSIUS }

Thermometer.newInstance(true) // ๋ถˆ๋ช…ํ™•ํ•˜๋‹ค
Thermometer.newInstance(Temperaturescale.CELSIUS) // ๋ช…ํ™•ํ•˜๋‹ค

๋‘๋ฒˆ์งธ ์ฝ”๋“œ ํ˜ธ์ถœ๋ถ€๋งŒ ๋ณด๋”๋ผ๋„ ๋ฌด์—‡์ด ์ „๋‹ฌ๋˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๋‹ค.

๋˜ํ•œ, ์ถ”ํ›„์— KELVIN ์˜จ๋„๊ฐ€ ์ถ”๊ฐ€ ๋˜๋”๋ผ๋„ ์—ด๊ฑฐ ํƒ€์ž…์—๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ