Day 13(21.09.17) - Gomserker/Java-101 GitHub Wiki

19. μƒμ„±μžμ™€ λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©(Overload)

(1) μƒμ„±μžμ˜ μ˜€λ²„λ‘œλ”©

μ™ΈλΆ€μ—μ„œ λ‹€μ–‘ν•œ 데이터가 μ œκ³΅λ λ•Œ, 이λ₯Ό μ΄μš©ν•΄μ„œ 객체λ₯Ό μ΄ˆκΈ°ν™” ν•˜λ €λ©΄ μƒμ„±μžλ„ λ‹€μ–‘ν•΄μ§ˆ ν•„μš”κ°€ μžˆλ‹€. 예λ₯Ό λ“€μ–΄, 곡μž₯μ—μ„œ μžλ™μ°¨λ₯Ό 찍어낸닀고 κ°€μ •ν• λ•Œ, λͺ¨λΈλͺ…λ§Œ λ“€μ–΄μ˜€κ±°λ‚˜, λͺ¨λΈλͺ…κ³Ό 색상이 같이 λ“€μ–΄μ˜€κ±°λ‚˜, μƒ‰μƒλ§Œ λ“€μ–΄μ˜¨λ‹€κ³  ν•΄μ„œ μžλ™μ°¨λ₯Ό μ•ˆ λ§Œλ“€μˆ˜λŠ” μ—†λŠ” 노릇 μ•„λ‹Œκ°€? λ§ˆμ°¬κ°€μ§€λ‘œ μƒμ„±μžκ°€ ν•˜λ‚˜λ°–μ— μ—†λ‹€λ©΄ λ‹€μ–‘ν•œ 데이터λ₯Ό ν™œμš©ν•˜κΈ°μ— 어렀움이 λ°œμƒν•  수 μžˆλ‹€. μƒμ„±μžμ˜ μ˜€λ²„λ‘œλ”©μ€ μ΄λŸ΄λ•Œ μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ, λ§€κ°œλ³€μˆ˜λ₯Ό λ‹¬λ¦¬ν•˜λŠ” μƒμ„±μžλ₯Ό μ—¬λŸ¬κ°œ μ„ μ–Έν•˜λŠ” 것을 λ§ν•œλ‹€.
λ‹€μŒμ€ Car ν΄λž˜μŠ€μ—μ„œμ˜ μƒμ„±μž μ˜€λ²„λ‘œλ“œ μ˜ˆμ‹œμ΄λ‹€.

public class Car {
 Car() {} // κΈ°λ³Έ μƒμ„±μž
 Car(String model) {}
 Car(String model, String color){}
 Car(String model, String color, int maxSpeed){}
}

μ—¬κΈ°μ„œ λˆˆμ— λ„λŠ” 점은, μœ„μ—μ„œ λ§ν–ˆλ“―μ΄ μƒμ„±μžλ§ˆλ‹€ λ§€κ°œλ³€μˆ˜μ˜ μ’…λ₯˜κ°€ λ‹€λ₯΄λ‹€λŠ” 점이닀. 이 뢀뢄은 μƒμ„±μž μ˜€λ²„λ‘œλ“œμ—μ„œ μ€‘μš”ν•œ 뢀뢄인데, 맀개 λ³€μˆ˜μ˜ μˆœμ„œλ§Œ λ‹€λ₯΄κ³  λ™μΌν•œ κ²½μš°μ—” μƒμ„±μž μ˜€λ²„λ‘œλ”©μ΄λΌκ³  λ³Ό 수 μ—†λ‹€. 즉, μœ„μ˜ μƒμ„±μžμ—

 Car (String color, String model){}

이 μƒμ„±μžλ₯Ό μ„ μ–Έν•œλ‹€κ³  해도 μƒμ„±μž μ˜€λ²„λ‘œλ”©μ— ν•΄λ‹Ήν•˜μ§€ μ•Šκ³  컴파일 μ—λŸ¬κ°€ λ°œμƒν•˜κ²Œ λœλ‹€. λ‹€μŒ μ˜ˆμ‹œλŠ” μœ„μ— μ˜ˆμ‹œλ‘œ λ“  μƒμ„±μž μ˜€λ²„λ‘œλ”©μ„ μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬κ°œμ˜ 객체λ₯Ό μƒμ„±ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•œ 것이닀.
Result

car1.company: Hyundai

car2.company: Hyundai
car2.model: Avante

car3.company: Hyundai
car3.model: Grandeur
car3.color: Red

car4.company: Hyundai
car4.model: Sonata
car4.color: Silver
car4.maxSpeed: 200  

μœ„ μ˜ˆμ‹œλ₯Ό 톡해 Car() μƒμ„±μžμ˜ μ˜€λ²„λ‘œλ”©μ„ μ‚¬μš©ν•¨μœΌλ‘œμ¨ ν•œ μƒμ„±μžλ‘œ λ‹€μ–‘ν•œ 객체λ₯Ό 생성할 수 μžˆλŠ” 것을 확인할 수 μžˆλ‹€.

(2) λ©”μ†Œλ“œμ˜ μ˜€λ²„λ‘œλ”©

μƒμ„±μžμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ λ©”μ†Œλ“œμ˜ μ˜€λ²„λ‘œλ”© λ˜ν•œ 클래슀 내에 같은 μ΄λ¦„μ˜ λ©”μ†Œλ“œλ₯Ό μ—¬λŸ¬κ°œ μ„ μ–Έν•˜λŠ” 것을 λœ»ν•œλ‹€. λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©μ˜ 쑰건은 맀개 λ³€μˆ˜μ˜ νƒ€μž…, 갯수 μ€‘μ—μ„œ ν•˜λ‚˜κ°€ 달라야 ν•œλ‹€. λ‹€μŒ μ˜ˆμ‹œλ₯Ό ν™•μΈν•΄λ³΄μž.

int plus(int x, int y) {
 int result = x + y);
 return result;
}

μœ„ plus() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜κΈ° μœ„ν•΄μ„œλŠ” μ •μˆ˜ ν˜•νƒœμ˜ 값인 λ§€κ°œμ²΄κ°€ 두 개 ν•„μš”ν•˜λ‹€. ν•˜μ§€λ§Œ μ„Έμƒλ§Œμ‚¬ λ§μ…ˆμ— μ •μˆ˜λ§Œ μžˆλŠ” 것이 μ•„λ‹ˆλ‹€. μ‹€μˆ˜λ₯Ό 더할 λ•Œλ„ 있고, μ •μˆ˜μ™€ μ‹€μˆ˜λ₯Ό 더할 λ•Œλ„ μžˆλ‹€. 이럴 κ²½μš°μ— μœ„ plus() λ©”μ†Œλ“œλŠ” μ‚¬μš©ν•  수 μ—†λ‹€. λ§€κ°œλ³€μˆ˜κ°€ μ‹€μˆ˜λ₯Ό λ°›μ§€μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. μ΄λŸ΄λ•Œ λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©μ„ 톡해 double νƒ€μž…μ„ 맀개체둜 λ°›λŠ” plus() λ©”μ†Œλ“œλ₯Ό ν•˜λ‚˜ 더 μƒμ„±ν•˜λ©΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

double plus(double x, double y) {
  double result = x + y;
  return result;
}  

μ΄λ ‡κ²Œ 같은 μ΄λ¦„μœΌλ‘œ μƒμ„±λœ(μ˜€λ²„λ‘œλ”©) λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•  경우 JVM은 λ§€κ°œκ°’μ˜ νƒ€μž…μ„ 보고 λ©”μ†Œλ“œλ₯Ό μ„ νƒν•œλ‹€. μ •μˆ˜ 두 개λ₯Ό μž…λ ₯ν•˜λ©΄ μœ„μ˜ λ©”μ†Œλ“œλ₯Ό, μ‹€μˆ˜ λ‘κ°œλ₯Ό μž…λ ₯ν•˜λ©΄ μ•„λž˜ λ©”μ†Œλ“œλ₯Ό μ„ νƒν•˜λŠ” 것이닀. ν•˜μ§€λ§Œ 이 κ²½μš°μ— x 값에 μ •μˆ˜λ₯Ό, y 값에 μ‹€μˆ˜λ₯Ό μž…λ ₯ν•  κ²½μš°μ—λŠ” μ–΄λ–»κ²Œ ν•˜λƒλŠ” λ‹Ήμ—°ν•œ μ˜λ¬Έμ„ κ°€μ§ˆ 수 μžˆλ‹€. ν•˜μ§€λ§Œ, JVM은 μ•„λž˜ plus() λ©”μ†Œλ“œλ₯Ό μ„ νƒν•œλ‹€. 맀개 λ³€μˆ˜μ˜ νƒ€μž…μ΄ μΌμΉ˜ν•˜μ§€ μ•Šμ„ κ²½μš°μ—” μžλ™ νƒ€μž…λ³€ν™˜(μ˜€ν†  μΊμŠ€νŒ…)이 κ°€λŠ₯ν•œμ§€λ₯Ό κ²€μ‚¬ν•˜κΈ° 떄문이닀. λ”°λΌμ„œ, int νƒ€μž…μ€ double νƒ€μž…μœΌλ‘œ λ³€ν™˜μ΄ κ°€λŠ₯ν•˜λ―€λ‘œ μ•„λž˜μ˜ plus() λ©”μ†Œλ“œκ°€ μ„ νƒλ˜λŠ” 것이닀.
λ‹€μŒμ€ 숫자 ν•˜λ‚˜λ₯Ό λ°›μœΌλ©΄ μ •μ‚¬κ°ν˜•μ˜ 넓이λ₯Ό, λ‘κ°œλ₯Ό λ°›μœΌλ©΄ μ§μ‚¬κ°ν˜•μ˜ 넓이λ₯Ό κ³„μ‚°ν•˜μ—¬ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ˜ μ˜ˆμ‹œμ΄λ‹€. μ •μ‚¬κ°ν˜•κ³Ό μ§μ‚¬κ°ν˜•μ˜ μ˜μ–΄λŠ” λ‹€λ₯΄μ§€λ§Œ λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©μ˜ μ˜ˆμ‹œλ₯Ό λ“€κΈ° μœ„ν•¨μ΄λ‹ˆ λ„˜μ–΄κ°€λ„λ‘ ν•˜μž.
Result

area of square : 100.0
area of rectangle : 40.0

μœ„ μ˜ˆμ‹œμ˜ μ½”λ“œμ—μ„œ 확인할 수 μžˆλ“―, μž…λ ₯된 λ§€κ°œκ°’μ€ μ •μˆ˜ν˜•μ΄μ§€λ§Œ μ‹€μˆ˜λ‘œ μžλ™λ³€ν™˜ λ˜μ–΄ μ‹€μˆ˜ 값을 뱉어낸닀.

20. Staticκ³Ό Static member

static은 '정적, κ³ μ •λœ'μ΄λž€ μ˜λ―Έμ΄λ‹€. static memberλŠ” ν΄λž˜μŠ€μ— κ³ μ •λœ λ©€λ²„λ‘œ, 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ μ„œ μ‚¬μš©ν•  수 μžˆλŠ” ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό λ§ν•œλ‹€. 이λ₯Ό 각각 static field(정적 ν•„λ“œ), static method(정적 λ©”μ†Œλ“œ)라고 λΆ€λ₯Έλ‹€. λ˜ν•œ 객체에 μ†Œμ†λœ 멀버가 μ•„λ‹ˆλΌ ν΄λž˜μŠ€μ— μ†Œμ†λœ 멀버이기 λ•Œλ¬Έμ— class member라고도 ν•œλ‹€.

이 정적 ν•„λ“œμ™€ 정적 λ©”μ†Œλ“œλŠ” 클래슀 λ‘œλ”κ°€ 클래슀λ₯Ό λ‘œλ”©ν•΄μ„œ λ©”μ†Œλ“œ λ©”λͺ¨λ¦¬ μ˜μ—­μ— μ μž¬ν•  λ•Œ 클래슀 λ³„λ‘œ κ΄€λ¦¬λœλ‹€. λ•Œλ¬Έμ— 클래슀의 λ‘œλ”©μ΄ λλ‚˜λ©΄ λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλŠ” 것이닀.

(1) static member μ„ μ–Έ

정적 ν•„λ“œμ™€ λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•˜λŠ” 방법은 각각을 μ„ μ–Έν•  λ•Œ static ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬μ£Όλ©΄ λœλ‹€.

public class ClassName {
  //static field
  static classtype field ();

  //static method
  static returntype method() {}

μ—¬κΈ°μ„œ ν•„λ“œλ₯Ό 객체의 ν•„λ“œλ‘œ μ„ μ–Έν•  것인가, μ•„λ‹ˆλ©΄ 정적 ν•„λ“œλ‘œ μ„ μ–Έν•  κ²ƒμΈκ°€μ˜ νŒλ‹¨ 기쀀은, κ°μ²΄λ§ˆλ‹€ λ³„κ°œλ‘œ κ°€μ§€κ³  μžˆμ–΄μ•Ό ν•  데이터라면 객체의 ν•„λ“œλ‘œ μ„ μ–Έν•˜κ³ , κ°μ²΄λ§ˆλ‹€ κ°€μ§€κ³  μžˆμ„ ν•„μš”μ„±μ΄ μ—†λŠ” 곡용적인 데이터라면 정적 ν•„λ“œλ‘œ μ„ μ–Έν•˜λŠ” 것이 μ’‹λ‹€. 예λ₯Ό λ“€μ–΄ 파이(3.141592...)의 경우, μ–Έμ œ μ–΄λ””μ„œλ‚˜ λˆ„κ°€ μ‚¬μš©ν•˜λ”λΌλ„ 같은 λ³€ν•˜μ§€ μ•ŠλŠ” 곡용적인 λ°μ΄ν„°μ΄λ―€λ‘œ 정적 ν•„λ“œλ‘œ μ„ μ–Έν•˜λŠ” 것이 μ’‹λ‹€.

λ©”μ†Œλ“œ λ˜ν•œ 객체 λ©”μ†Œλ“œλ‘œ μ„ μ–Έν•  것인가, 정적 λ©”μ†Œλ“œλ‘œ μ„ μ–Έν•  κ²ƒμΈκ°€μ˜ νŒλ‹¨ 기쀀이 μžˆλŠ”λ°, 객체 ν•„λ“œλ₯Ό μ΄μš©ν•΄μ„œ μ‹€ν–‰ν•œλ‹€λ©΄ 객체 λ©”μ†Œλ“œλ‘œ, 객체 ν•„λ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 정적 λ©”μ†Œλ“œλ‘œ μ„ μ–Έν•œλ‹€. 예λ₯Ό λ“€μ–΄, 계산기 클래슀λ₯Ό μž‘μ„±ν•œλ‹€κ³  κ°€μ •ν• λ•Œ, λ§μ…ˆκ³Ό λΊ„μ…ˆμ˜ κ²½μš°μ—” μ™ΈλΆ€μ—μ„œ μ£Όμ–΄μ§„ λ§€κ°œκ°’μ„ κ°€μ§€κ³  μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ―€λ‘œ 정적 λ©”μ†Œλ“œλ‘œ μ„ μ–Έν•˜λŠ” 것이 μ’‹λ‹€. ν•˜μ§€λ§Œ κ³„μ‚°κΈ°μ˜ μƒ‰κΉ”μ΄λ‚˜ 가격 등을 μ„€μ •ν•˜λŠ” λ©”μ†Œλ“œλŠ” 객체 λ©”μ†Œλ“œλ‘œ μ„ μ–Έν•΄μ•Ό ν•œλ‹€.

(2) 정적 λ©€λ²„μ˜ μ‚¬μš©

ν΄λž˜μŠ€κ°€ λ‘œλ”©λ˜λ©΄ 정적 멀버λ₯Ό λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλŠ”λ°, 클래슀 이름과 ν•¨κ»˜ λ„νŠΈ(.) μ—°μ‚°μžλ‘œ μ ‘κ·Όν•œλ‹€. 예λ₯Ό λ“€μ–΄,

public class Calculator {
 static double pi = 3.141592;
 static int plus(int x, int y) {...}
 static int minus(int x, int y) {...}
}

μœ„μ™€ 같이 ν΄λž˜μŠ€κ°€ μž‘μ„±λ˜μ—ˆλ‹€λ©΄, 정적 ν•„λ“œ pi와 정적 λ©”μ†Œλ“œ plus와 minusλŠ” λ‹€μŒκ³Ό 같이 μ‚¬μš©ν•  수 μžˆλ‹€.

double result1 = 10 * 10 * Calculator.pi;
int result2 = Calculator.plus(10,5);
int result3 = Calculator.minus(10,5);

μ›μΉ™μ μœΌλ‘œλŠ” μœ„μ™€ 같이 클래슀 이름을 μ‚¬μš©ν•΄μ„œ μ ‘κ·Όν•΄μ•Ό ν•˜λ‚˜, 객체λ₯Ό μƒμ„±ν•œ λ’€, μ°Έμ‘° λ³€μˆ˜λ‘œλ„ 접근이 κ°€λŠ₯ν•˜λ‹€. ν•˜μ§€λ§Œ 가급적이면 클래슀 μ΄λ¦„μœΌλ‘œ μ ‘κ·Όν•˜λ„λ‘ ν•˜μž. μ΄ν΄λ¦½μŠ€μ—μ„œλŠ” μ• μ΄ˆμ— 정적 멀버λ₯Ό μ°Έμ‘°λ³€μˆ˜λ‘œ μ ‘κ·Όν•˜λ©΄ κ²½κ³  ν‘œμ‹œκ°€ λœ¬λ‹€. λ‹€μŒ μ˜ˆμ‹œλŠ” 정적 멀버λ₯Ό μ‚¬μš©ν•œ 계산기 클래슀λ₯Ό μž‘μ„±ν•œ 것이닀.
Result

result1: 314.159
result2: 15
result3: 5
---------------------------
result4: 314.159
result5: 15
result6: 5  

μœ„ μ˜ˆμ‹œμ—μ„œ 확인할 수 μžˆλ“―, μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ 정적 멀버에 μ ‘κ·Όν•  수 μžˆμœΌλ‚˜, 가급적이면 클래슀λͺ…을 μ‚¬μš©ν•΄ ν˜ΈμΆœν•˜λ„λ‘ ν•˜μž.