1. 객체지ν–₯ μ–Έμ–΄


  • κ°μ œμ§€ν–₯ μ–Έμ–΄ = ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄ + 객체지ν–₯ κ°œλ…(κ·œμΉ™)

핡심 κ°œλ…

  1. μΊ‘μŠν™”
  2. 상속
  3. 좔상화
  4. λ‹€ν˜•μ„±

객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°

  • νŠΉμ§•
    • λ‹€ν˜•μ„±
    • 정보 은닉
    • 좔상화
    • μΊ‘μŠν™”
  • μž₯점
    • μœ μ§€λ³΄μˆ˜μ˜ 용이
    • λ³΅μž‘ν•œ λŒ€ν˜• ν”„λ‘œκ·Έλž¨ μž‘μ„± κ°€λŠ₯

2~4. ν΄λž˜μŠ€μ™€ 객체


클래슀

  • μ •μ˜ - 객체λ₯Ό μ •μ˜ν•΄ 놓은 것
  • μš©λ„ - 객체λ₯Ό μƒμ„±ν•˜λŠ”λ° μ‚¬μš©
  • κ°œλ…
    • 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ 섀계도 ν˜Ήμ€ ν‹€
    • μ—°κ΄€λ˜μ–΄ μžˆλŠ” λ³€μˆ˜μ™€ λ©”μ„œλ“œμ˜ 집합

객체

  • μ •μ˜ - μ‹€μ œλ‘œ μ‘΄μž¬ν•˜λŠ” 것. 사물 λ˜λŠ” κ°œλ…
  • μš©λ„ - 객체가 가지고 μžˆλŠ” κΈ°λŠ₯κ³Ό 속성에 따라 닀름
  • κ°œλ…
    • 클래슀의 μΈμŠ€ν„΄μŠ€ν™” : ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό λ§Œλ“œλŠ” κ³Όμ •
    • 클래슀의 νƒ€μž…μœΌλ‘œ μ„ μ–Έλ˜μ—ˆμ„ 경우 객체
    • ν΄λž˜μŠ€μ— μ„ μ–Έλœ κ·ΈλŒ€λ‘œ μ†Œν”„νŠΈμ›¨μ–΄ 상에 μ„€κ³„λ„λ‘œ κ΅¬ν˜„ν•œ λŒ€μƒ
  • νŠΉμ§•
    • β€œν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€β€ 라고도 뢈림
    • OOPκ΄€μ μ—μ„œ 클래슀의 νƒ€μž…μœΌλ‘œ μ„ μ–Έλ˜μ—ˆμ„ λ•Œ 객체라고 뢀름

객체의 κ΅¬μ„±μš”μ†Œ - 속성과 κΈ°λŠ₯

  • 객체 = 속성(λ³€μˆ˜) + κΈ°λŠ₯(λ©”μ„œλ“œ)
class Tv {
	// 속성(λ³€μˆ˜)
	String color;
	boolean power;
	int channel;
	// κΈ°λŠ₯(λ©”μ„œλ“œ)
	void power() {
		power = !power;
	}
	void channelUp() {
		channel++;
	}
	void channelDown() {
		channel--;
	}
}

μΈμŠ€ν„΄μŠ€

  • 객체 : λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ₯Ό λŒ€ν‘œν•˜λŠ” 일반적 μš©μ–΄

  • μΈμŠ€ν„΄μŠ€ : νŠΉμ • ν΄λž˜μŠ€λ‘œλΆ€ν„° μƒμ„±λœ 객체(예:TvμΈμŠ€ν„΄μŠ€)

  • 클래슀 β†’ μΈμŠ€ν„΄μŠ€ν™” β†’ μΈμŠ€ν„΄μŠ€(객체)

  • κ°œλ…

    • 클래슀의 μΈμŠ€ν„΄μŠ€ : ν΄λž˜μŠ€λ‘œλΆ€ν„° λ§Œλ“€μ–΄μ§„ 객체
    • 객체가 λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜μ–΄ μ‹€μ œ μ‚¬μš©λ  λ•Œ μΈμŠ€ν„΄μŠ€
    • 섀계도λ₯Ό λ°”νƒ•μœΌλ‘œ μ†Œν”„νŠΈμ›¨μ–΄ 상에 κ΅¬ν˜„λœ 싀체
      • 즉, 객체λ₯Ό μ†Œν”„νŠΈμ›¨μ–΄ 상에 싀체화
      • μ‹€μ²΄ν™”λœ μΈμŠ€ν„΄μŠ€λŠ” λ©”λͺ¨λ¦¬μ— 할당됨
  • νŠΉμ§•

    • OOPκ΄€μ μ—μ„œ 객체가 λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜μ–΄ μ‹€μ œ μ‚¬μš©λ  λ•Œ μΈμŠ€ν„΄μŠ€λΌκ³  뢀름
    • μΈμŠ€ν„΄μŠ€λŠ” μ–΄λ–€ 원본(좔상적인 κ°œλ…)μœΌλ‘œλΆ€ν„° μƒμ„±λœ λ³΅μ œλ³Έμ„ 의미
    • 좔성적인 κ°œλ…κ³Ό ꡬ체적인 객체 μ‚¬μ΄μ˜ 관계에 μ΄ˆμ μ„ 맞좜 κ²½μš°μ— μ‚¬μš©
      • κ°μ²΄λŠ” 클래슀의 μΈμŠ€ν„΄μŠ€
      • μ‹€ν–‰ ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œκ·Έλž¨μ˜ μΈμŠ€ν„΄μŠ€

μ˜ˆμ‹œ

/* 클래슀 */
public class Animal {
  ...
}
/* 객체와 μΈμŠ€ν„΄μŠ€ */
public class Main {
  public static void main(String[] args) {
    Animal cat, dog; // 클래슀의 νƒ€μž…μœΌλ‘œ '객체' μ„ μ–Έ
    // μΈμŠ€ν„΄μŠ€ν™”
    cat = new Animal(); // cat은 Animal 클래슀의 'μΈμŠ€ν„΄μŠ€'(객체λ₯Ό λ©”λͺ¨λ¦¬μ— ν• λ‹Ή)
    dog = new Animal(); // dog은 Animal 클래슀의 'μΈμŠ€ν„΄μŠ€'(객체λ₯Ό λ©”λͺ¨λ¦¬μ— ν• λ‹Ή)
		Animal rat = new Animal();
		// μ°Έμ‘°λ³€μˆ˜ rat 은 Animal μΈμŠ€ν„΄μŠ€λ₯Ό 가리킀고 μžˆλ‹€.
		// μΈμŠ€ν„΄μŠ€λŠ” 였직 μ°Έμ‘°λ³€μˆ˜λ₯Ό ν†΅ν•΄μ„œλ§Œ λ‹€λ£° 수 μžˆλ‹€.
  }
}

6~7. 객체의 생성과 μ‚¬μš©


1. 객체의 생성

클래슀λͺ… λ³€μˆ˜λͺ…;         // 클래슀의 객체λ₯Ό μ°Έμ‘°ν•˜κΈ° μœ„ν•œ μ°Έμ‘°λ³€μˆ˜λ₯Ό μ„ μ–Έ
λ³€μˆ˜λͺ… = new 클래슀λͺ…(); // 클래슀의 객체λ₯Ό 생성 ν›„, 객체의 μ£Όμ†Œλ₯Ό μ°Έμ‘°λ³€μˆ˜μ— μ €μž₯
Tv t;                   // Tv클래슀 νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜ tλ₯Ό μ„ μ–Έ
t = new Tv();           // TvμΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•œ ν›„, μƒμ„±λœ TvμΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œλ₯Ό t에 μ €μž₯

2. 객체의 μ‚¬μš©

t.channel = 7;   // TvμΈμŠ€ν„΄μŠ€μ˜ λ©€λ²„λ³€μˆ˜ channel의 값을 7둜 μ„€μ •
t.channelDown(); // TvμΈμŠ€ν„΄μŠ€μ˜ λ©”μ„œλ“œ channelDown()을 호좜
System.out.println("ν˜„μž¬ 채널은 " + t.channel + " μž…λ‹ˆλ‹€.");
  • ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ—¬λŸ¬ 개의 μ°Έμ‘°λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” 경우 (κ°€λŠ₯)
  • μ—¬λŸ¬ 개의 μΈμŠ€ν„΄μŠ€λ₯Ό ν•˜λ‚˜μ˜ μ°Έμ‘°λ³€μˆ˜κ°€ κ°€λ¦¬ν‚€λŠ” 경우 (λΆˆκ°€λŠ₯)

8. 객체배열


  • 객체 λ°°μ—΄ == μ°Έμ‘°λ³€μˆ˜ λ°°μ—΄
Tv t1, t2, t3;
Tv[] tvArr = new Tv[3]; // 길이가 3인 Tvνƒ€μž… μ°Έμ‘°λ³€μˆ˜ λ°°μ—΄
// 객체λ₯Ό μƒμ„±ν•΄μ„œ λ°°μ—΄μ˜ 각 μš”μ†Œμ— μ €μž₯
tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();

9~10. 클래슀의 μ •μ˜


  • 클래슀 == 데이터 + ν•¨μˆ˜
  1. λ³€μˆ˜ - ν•˜λ‚˜μ˜ 데이터λ₯Ό μ €μž₯ν•  수 μžˆλŠ” 곡간
  2. λ°°μ—΄ - 같은 μ’…λ₯˜μ˜ μ—¬λŸ¬ 데이터λ₯Ό ν•˜λ‚˜λ‘œ μ €μž₯ν•  수 μžˆλŠ” 곡간
  3. ꡬ쑰체 - μ„œλ‘œ κ΄€λ ¨λœ μ—¬λŸ¬ 데이터(μ’…λ₯˜ 관계X)λ₯Ό ν•˜λ‚˜λ‘œ μ €μž₯ν•  수 μžˆλŠ” 곡간
  4. 클래슀 - 데이터와 ν•¨μˆ˜μ˜ κ²°ν•©(ꡬ쑰체 + ν•¨μˆ˜)
  • μ‚¬μš©μž μ •μ˜ νƒ€μž… - μ›ν•˜λŠ” νƒ€μž…μ„ 직접 λ§Œλ“€ 수 μžˆλ‹€.
// μ‹œκ°„μ„ λ‚˜νƒ€λ‚΄κ³  싢은 νƒ€μž…μ΄ 없을 경우
class Time {
	int hour;
	int minute;
	int second;
}
Time t = new Time();

11. μ„ μ–Έμœ„μΉ˜μ— λ”°λ₯Έ λ³€μˆ˜μ˜ μ’…λ₯˜


class Variables {
	// 클래슀 μ˜μ—­
	// μ„ μ–Έλ¬Έλ§Œ κ°€λŠ₯ (λ³€μˆ˜ μ„ μ–Έ, λ©”μ„œλ“œ μ„ μ–Έ)
	int iv;        // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
	static int cv; // 클래슀 λ³€μˆ˜(staticλ³€μˆ˜, κ³΅μœ λ³€μˆ˜)
	void method() {
		// λ©”μ„œλ“œ μ˜μ—­
		int lv = 0;  // μ§€μ—­λ³€μˆ˜
	}
}
λ³€μˆ˜μ˜ μ’…λ₯˜μ„ μ–Έμœ„μΉ˜μƒμ„±μ‹œκΈ°
클래슀 λ³€μˆ˜ (class variable)클래슀 μ˜μ—­ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— 올라갈 λ•Œ (ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν–ˆμ„ λ•Œ)
μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ (instance variable)클래슀 μ˜μ—­μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ—ˆμ„ λ•Œ
μ§€μ—­λ³€μˆ˜ (local variable)클래슀 μ˜μ—­ μ΄μ™Έμ˜ μ˜μ—­ (λ©”μ„œλ“œ, μƒμ„±μž, μ΄ˆκΈ°ν™” λΈ”λŸ­ λ‚΄λΆ€)λ³€μˆ˜ 선언문이 μˆ˜ν–‰λ˜μ—ˆμ„ λ•Œ

12~13. 클래슀 λ³€μˆ˜μ™€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜


λ©€λ²„λ³€μˆ˜ : 클래슀 μ˜μ—­μ— μ„ μ–Έλœ λ³€μˆ˜

  • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
    • 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 λ•Œ λ§Œλ“€μ–΄μ§
    • μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ κ³ μœ ν•œ 값을 가짐
  • 클래슀 λ³€μˆ˜ (static λ³€μˆ˜)
    • λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅ν†΅μœΌλ‘œ 곡유 (κ³΅ν†΅λœ λ©”λͺ¨λ¦¬ 곡간을 μ°Έμ‘°)
    • 객체 생성 없이 μ‚¬μš© κ°€λŠ₯
class Card {
	// μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ (κ°œλ³„ 속성)
	String kind; // 무늬
	int number;  // 숫자
	// 클래슀 λ³€μˆ˜ (곡톡 속성)
	static int width = 100;  // 폭
	static int height = 250; // 높이
}
// 객체 생성
Card c = new Card();
// μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ„€μ •
c.kind = "HEART";
c.number = 5;
// 클래슀 λ³€μˆ˜ μˆ˜μ • μ‹œ 클래슀.cv 둜 μž‘μ„±
Card.width = 200;
Card.height = 300;

14~16. λ©”μ„œλ“œλž€?


ν•¨μˆ˜μ™€ λ©”μ„œλ“œμ˜ 차이

  • ν•¨μˆ˜ Function
    • νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” μ½”λ“œμ‘°κ°
    • λ…λ¦½λœ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” λ‹¨μœ„
    • ν΄λž˜μŠ€λ‘œλΆ€ν„° 독립적
  • λ©”μ„œλ“œ Method
    • 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ— ν¬ν•¨λ˜μ–΄ μžˆλŠ” ν•¨μˆ˜
    • λ‹€λ₯Έλ§λ‘œ 클래슀 ν•¨μˆ˜

14. λ©”μ„œλ“œλž€?

  1. λ¬Έμž₯듀을 묢어놓은 것.
    • μž‘μ—…λ‹¨μœ„λ‘œ λ¬Έμž₯듀을 λ¬Άμ–΄μ„œ 이름 뢙인 것
  2. κ°’(μž…λ ₯)을 λ°›μ•„μ„œ μ²˜λ¦¬ν•˜κ³ , κ²°κ³Όλ₯Ό λ°˜ν™˜(좜λ ₯)
  • λ©”μ„œλ“œμ˜ μž₯점
    • μ½”λ“œμ˜ 쀑볡을 쀄일 수 있음
    • μ½”λ“œμ˜ 관리가 쉬움
    • μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•  수 있음
    • μ½”λ“œκ°€ κ°„κ²°ν•΄μ„œ μ΄ν•΄ν•˜κΈ° μ‰¬μ›Œμ§
  • λ©”μ„œλ“œμ˜ μž‘μ„±
    • 반볡적으둜 μˆ˜ν–‰λ˜λŠ” μ—¬λŸ¬ λ¬Έμž₯을 λ©”μ„œλ“œλ‘œ μž‘μ„±
    • ν•˜λ‚˜μ˜ λ©”μ„œλ“œλŠ” ν•œ 가지 κΈ°λŠ₯만 μˆ˜ν–‰ν•˜λ„λ‘ μž‘μ„±
  • λ©”μ„œλ“œ = μ„ μ–ΈλΆ€ + κ΅¬ν˜„λΆ€
// μ„ μ–ΈλΆ€
int add (int a, int b) {
	// κ΅¬ν˜„λΆ€
	int result = a + b;
	return result;
}

15. λ©”μ„œλ“œμ˜ κ΅¬ν˜„λΆ€

  • μ§€μ—­λ³€μˆ˜(lv) : λ©”μ„œλ“œ 내에 μ„ μ–Έλœ λ³€μˆ˜
// λ©”μ„œλ“œ μ˜μ—­
int add (int a, int b) {
	// a, b λŠ” λ§€κ°œλ³€μˆ˜
	// a, b, result λŠ” μ§€μ—­λ³€μˆ˜
	int result = a + b;
	return result;
}
// λ©”μ„œλ“œ μ˜μ—­
int multiply (int a, int b) {
	// a, b λŠ” λ§€κ°œλ³€μˆ˜
	// a, b, result λŠ” μ§€μ—­λ³€μˆ˜
	int result = a * b;
	return result;
}

17~19. λ©”μ„œλ“œν˜ΈμΆœ


public class ArgumentParameter {
 
	public static void main(String[] args) {
		int argument = 10;		
		operation(argument); 	// μ „λ‹¬μΈμž(Argument, 원본)
	}
	
	private static int operation(int parameter){ // λ§€κ°œλ³€μˆ˜(Parameter, 볡사본)
		parameter += 10;
		return parameter;
	}
}

Call by value

  • ν•¨μˆ˜μ— μ „λ‹¬λ˜λŠ” 데이터 νƒ€μž…μ΄ Primitive 일 경우
  • ν•¨μˆ˜κ°€ 호좜될 λ•Œ, ν•¨μˆ˜λ₯Ό μœ„ν•œ μž„μ˜μ˜ λ©”λͺ¨λ¦¬ 곡간이 생성됨
  • Call by value λ°©μ‹μœΌλ‘œ 호좜 μ‹œ μ „λ‹¬λ˜λŠ” λ³€μˆ˜μ˜ 값을 λ³΅μ‚¬ν•˜μ—¬ ν•¨μˆ˜μ˜ 인자둜 전달함
  • λ³΅μ‚¬λœ μΈμžλŠ” ν•¨μˆ˜ μ•ˆμ—μ„œ μ§€μ—­μ μœΌλ‘œ μ‚¬μš©λ˜λŠ” local value의 νŠΉμ„±μ„ 가짐
  • 즉, ν•¨μˆ˜ μ•ˆμ—μ„œ 인자의 κ°’(Parameter)이 λ³€κ²½λ˜μ–΄λ„, μ™ΈλΆ€ λ³€μˆ˜μ˜ κ°’(Argument)은 λ³€κ²½ X

Call by reference

  • ν•¨μˆ˜μ— μ „λ‹¬λ˜λŠ” 데이터 νƒ€μž…μ΄ Reference 일 경우
  • Call by reference λ°©μ‹μœΌλ‘œ 호좜 μ‹œ μ „λ‹¬λ˜λŠ” λ³€μˆ˜μ˜ λ²ˆμ§€μˆ˜λ₯Ό 전달함
  • Argument 와 parameter λͺ¨λ‘ 같은 객체λ₯Ό μ°Έμ‘°ν•˜κ²Œ 됨
  • 즉, ν•¨μˆ˜ μ•ˆμ—μ„œ 인자의 값이 λ³€κ²½λ˜λ©΄, μ™ΈλΆ€ λ³€μˆ˜μ˜ 값도 변경됨

22. 호좜 μŠ€νƒ(call stack)


  • λ©”μ„œλ“œ μˆ˜ν–‰μ— ν•„μš”ν•œ λ©”λͺ¨λ¦¬κ°€ μ œκ³΅λ˜λŠ” 곡간
  • λ©”μ„œλ“œκ°€ 호좜되면 ν˜ΈμΆœμŠ€νƒμ— λ©”λͺ¨λ¦¬ ν• λ‹Ή, μ’…λ£Œλ˜λ©΄ ν•΄μ œ

23. κΈ°λ³Έν˜• λ§€κ°œλ³€μˆ˜


  • κΈ°λ³Έν˜• λ§€κ°œλ³€μˆ˜ - λ³€μˆ˜μ˜ 값을 읽기만 ν•  수 μžˆλ‹€. (read only)
  • μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜ - λ³€μˆ˜μ˜ 값을 읽고 λ³€κ²½ν•  수 μžˆλ‹€. (read & write)
class Data {
	int x;
}
 
public class Ex6_6 {
	public static void main(String[] args) {
		Data d = new Data();
		d.x = 10; // Data객체의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ΄ˆκΈ°ν™”
		System.out.println("main() : x = " + d.x);
		change(d.x); // argument둜 Data객체의 xλ₯Ό μ€€λ‹€.
		System.out.println("After change(d.x)");
		// λ©”μ„œλ“œ μ•ˆμ—μ„œλŠ” d.x 와 같은 κΈ°λ³Έν˜• 값을 λ¦¬ν„°λŸ΄λ‘œ μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμ— 변함이 μ—†μŒ
		System.out.println("main() : x = " + d.x);
	}
	static void change(int x) { // parameter둜 Data객체의 xλ₯Ό λ°›μ§€λ§Œ κΈ°λ³Έν˜•μ€ λ¦¬ν„°λŸ΄λ‘œ 전달
		x = 1000; // λ¦¬ν„°λŸ΄ x λ₯Ό 1000 으둜 λ³€κ²½
		System.out.println("change() : x = " + x);
	}
}

24~25. μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜


  • κΈ°λ³Έν˜• λ§€κ°œλ³€μˆ˜ - λ³€μˆ˜μ˜ 값을 읽기만 ν•  수 μžˆλ‹€. (read only)
  • μ°Έμ‘°ν˜• λ§€κ°œλ³€μˆ˜ - λ³€μˆ˜μ˜ 값을 읽고 λ³€κ²½ν•  수 μžˆλ‹€. (read & write)
class Data2 {
	int x;
}
 
public class Ex6_7 {
	public static void main(String[] args) {
		Data2 d = new Data2();
		d.x = 10; // Data2객체의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ xλ₯Ό μ΄ˆκΈ°ν™”
		System.out.println("main() : x = " + d.x);
		change(d);
		System.out.println("After change(d.x)");
		// λ©”μ„œλ“œκ°€ 객체λ₯Ό μ°Έμ‘°ν•˜μ—¬ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μˆ˜μ •ν–ˆκΈ° λ•Œλ¬Έμ— 변경사항이 생김
		System.out.println("main() : x = " + d.x);
	}
	static void change(Data2 d) { // parameter둜 μ°Έμ‘°ν˜• Data2객체λ₯Ό λ°›μŒ
		d.x = 1000; // d객체의 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό 직접 λ³€κ²½
		System.out.println("change() : x = " + d.x);
	}
}

26~29. static λ©”μ„œλ“œ, μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ


μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ

  • μΈμŠ€ν„΄μŠ€ 생성 ν›„, β€˜μ°Έμ‘°λ³€μˆ˜.λ©”μ„œλ“œμ΄λ¦„()’ 으둜 호좜
  • μΈμŠ€ν„΄μŠ€ 멀버(iv, im)와 κ΄€λ ¨λœ μž‘μ—…μ„ ν•˜λŠ” λ©”μ„œλ“œ
  • λ©”μ„œλ“œ λ‚΄μ—μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(iv) μ‚¬μš© κ°€λŠ₯

static λ©”μ„œλ“œ

  • 객체 생성 없이 β€˜ν΄λž˜μŠ€μ΄λ¦„.λ©”μ„œλ“œμ΄λ¦„()’ 으둜 호좜
  • μΈμŠ€ν„΄μŠ€ 멀버(iv, im)와 κ΄€λ ¨μ—†λŠ” μž‘μ—…μ„ ν•˜λŠ” λ©”μ„œλ“œ
  • λ©”μ„œλ“œ λ‚΄μ—μ„œ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(iv) μ‚¬μš© λΆˆκ°€
  • μž‘μ„±ν•œ λ©”μ„œλ“œ 쀑 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ‚˜ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ static

30~31. μ˜€λ²„λ‘œλ”©(overloading)


  • ν•œ 클래슀 μ•ˆμ— 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œ μ—¬λŸ¬ 개 μ •μ˜ν•˜λŠ” 것

μ˜€λ²„λ‘œλ”©μ΄ μ„±λ¦½ν•˜κΈ° μœ„ν•œ 쑰건

  1. λ©”μ„œλ“œ 이름이 κ°™μ•„μ•Ό ν•œλ‹€.
  2. λ§€κ°œλ³€μˆ˜μ˜ 개수 λ˜λŠ” νƒ€μž…μ΄ 달라야 ν•œλ‹€.
  3. λ°˜ν™˜ νƒ€μž…μ€ 영ν–₯μ—†λ‹€.
// ν‹€λ¦° μ˜ˆμ‹œ
// λ°˜ν™˜ νƒ€μž…λ§Œ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— μ˜€λ²„λ‘œλ”©μ΄ μ•„λ‹˜ (쀑볡 μ •μ˜)
int add(int a, int b) {
	return a + b;
}
long add(int a, int b) {
	return (long)(a + b);
}
// μ˜¬λ°”λ₯Έ μ˜ˆμ‹œ
// λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— μ˜€λ²„λ‘œλ”©
long add(int a, long b) {
	return a + b;
}
long add(long a, int b) {
	return a + b;
}

μ˜€λ²„λ‘œλ”©μ˜ μ˜¬λ°”λ₯Έ 예 - λ§€κ°œλ³€μˆ˜λŠ” λ‹€λ₯΄μ§€λ§Œ 같은 의미의 κΈ°λŠ₯μˆ˜ν–‰

class MyMath3 {
	int add(int a, int b) {
		System.out.println("int add(int a, int b) - ");
		return a + b;
	}
	long add(long a, long b) {
		System.out.println("long add(long a, long b) - ");
		return a + b;
	}
	int add(int[] a) {
		System.out.println("int add(int[] a) - ");
		int result = 0;
		for (int i = 0; i < a.length; i++) {
			result += a[i];
		}
		return result;
	}
}

32~35. μƒμ„±μž, κΈ°λ³Έ μƒμ„±μž


μƒμ„±μž (constructor)

Time t = new Time();
t.hour = 12;
t.minute = 34;
t.second = 56;
Time t = new Time(12,34,56);
  • κ°œλ…
    • μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œλ§ˆλ‹€ ν˜ΈμΆœλ˜λŠ” β€˜μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λ©”μ„œλ“œβ€™
    • μΈμŠ€ν„΄μŠ€ 생성 μ‹œ μˆ˜ν–‰ ν•  μž‘μ—…(iv μ΄ˆκΈ°ν™”)에 μ‚¬μš©
ν΄λž˜μŠ€μ΄λ¦„(νƒ€μž… λ³€μˆ˜λͺ…, νƒ€μž… λ³€μˆ˜λͺ…, ...) {
	// μΈμŠ€ν„΄μŠ€ 생성 μ‹œ μˆ˜ν–‰λ  μ½”λ“œ
	// 주둜 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™” μ½”λ“œλ₯Ό μ λŠ”λ‹€.
}
 
class Card {
	Card() { // λ§€κ°œλ³€μˆ˜ μ—†λŠ” μƒμ„±μž
		// μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” μž‘μ—…
	}
	Card(String kind, int number) { // λ§€κ°œλ³€μˆ˜ μ—†λŠ” μƒμ„±μž
		// μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” μž‘μ—…
	}
}
  • νŠΉμ§•
    • 이름이 클래슀 이름과 κ°™μ•„μ•Ό ν•œλ‹€.
    • 리턴값이 μ—†λ‹€. (void μ•ˆ λΆ™μž„)
    • λͺ¨λ“  ν΄λž˜μŠ€λŠ” λ°˜λ“œμ‹œ μƒμ„±μžλ₯Ό κ°€μ Έμ•Ό ν•œλ‹€.

κΈ°λ³Έ μƒμ„±μž (default constructor)

class Data_1 {
	int value;
}
 
class Data_2 {
	int value;
	
	Data_2(int x) { // λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μž
		value = x;
	}
}
 
public class Ex6_11 {
	public static void main(String[] args) {
		Data_1 d1 = new Data_1();
		Data_2 d2 = new Data_2(); // compile error λ°œμƒ
	}
}
  • κ°œλ…
    • λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μž
    • μƒμ„±μžκ°€ ν•˜λ‚˜λ„ 없을 λ•Œλ§Œ, μ»΄νŒŒμΌλŸ¬κ°€ μžλ™ μΆ”κ°€

λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μž

class Car {
	String color;
	String gearType;
	int door;
	Car() {} // κΈ°λ³Έ μƒμ„±μž
	Car(String c, String g, int d) { // λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμ„±μž
		color = c;
		gearType = g;
		door = d;
	}
}
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
Car c = new Car("white", "auto", 4);

36~37. μƒμ„±μž this(), μ°Έμ‘°λ³€μˆ˜ this


μƒμ„±μž this()

class Car2 {
	String color;
	String gearType;
	int door;
	Car2() {
		this("white", "auto", 4);
	}
	Car2(String color) {
		this(color, "auto", 4);
	}
	Car2(String color) {
		door = 5; // 첫 쀄에 쓰지 μ•Šμ•„μ„œ μ—λŸ¬
		Car(color, "auto", 4); // thisλ₯Ό 쓰지 μ•Šμ•„μ„œ μ—λŸ¬
	}
	Car2(String color, String gearType, int door) {
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
}
  • κ°œλ…
    • μƒμ„±μž, 같은 클래슀의 λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©ν•œλ‹€.
  • νŠΉμ§•
    • λ‹€λ₯Έ μƒμ„±μž 호좜 μ‹œ 첫 μ€„μ—μ„œλ§Œ μ‚¬μš©κ°€λŠ₯

μ°Έμ‘°λ³€μˆ˜ this

class Car2 {
	String color;
	String gearType;
	int door;
	Car2(String color, String gearType, int door) {
		// this.colorλŠ” iv, colorλŠ” lv
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
}
  • κ°œλ…
    • μΈμŠ€ν„΄μŠ€ μžμ‹ μ„ κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°λ³€μˆ˜, μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œκ°€ μ €μž₯λ˜μ–΄ μžˆλ‹€.
    • λͺ¨λ“  μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ— μ§€μ—­λ³€μˆ˜λ‘œ μˆ¨κ²¨μ§„ μ±„λ‘œ μ‘΄μž¬ν•œλ‹€.
  • νŠΉμ§•
    • μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ(μƒμ„±μž 포함)μ—μ„œ μ‚¬μš©κ°€λŠ₯ (μ™œ? this λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ—)
    • μ§€μ—­λ³€μˆ˜(lv)와 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(iv)λ₯Ό ꡬ별할 λ•Œ μ‚¬μš©

38~41. λ³€μˆ˜, λ©€λ²„λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”


λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”

class InitTest {
	// μžλ™ μ΄ˆκΈ°ν™”
	// μœ μ§€ 기간이 비ꡐ적 κΈΈκΈ° λ•Œλ¬Έμ— μžλ™ μ΄ˆκΈ°ν™”
	int x;       // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
	int y = x;   // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
	void method1() {
		// μˆ˜λ™ μ΄ˆκΈ°ν™”
		// 호좜 μŠ€νƒ λ©”λͺ¨λ¦¬λŠ” μž¬μ‚¬μš©μ΄ λΉˆλ²ˆν•˜κΈ° 맀번 μžλ™ μ΄ˆκΈ°ν™” μ‹œ μ„±λŠ₯이 μ €ν•˜λ¨
		// μ§€μ—­λ³€μˆ˜λŠ” λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜μ„œ μž‘μ—…ν•˜λŠ” λ™μ•ˆλ§Œ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— 생λͺ… μ£ΌκΈ°κ°€ 짧음
		int i;     // μ§€μ—­λ³€μˆ˜
		int j = i; // μ—λŸ¬. μ§€μ—­λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•˜μ§€ μ•Šκ³  μ‚¬μš©
	}
}
  • κ°œλ…
    • μ§€μ—­λ³€μˆ˜(lv)λŠ” μˆ˜λ™ μ΄ˆκΈ°ν™” 해야함 (μ‚¬μš© μ „ κΌ­!!!)
    • λ©€λ²„λ³€μˆ˜(iv, cv)λŠ” μžλ™ μ΄ˆκΈ°ν™”λœλ‹€.

λ©€λ²„λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”

  • 클래슀 λ³€μˆ˜ μ΄ˆκΈ°ν™” μ‹œμ  : ν΄λž˜μŠ€κ°€ 처음 λ‘œλ”©λ  λ•Œ 단 ν•œ 번
  • μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ΄ˆκΈ°ν™” μ‹œμ  : μΈμŠ€ν„΄μŠ€κ°€ 생성될 λ•Œ λ§ˆλ‹€
  1. λͺ…μ‹œμ  μ΄ˆκΈ°ν™”(=) (κ°„λ‹¨ν•œ μ΄ˆκΈ°ν™”)
class Car {
	int door = 4;            // κΈ°λ³Έν˜•(primitive type) λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”
	Engine e = new Engine(); // μ°Έμ‘°ν˜•(reference type) λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™”
}
  1. μ΄ˆκΈ°ν™” λΈ”λŸ­ (λ³΅μž‘ν•œ μ΄ˆκΈ°ν™”)
    • μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λΈ”λŸ­: { }
    • 클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­: static { }
class StaticBlockTest {
	static int[] arr = new int[10]; // λͺ…μ‹œμ  μ΄ˆκΈ°ν™”
	static { // 클래슀 μ΄ˆκΈ°ν™” λΈ”λŸ­ - λ°°μ—΄ arr을 λ‚œμˆ˜λ‘œ μ±„μš΄λ‹€.
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int)(Math.random() * 10) + 1;
		}
	}
}
  1. μƒμ„±μž (λ³΅μž‘ν•œ μ΄ˆκΈ°ν™”)
Car(String color, String gearType, int door) { // λ§€κ°œλ³€μˆ˜μžˆλŠ” μƒμ„±μž
	this.color = color;
	this.gearType = gearType;
	this.door = door;
}