day22 πŸŒ•

μž₯λ―ΈΒ·2022λ…„ 7μ›” 5일
0

였늘의 μ„±κ³Ό

λͺ©λ‘ 보기
22/129

[μŠ€ν”„λ§ 핡심 원리 - 기본편] μ„Ήμ…˜ 8 μˆ˜κ°•

μ„Ήμ…˜ 8. 빈 생λͺ…μ£ΌκΈ° 콜백 μˆ˜κ°• μ™„λ£Œ!!

μŠ€ν”„λ§ λΉˆμ€ κ°„λ‹¨ν•˜κ²Œ λ‹€μŒκ³Ό 같은 라이프사이클을 가진닀.
객체 생성 ➑️ μ˜μ‘΄κ΄€κ³„ μ£Όμž…

μŠ€ν”„λ§μ€ μ˜μ‘΄κ΄€κ³„ μ£Όμž…μ΄ μ™„λ£Œλ˜λ©΄ μŠ€ν”„λ§ λΉˆμ—κ²Œ 콜백 λ©”μ„œλ“œλ₯Ό 톡해 μ΄ˆκΈ°ν™” μ‹œμ μ„ μ•Œλ €μ£ΌλŠ” λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€. λ˜ν•œ μŠ€ν”„λ§ μ»¨ν…Œμ΄λ„ˆκ°€ μ’…λ£Œλ˜κΈ° 직전에 μ†Œλ©Έ μ½œλ°±μ„ μ€€λ‹€.

μŠ€ν”„λ§μ€ 크게 3가지 λ°©λ²•μœΌλ‘œ 빈 생λͺ…μ£ΌκΈ° μ½œλ°±μ„ μ§€μ›ν•œλ‹€.

  • μΈν„°νŽ˜μ΄μŠ€(InitializingBean, DisposableBean)
  • μ„€μ • 정보에 μ΄ˆκΈ°ν™” λ©”μ„œλ“œ, μ’…λ£Œ λ©”μ„œλ“œ 지정
  • @PostConstruct, @PreDestroy μ• λ…Έν…Œμ΄μ…˜ 지원

계산기


Concurrency vs Parallelism

Concurrency(λ™μ‹œμ„±)

ν•œ μ½”μ–΄μ—μ„œ μ—¬λŸ¬ μŠ€λ ˆλ“œλ₯Ό λΉ λ₯΄κ²Œ κ΅μ°¨ν•˜λ©΄μ„œ λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” 것.

  • Context Switching

λ‚΄κ°€ μ§€κΈˆ TVλ₯Ό 보고 μžˆλ‹€κ³  κ°€μ •ν•˜μž.
그런데 TVλ₯Ό λ³΄λŠ” 도쀑 카톑 μ•ŒλžŒμ΄ μšΈλ Έλ‹€.
이 λ•Œ λ‚˜λŠ” TVλ₯Ό 보닀 카톑에 λ‹΅μž₯을 ν•˜κ³ , λ‹€μ‹œ TVλ₯Ό 보닀 카톑을 ν–ˆλ‹€.
이걸 계속 λ°˜λ³΅ν•˜λ©΄ λ‹€λ₯Έ μ‚¬λžŒμ΄ 봀을 땐 λ™μ‹œμ— 두 가지 일을 ν•˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, 사싀 λ‚˜λŠ” TVλ₯Ό λ³Ό 땐 TV만 보고, 카톑을 λ³Ό 땐 νœ΄λŒ€ν°λ§Œ λ³Έλ‹€.
즉, 짧은 μ‹œκ°„ λ™μ•ˆ μ™”λ‹€ κ°”λ‹€ ν•˜λ©΄μ„œ 일을 μ²˜λ¦¬ν•œλ‹€λŠ” κ±°λ‹€.
(β†’ 주어진 짧은 μ‹œκ°„ λ™μ•ˆ β€˜ν•œ 가지 일(TV 보기)’을 μ²˜λ¦¬ν•˜κ³  λ‹€μŒ μ‹œκ°„μ—” λ‹€λ₯Έ β€˜ν•œ 가지 일(카톑 ν•˜κΈ°)β€˜μ„ μ²˜λ¦¬ν•œλ‹€.)

Concurrency is about dealing with lots of things at once.

λ™μ‹œμ„±μ€ ν•œ λ²ˆμ— μ—¬λŸ¬ 가지 일을 닀룬닀.

λ©€ν‹°νƒœμŠ€ν‚Ήμ€ λ™μ‹œμ„±μ„ λ§Œμ‘±ν•œλ‹€.
μ‹±κΈ€ μ½”μ–΄μ—μ„œ, ν”„λ‘œμ„ΈμŠ€μ—κ²Œ μ•„μ£Ό 짧은 νƒ€μž„ 슬라이슀λ₯Ό μ£Όκ³  κ·Έ μ‹œκ°„ λ™μ•ˆ λ²ˆκ°ˆμ•„κ°€λ©° 일을 μˆ˜ν–‰μ‹œν‚¨λ‹€. κ·Έλ ‡κ²Œ ν•¨μœΌλ‘œμ¨ 마치 λ™μ‹œμ— μ—¬λŸ¬ ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” 것 같은 λŠλ‚Œμ„ μ£ΌλŠ” 것이닀.


Parallelism(병렬성)

2개 μ΄μƒμ˜ μ½”μ–΄μ—μ„œ μ‹€μ œλ‘œ λ™μ‹œμ— μ—¬λŸ¬ μž‘μ—…μ΄ μ²˜λ¦¬λ˜λŠ” 것.

μ•„κΉŒ λ™μ‹œμ„±μ—μ„œ μ“΄ 예λ₯Ό λ“€μžλ©΄, λ‚˜λŠ” λͺΈμ΄ 두 개인 μ‚¬λžŒμ΄λΌκ³  κ°€μ •ν•΄μ•Ό ν•œλ‹€.
κ·Έλž˜μ„œ ν•œ λͺΈμœΌλ‘œλŠ” TVλ₯Ό 보고, λ‹€λ₯Έ ν•œ λͺΈμœΌλ‘œλŠ” 카톑을 ν•˜λŠ” 것이닀.
즉, μ§„μ§œ 두 가지 일을 β€˜λ™μ‹œμ—β€˜ μ²˜λ¦¬ν•˜λŠ” 것이닀.

Parallelism is about doing lots of things at once.

병렬성은 ν•œ λ²ˆμ— μ—¬λŸ¬κ°€μ§€ 일을 ν•œλ‹€.

병렬 처리(Parallel Processing)λŠ” λ™μ‹œμ— μ—¬λŸ¬ 개의 λͺ…령을 μ²˜λ¦¬ν•˜μ—¬ μž‘μ—…μ˜ λŠ₯λ₯ μ„ μ˜¬λ¦¬λŠ” 방식을 λ§ν•œλ‹€.
μ—¬λŸ¬ 개의 λͺ…령을 λ™μ‹œμ— μ²˜λ¦¬ν•˜λŠ” 병렬 μ²˜λ¦¬λŠ” μ½”μ–΄κ°€ μ—¬λŸ¬ 개인 CPUλŠ” 물둠이고 μ½”μ–΄κ°€ ν•˜λ‚˜μΈ CPUμ—μ„œλ„ μž‘λ™ κ°€λŠ₯ν•˜λ‹€.

병렬 처리 μ‹œ κ³ λ € 사항

  • μƒν˜Έ μ˜μ‘΄μ„±μ΄ μ—†μ–΄μ•Ό 병렬 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜λ‹€.
    각 λͺ…령이 μ„œλ‘œ 독립적이고 μ•žμ˜ κ²°κ³Όκ°€ λ’€μ˜ λͺ…령에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

  • 각 λ‹¨κ³„μ˜ μ‹œκ°„μ„ 거의 μΌμ •ν•˜κ²Œ λ§žμΆ°μ•Ό 병렬 μ²˜λ¦¬κ°€ μ›λ§Œν•˜κ²Œ 이루어진닀.
    각 λ‹¨κ³„μ˜ 처리 μ‹œκ°„μ΄ λ“€μ‘₯λ‚ μ‘₯ν•˜λ©΄ μ•žμ˜ μž‘μ—…μ΄ λ¨Όμ € λλ‚˜λ”λΌλ„ κ°€μž₯ κΈ΄ μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” λ‹¨κ³„μ—μ„œ 병λͺ© ν˜„μƒμ΄ λ°œμƒν•œλ‹€.

  • 전체 μž‘μ—… μ‹œκ°„μ„ λͺ‡ λ‹¨κ³„λ‘œ λ‚˜λˆŒμ§€ 잘 따져보아야 ν•œλ‹€.
    병렬 처리의 깊이 N은 λ™μ‹œμ— μ²˜λ¦¬ν•  수 μžˆλŠ” μž‘μ—…μ˜ 개수λ₯Ό μ˜λ―Έν•œλ‹€.
    μ΄λ‘ μ μœΌλ‘œλŠ” N이 컀질수둝 λ™μ‹œμ— μž‘μ—…ν•  수 μžˆλŠ” μž‘μ—…μ˜ κ°œμˆ˜κ°€ λ§Žμ•„μ Έμ„œ μ„±λŠ₯이 λ†’μ•„μ§ˆ 것이닀.
    ν•˜μ§€λ§Œ μž‘μ—…μ„ λ„ˆλ¬΄ 많이 λ‚˜λˆ„λ©΄ 각 λ‹¨κ³„λ§ˆλ‹€ μž‘μ—…μ„ μ΄λ™ν•˜κ³  μƒˆλ‘œμš΄ μž‘μ—…μ„ λΆˆλŸ¬μ˜€λŠ” 데 μ‹œκ°„μ΄ λ„ˆλ¬΄ 많이 κ±Έλ €μ„œ 였히렀 μ„±λŠ₯이 떨어진닀.

병렬 처리 기법

  • νŒŒμ΄ν”„λΌμΈ(Pipeline)
    ν•˜λ‚˜μ˜ 코어에 μ—¬λŸ¬ 개의 μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.
    κΈ°μ‘΄ λ°©μ‹μ—μ„œλŠ” ν•œ λͺ…λ Ήμ–΄λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λͺ…λ Ήμ–΄ 처리 4단계(패치 β†’ 해석 β†’ μ‹€ν–‰ β†’ μ“°κΈ°)λ₯Ό λͺ¨λ‘ 마치고 λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ§€λ§Œ, νŒŒμ΄ν”„λΌμΈμ—μ„œλŠ” λͺ…λ Ήμ–΄ 처리의 λ‹¨κ³„λ§ˆλ‹€ λ…λ¦½μ μœΌλ‘œ κ΅¬μ„±ν•˜μ—¬ 각 단계가 쉬지 μ•Šκ³  λͺ…λ Ήμ–΄λ₯Ό μ²˜λ¦¬ν•  수 있게 ν•œλ‹€.

  • 슈퍼슀칼라(Super-Scalar)
    νŒŒμ΄ν”„λΌμΈμ„ μ²˜λ¦¬ν•  수 μžˆλŠ” μ½”μ–΄λ₯Ό μ—¬λŸ¬ 개 κ΅¬μ„±ν•˜μ—¬ 볡수의 λͺ…λ Ήμ–΄κ°€ λ™μ‹œμ— μ‹€ν–‰λ˜λ„λ‘ ν•œλ‹€.
    μ˜€λŠ˜λ‚ μ˜ CPUλŠ” λŒ€λΆ€λΆ„ 슈퍼슀칼라 기법을 μ‚¬μš©ν•˜κ³  μžˆλ‹€.

  • μŠˆνΌνŒŒμ΄ν”„λΌμΈ(Super-Pipeline)
    νŒŒμ΄ν”„λΌμΈμ˜ 각 단계λ₯Ό μ„ΈλΆ„ν•˜μ—¬ ν•œ 클둝 내에 μ—¬λŸ¬ λͺ…λ Ήμ–΄λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€.
    ν•œ 클둝 내에 μ—¬λŸ¬ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ‹€μŒ λͺ…λ Ήμ–΄κ°€ λΉ λ₯Έ μ‹œκ°„ μ•ˆμ— μ‹œμž‘λ  수 μžˆμ–΄ 병렬 처리 λŠ₯λ ₯이 높아진닀.

  • μŠˆνΌνŒŒμ΄ν”„λΌμΈ 슈퍼슀칼라(Super-Pipelined Super-Scalar)
    μŠˆνΌνŒŒμ΄ν”„λΌμΈ 기법을 μ—¬λŸ¬ 개의 μ½”μ–΄μ—μ„œ λ™μ‹œμ— μˆ˜ν–‰ν•œλ‹€.


κ·Έλž˜μ„œ μ΄λŸ¬ν•œ 일듀을 μ™œ ν•˜λŠλƒ?
λ°”λ‘œ CPU의 μ„±λŠ₯을 ν–₯μƒμ‹œν‚€κΈ° μœ„ν•΄μ„œλ‹€.

CPU의 μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” κ°€μž₯ 쒋은 방법은 CPU의 클둝을 λ†’μ΄κ±°λ‚˜ μΊμ‹œμ˜ 크기λ₯Ό λŠ˜λ¦¬λŠ” 것이닀.
ν•˜μ§€λ§Œ 클둝을 높이면 λ°œμ—΄ λ¬Έμ œκ°€ 생기고 μΊμ‹œλ₯Ό 늘리면 λΉ„μš©μ΄ 발λͺ©μ„ μž‘λŠ”λ‹€.
κ·Έλž˜μ„œ CPU μ½”μ–΄λ₯Ό μ—¬λŸ¬ 개 λ§Œλ“€κ±°λ‚˜ λ™μ‹œμ— μ‹€ν–‰ κ°€λŠ₯ν•œ λͺ…λ Ήμ˜ 개수λ₯Ό λŠ˜λ¦¬λŠ” 것이닀.

즉, λ™μ‹œμ„±κ³Ό 병렬성은 CPUλ₯Ό ν•œκ³„κΉŒμ§€ μ₯μ–΄μ§œλ‚΄κΈ° μœ„ν•΄β€¦ 계속 일을 μ‹œν‚€κΈ° μœ„ν•΄ λ“±μž₯ν•œ κ°œλ…μ΄λΌκ³  보면 λ˜κ² λ‹€.


참고 자료

  1. μ‘°μ„±ν˜Έ, μ‰½κ²Œ λ°°μš°λŠ” 운영체제

  2. μ½”λ”©ν•˜λŠ”μ΄ˆλ‘±, β€œλ³‘λ ¬μ„±κ³Ό 비동기성”, https://youtu.be/au29Z2emEmY

  3. PyCon Korea, β€œλ™μ‹œμ„±κ³Ό 병렬성”, https://youtu.be/Iv3e9Dxt9WY

  4. μ‰¬μš΄μ½”λ“œ, β€œν”„λ‘œμ„ΈμŠ€, μŠ€λ ˆλ“œ, λ©€ν‹°νƒœμŠ€ν‚Ή, λ©€ν‹°μŠ€λ ˆλ”©, λ©€ν‹°ν”„λ‘œμ„Έμ‹±, λ©€ν‹°ν”„λ‘œκ·Έλž˜λ°β€, https://youtu.be/QmtYKZC0lMU


Call By Value와 Call By Reference

+) 22. 07. 17. μΆ”κ°€

Call By Value

ν•¨μˆ˜ 호좜 μ‹œ μ „λ‹¬λ˜λŠ” λ³€μˆ˜μ˜ 값을 λ³΅μ‚¬ν•˜μ—¬ ν•¨μˆ˜μ˜ 인자둜 μ „λ‹¬ν•œλ‹€.

값을 λ³΅μ‚¬ν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ” 방식이기 λ•Œλ¬Έμ— Call By Value에 μ˜ν•΄ λ„˜μ–΄μ˜¨ 값을 μ¦κ°€μ‹œμΌœλ„ μ›λž˜μ˜ 값이 λ³΄μ‘΄λœλ‹€.
λ˜ν•œ, 값을 λ³΅μ‚¬ν•˜μ—¬ λ„˜κΈ°κΈ° λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬μ˜ μ‚¬μš©λŸ‰μ΄ μ¦κ°€ν•œλ‹€.

public class CallByValueExample {

	public static void main(String[] args) {

		Data d = new Data();
		d.x = 10;
		System.out.println("main(): x = " + d.x);

		change(d.x);
		
		System.out.println("change(d.x) λ©”μ„œλ“œ 호좜 ν›„");
		System.out.println("main(): x = " + d.x);

	}	

	public static void change(int x) {

		x = 1000;
		System.out.println("change(): x = " + x);

	}

}

μœ„μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  경우 μ•„λž˜μ™€ 같은 κ²°κ³Όκ°€ λ‚˜μ˜¨λ‹€.

main(): x = 10
change(): x = 1000
change(d.x) λ©”μ„œλ“œ 호좜 ν›„
main(): x = 10

μœ„μ˜ 이미지λ₯Ό 보자. ν˜„μž¬ λ©”λͺ¨λ¦¬ ꡬ쑰λ₯Ό κ°„λž΅ν•˜κ²Œ ν‘œν˜„ν–ˆλ‹€.

λ©”λͺ¨λ¦¬ μƒμ—μ„œ change λ©”μ„œλ“œλŠ” 호좜이 λλ‚˜λ©΄ μ‚¬λΌμ§ˆ 것이닀. 그리고 main이 μ‹€ν–‰ 쀑인 걸둜 λ°”λ€” 것이닀. 그럼 heap μ˜μ—­μ— μžˆλŠ” μΈμŠ€ν„΄μŠ€(10)에 영ν–₯이 λΌμ³€μ„κΉŒ? λ‹Ήμ—°νžˆ μ•„λ‹ˆλ‹€. κ·Έλƒ₯ x 혼자 μ € μœ„μ—μ„œ 지지고 λ³Άκ³  λλ‚œ 것이닀.

κ·ΈλŸ¬λ―€λ‘œ 아무리 change λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œλ‹€ ν•œλ“€ mainμ—μ„œμ˜ d.x 값이 1000으둜 λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€.

이게 λ°”λ‘œ 값을 λ³΅μ‚¬ν•˜μ—¬ μ²˜λ¦¬ν•˜λŠ” λ°©μ‹μ˜ Call By Valueλ‹€.


Call By Reference

ν•¨μˆ˜ 호좜 μ‹œ 인자둜 μ „λ‹¬λ˜λŠ” λ³€μˆ˜μ˜ 레퍼런슀λ₯Ό μ „λ‹¬ν•œλ‹€.

인자둜 받은 κ°’μ˜ μ£Όμ†Œλ₯Ό μ°Έμ‘°ν•˜μ—¬ 직접 값에 영ν–₯을 μ€€λ‹€.
값을 λ³΅μ‚¬ν•˜μ§€ μ•Šκ³  직접 μ°Έμ‘°ν•˜κΈ° λ•Œλ¬Έμ— 속도가 λΉ λ₯΄λ‹€.
λ‹€λ§Œ, 직접 참쑰둜 인해 μ›λž˜μ˜ 값에 영ν–₯을 λ―ΈμΉœλ‹€λŠ” λ¦¬μŠ€ν¬κ°€ μ‘΄μž¬ν•œλ‹€.

public class CallByReferenceExample {

	public static void main(String[] args) {

		Data d = new Data();
		d.x = 10;
		System.out.println("main(): x = " + d.x);

		change(d); //μ£Όμ†Œλ₯Ό λ„˜κ²¨μ€Œ
		
		System.out.println("change(d) λ©”μ„œλ“œ 호좜 ν›„");
		System.out.println("main(): x = " + d.x);

	}	

	public static void change(Data d) {

		d.x = 1000;
		System.out.println("change(): x = " + d.x);

	}

}

μœ„μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•  경우 λ©”λͺ¨λ¦¬ κ΅¬μ‘°λŠ” λŒ€λž΅ μ•„λž˜μ²˜λŸΌ 될 것이닀.

μ•„κΉŒμ™€ λ‹€λ₯΄κ²Œ change λ©”μ„œλ“œκ°€ 값이 μ•„λ‹Œ, d의 μ£Όμ†Œλ₯Ό 전달 λ°›μ•˜κΈ° λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€(10)의 값을 직접 λ³€κ²½μ‹œν‚¬ 수 μžˆλ‹€.

main(): x = 10
change(): x = 1000
change(d) λ©”μ„œλ“œ 호좜 ν›„
main(): x = 1000

그리고 μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄ 보면 μœ„μ™€ 같이 x의 값이 1000으둜 잘 λ³€κ²½λœ 것을 λ³Ό 수 μžˆλ‹€.

이게 λ°”λ‘œ Call By Referenceλ‹€.


κ·Έλ ‡λ‹€λ©΄ Call By Value μ‹œ 값을 μ œλŒ€λ‘œ μ „λ‹¬ν•˜λŠ”(λ³€κ²½λ˜κ²Œ ν•˜λŠ”) 방법은 μ—†μ„κΉŒ?

ν•¨μˆ˜λ₯Ό intν˜•μœΌλ‘œ λ§Œλ“  λ’€ return 값을 μ „λ‹¬ν•΄μ£Όκ±°λ‚˜ λ³€μˆ˜λ₯Ό static으둜 λ§Œλ“€λ©΄ λœλ‹€. (μ•„λž˜ μ°Έκ³  자료 쀑 λ”±μžλ°” λ‹˜μ˜ κ°•μ˜ μ°Έκ³ .)


참고 자료

  1. λ”±μžλ°”, β€œ[μžλ°” 기초 κ°•μ’Œ κ°•μ˜ - λ”±μž‘μ•„] 1-12. λΆ€λ₯΄λŠ” 게 κ°’!!! (Call by Value)”, https://youtu.be/cyvc6kYYu5o

  2. μ½”λ”©ν˜•, β€œ[μžλ°”μž…λ¬Έ-κ³ κΈ‰κΉŒμ§€]7.객체지ν–₯κ°œλ…-2-예제-3(call by value,call by reference)”, https://youtu.be/_-J9_OK0TyI

  3. Jaesung, Lee. 개발의 정석, Apple App Store

profile
김뉴비

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보