๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒฑ CS Study/์ž๋ฐ” \ ์Šคํ”„๋ง

์˜์กด์„ฑ, ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

by HelloRabbit 2023. 2. 11.
728x90

Goal

1. ์˜์กด์„ฑ / ์˜์กด๊ด€๊ณ„์™€ ์ฃผ์ž…์‹ ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ
2. ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•˜๋Š” ์ด์œ  ์„ค๋ช…ํ•˜๊ธฐ

 

์˜์กด์„ฑ / ์˜์กด๊ด€๊ณ„๋ž€?

A๊ฐ€ B๋ฅผ ์˜์กดํ•œ๋‹ค = B๊ฐ€ ๋ณ€ํ•˜๋ฉด A์—๊ฒŒ๋„ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค

์ž๋ฐ”์—์„œ ํด๋ž˜์Šค ๊ฐ„ ์˜์กด๊ด€๊ณ„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ 3๊ฐ€์ง€๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฉ๋ฒ• ์„ค๋ช… ๊ถŒ์žฅ
@Autowired ํ•„๋“œ ์ฃผ์ž…์‹ ๋ฐฉ๋ฒ• ์›๋ž˜ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ ์ด์ œ๋Š” IntelliJ์—์„œ ์ƒ์„ฑ์ž ์ฃผ์ž…์‹ ๋ฐฉ๋ฒ• ์“ฐ๋ผ๊ณ  ๊ฒฝ๊ณ  ๋œธ
@Setter ์ˆ˜์ •์ž ์ฃผ์ž…์‹ ๋ฐฉ๋ฒ• Public ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์•„๋ฌด๋‚˜ ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์„ฑ ๋ฌธ์ œ๊ฐ€ ์žˆ
@RequiredArgsConstructor ์ƒ์„ฑ์ž ์ฃผ์ž…์‹ ๋ฐฉ๋ฒ• ***๊ฐ€์žฅ ๊ถŒ์žฅ ํ•˜๋Š” ๋ฐฉ๋ฒ•***

 

1. ํ•„๋“œ ์ฃผ์ž…์‹ ๋ฐฉ๋ฒ• 

  • new ํ‚ค์›Œ๋“œ ์จ์„œ ์˜์กดํ•˜๊ฒŒ ๋˜๋ฉด Driver๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ด๋ฏธ ์–ด๋–ค ์ฐจ๋ฅผ ๊ฐ€์ง€๋Š”์ง€ ์ •ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋†’์€ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๊ณ  ์ฝ”๋“œ๊ฐ€ ์œ ์—ฐํ•˜์ง€ ๋ชปํ•˜๋‹ค!!
public interface Car {  // ์ฐจ ์ธํ„ฐํŽ˜์ด์Šค 
	String getCarName();
}

public class Ferrari implements Car {  // ์ฐจ ์ข…๋ฅ˜ 1
	@Override
	public String getCarName() {
		return "ํŽ˜๋ผ๋ฆฌ ์ž…๋‹ˆ๋‹ค.";
	}
}

public class Porsche implements Car {  // ์ฐจ ์ข…๋ฅ˜ 2
	@Override
	public String getCarName() {
		return "ํฌ๋ฅด์‰ ์ž…๋‹ˆ๋‹ค.";
	}
}

public class Driver {
	private Car car = new Ferrari();  // new ๋ผ๋Š” ํ‚ค์›Œ๋“œ ์จ์„œ Driver๋Š” Car์— ์˜์กดํ•˜๊ฒŒ ๋จ

	public String printCar() {
		return "์ €์˜ ์ฐจ๋Š” " + car.getCarName;
	}
}

๋˜๋Š”

public class Driver {
	@Autowired
	private Car car;

	public String printCar() {
		return "์ €์˜ ์ฐจ๋Š” " + car.getCarName;
	}
}

 

2. ์ˆ˜์ •์ž ์ฃผ์ž…์‹ ๋ฐฉ๋ฒ•

  • ์ˆ˜์ •์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•˜๋ฉด Driver ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค Car๋ฅผ ๊ฐ€์ง€๋Š”์ง€ setCar() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ฎ์€ ๊ฒฐํ•ฉ๋„๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค
  • ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” Car๋ฅผ ์ฃผ์ž…ํ•˜์ง€ ์•Š์•„๋„ Driver ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— printCar() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ ํ–ˆ์„ ๋•Œ NullPointerException์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค
  • ๊ทธ๋ž˜์„œ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค!
public class Driver {
	private Car car;

	// ์ˆ˜์ •์ž(setter)๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…
	public void setCar (Car car) {
		this.car = car;
	}

	// ์ˆ˜์ •์ž๋ฅผ ํ†ตํ•ด Car๋ฅผ ์ฃผ์ž…ํ•˜์ง€ ์•Š์•„๋„ Driver ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—
	// ์ด๋•Œ printCar() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด NullPointerException์ด ๋ฐœ์ƒํ•จ
	public String printCar() {
		return "์ €์˜ ์ฐจ๋Š” " + car.getCarName;
	}
}

 

3. ์ƒ์„ฑ์ž ์ฃผ์ž…์‹ ๋ฐฉ๋ฒ• 

  • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์„ ํ•˜๋ฉด Driver ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์–ด๋–ค ์ฐจ๋ฅผ ๊ฐ€์ง€๋Š”์ง€ ์™ธ๋ถ€์—์„œ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ๋” ์œ ์—ฐํ•ด์ง€๊ณ  ์ˆ˜์ •์ž ์ฃผ์ž…์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค!
public class Driver {
	private final Car car;

	// ์ƒ์„ฑ์ž(constructor)๋ฅผ ํ†ตํ•œ ์˜์กด์„ฑ ์ฃผ์ž…
	public Driver (Car car) {  // ์™ธ๋ถ€์—์„œ Driver ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ฐจ ์ข…๋ฅ˜๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ!
		this.car = car;
	}

	public String printCar() {
		return "์ €์˜ ์ฐจ๋Š” " + car.getCarName;
	}
}

 

์ƒ์„ฑ์ž ์ฃผ์ž…์‹ ๋ฐฉ๋ฒ• ๊ถŒ์žฅ ์ด์œ 

  1. null์„ ์ฃผ์ž…ํ•˜์ง€ ์•Š๋Š” ํ•œ printCar()์—์„œ NullPointerException์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค
  2. ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ํ•˜์ง€ ์•Š์œผ๋ฉด Driver ๊ฐ์ฒด๋ฅผ ์•„์˜ˆ ์ƒ์„ฑํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฏธ๋ฆฌ ์˜ค๋ฅ˜๋ฅผ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค
  3. setter ์ฃผ์ž…์‹ ๋ฐฉ๋ฒ•์—์„œ๋Š” ํ•  ์ˆ˜ ์—†์—ˆ๋˜ final ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•„๋ฌด๋„ Car ๊ฐ์ฒด๋ฅผ ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•  ์ˆ˜ ์—†๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค

+) ๋ณด๋„ˆ์Šค ์ด์œ 

  1. (์Šคํ”„๋ง์—์„œ๋Š”) ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์— ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ตฌ๋™๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์‹œ ๋ฐ”๋กœ ์ˆœํ™˜์ฐธ์กฐ ์—๋Ÿฌ๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค (์ˆ˜์ •์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™์ด ์ž˜ ๋˜๋‹ค๊ฐ€ ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ํ˜ธ์ถœ ๋  ๋•Œ๋งŒ StackOverflowError ์—๋Ÿฌ๊ฐ€ ์ƒ๊ธด๋‹ค)
  2. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์šฉ์ดํ•˜๋‹ค

 

 

๋Œ“๊ธ€