Java

객체, 클래슀, λ©€λ²„λ³€μˆ˜, λ©”μ„œλ“œ

쑰밈밍 2022. 2. 18. 16:05

πŸ’‘ 객체 Object

: λ¬Όλ¦¬μ μœΌλ‘œ μ‘΄μž¬ν•˜κ±°λ‚˜ μΆ”μƒμ μœΌλ‘œ 생각할 수 μžˆλŠ” 것 μ€‘μ—μ„œ μžμ‹ μ˜ 속성을 가지고 있고 λ‹€λ₯Έκ²ƒκ³Ό 식별 κ°€λŠ₯ν•œ 것

: "μ˜μ‚¬λ‚˜ ν–‰μœ„κ°€ λ―ΈμΉ˜λŠ” λŒ€μƒ"

: ꡬ체적, 좔상적 데이터 λ‹¨μœ„

  

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

: Object Oriented Programming 

: 객체λ₯Ό 기반으둜 ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ°

cf. 절차 ν”„λ‘œκ·Έλž˜λ° (Procedural Programming), 예: Cμ–Έμ–΄ <- μ‹œκ°„μ˜ 흐름

: 객체 μ •μ˜ -> 객체의 κΈ°λŠ₯ κ΅¬ν˜„ -> 객체 μ‚¬μ΄μ˜ ν˜‘λ ₯ κ΅¬ν˜„

 

πŸ’‘ 클래슀 Class

: 클래슀λͺ…은 κ°λ‹¨μ–΄μ˜ 첫번째 λ¬ΈμžλŠ” λŒ€λ¬Έμžλ‘œ μ‹œμž‘, 'λͺ…사'

: 클래슀λͺ… { } <- μ€‘κ΄„ν˜Έ{}둜 λ‘˜λŸ¬μ‹Έμ•Όν•œλ‹€

* 클래슀λͺ… == μ†ŒμŠ€νŒŒμΌμ˜ 이름(클래슀λͺ….java)와 λ™μΌν•˜κ²Œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€

: 객체에 λŒ€ν•œ 속성과 κΈ°λŠ₯을 μ½”λ“œλ‘œ κ΅¬ν˜„ ν•œ 것

: 객체λ₯Ό μ •μ˜ν•΄λ†“μ€ 것, 객체 생성에 μ‚¬μš©

: 클래슀 μž‘μ„± -> ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό μƒμ„±ν•˜μ—¬ μ‚¬μš© new

: μžλ°”μ˜ λͺ¨λ“  μ½”λ“œλŠ” class 내뢀에 μœ„μΉ˜

: ν•˜λ‚˜μ˜ 클래슀 λ‘λŠ”κ²ƒμ΄ 원칙, μ—¬λŸ¬κ°œμ˜ ν΄λž˜μŠ€κ°€ μžˆλŠ”κ²½μš° public ν΄λž˜μŠ€λŠ” 단 ν•˜λ‚˜.

: public ν΄λž˜μŠ€μ™€ μžλ°” 파일의 이름 μΌμΉ˜ν•΄μ•Ό ν•œλ‹€

 

* 객체의 속성, νŠΉμ„± property, attribute == λ©€λ²„λ³€μˆ˜ member variable

* 객체의 κΈ°λŠ₯ == λ©”μ„œλ“œ method둜 κ΅¬ν˜„

* λ¬Έμž₯의 λμ—λŠ” 항상 μ„Έλ―Έμ½œλ‘ (;)

(μ ‘κ·Ό μ œμ–΄μž) class ν΄λž˜μŠ€μ΄λ¦„{
		멀버 λ³€μˆ˜;
		λ©”μ†Œλ“œ;
}

 

 

* νŒ¨ν‚€μ§€ : μ†ŒμŠ€ μ½”λ“œλ₯Ό μ–΄λ– ν•œ 계측 ꡬ쑰둜 관리할지 κ΅¬μ„±ν•˜λŠ” 것

* ν΄λž˜μŠ€μ— μ„ μ–Έλœ λ³€μˆ˜μΈ κ°μ²΄λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, λ©€λ²„λ³€μˆ˜, 속성이라고도 ν•œλ‹€

* ν΄λž˜μŠ€μ— μ˜ν•΄ μƒμ„±λ˜λŠ” 것은 "객체"

  κ·Έ ν΄λž˜μŠ€μ— μ„ μ–Έλœ λ³€μˆ˜λŠ” "κ°μ²΄λ³€μˆ˜" <- κ°μ²΄λ³€μˆ˜λŠ” λ³€μˆ˜μ΄λ―€λ‘œ 값을 λŒ€μž…ν•  수 μžˆλ‹€. 객체.κ°μ²΄λ³€μˆ˜λͺ…

* setName() λ©”μ„œλ“œ : 클래슀 내에 κ΅¬ν˜„λœ ν•¨μˆ˜ 

* dog.setName("ν‘Έν‚€") == dog.name("ν‘Έν‚€") 둜 κ°’ λŒ€μž…κ°€λŠ₯ν•˜λ‹€

* κ°μ²΄λ³€μˆ˜ == λ©€λ²„λ³€μˆ˜μ˜ 값은 new둜 μƒμ„±λœ 각 κ°μ²΄λ§ˆλ‹€ λ…λ¦½μ μœΌλ‘œ μœ μ§€λœλ‹€ 

 

πŸ’‘ λ©”μ„œλ“œ method == κΈ°λŠ₯

* λ°˜λ³΅λ˜λŠ” 행동 -> ν•œ λ­‰μΉ˜λ‘œ λ¬Άμ–΄ "μ–΄λ–€ μž…λ ₯값을 μ£Όμ—ˆμ„ λ•Œ μ–΄λ–€ 리턴값을 λŒλ €μ€€λ‹€"

: λ©”μ†Œλ“œλͺ…은 '동사', 처음 μ‹œμž‘ λ¬ΈμžλŠ” 항상 μ†Œλ¬Έμž

: 객체의 κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ° μœ„ν•΄ 클래슀 내뢀에 κ΅¬ν˜„λœ ν•¨μˆ˜

* μžλ°”λŠ” ν•¨μˆ˜μ™€ λ©”μ„œλ“œλ₯Ό κ΅¬λΆ„ν•΄μ„œ λ§ν•˜μ§€ μ•ŠλŠ”λ‹€, ν΄λž˜μŠ€λ‚΄μ— μ‘΄μž¬ν•˜λ―€λ‘œ λ‹€ λ©”μ„œλ“œμ΄λ‹€

: μž…λ ₯을 가지고 μ–΄λ–€ 일을 μˆ˜ν–‰ν•œ λ‹€μŒ 결과물을 λ‚΄μ–΄λ†“λŠ” 것

: λ©”μ„œλ“œ 내에 μ‚¬μš©λ˜λŠ” λ³€μˆ˜λŠ” λ©”μ„œλ“œ λ°–μ˜ λ³€μˆ˜μ™€ μƒκ΄€μ—†λŠ”, λ©”μ„œλ“œ μ•ˆμ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” 'λ‘œμ»¬λ³€μˆ˜'이닀

: λ©”μ„œλ“œμ˜ μž…λ ₯값이 객체이고, λ©”μ„œλ“œκ°€ 객체의 속성값을 λ³€κ²½ν•œλ‹€λ©΄,

 λ©”μ„œλ“œ μˆ˜ν–‰ 이후에도 κ°μ²΄λŠ” λ³€κ²½λœ 속성값을 μœ μ§€ν•œλ‹€

* λ©”μ„œλ“œμ— 객체λ₯Ό 전달할 경우 λ©”μ„œλ“œμ—μ„œ 객체의 κ°μ²΄λ³€μˆ˜(속성) 값을 λ³€κ²½ν•  수 μžˆλ‹€

λ¦¬ν„΄μžλ£Œν˜• λ©”μ„œλ“œλͺ…(μž…λ ₯μžλ£Œν˜•1 λ§€κ°œλ³€μˆ˜1, μž…λ ₯μžλ£Œν˜•2 λ§€κ°œλ³€μˆ˜2,...) {

          μ‹€ν–‰λ¬Έ.....

          return 리턴값; // λ¦¬ν„΄μžλ£Œν˜•μ΄ void인 κ²½μš°μ—λŠ” returnλ¬Έ ν•„μš”μ—†λ‹€

}

λ¦¬ν„΄κ°’λ°›μ„λ³€μˆ˜ = 객체.λ©”μ„œλ“œλͺ…(μž…λ ₯인수1, μž…λ ₯인수2,...);	// λ©”μ„œλ“œ μ‚¬μš©

 

πŸ”Ž this : μ΄μš©ν•΄ 객체에 μ ‘κ·Όν•  수 μžˆλ‹€

* λ©”μ„œλ“œκ°€ 객체λ₯Ό 전달 λ°›μœΌλ©΄ λ©”μ„œλ“œ λ‚΄μ˜ κ°μ²΄λŠ” 전달받은 객체 κ·Έ 자체둜 μˆ˜ν–‰λœλ‹€

public class Main {

    int a;	// κ°μ²΄λ³€μˆ˜

    void test() {
        this.a++;
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.a = 1;
        main.test();
        System.out.println(main.a);	// 2

    }

 

 

<return>

: λ©”μ„œλ“œμ˜ κ²°κ³Όκ°’ λŒλ €μ£ΌλŠ” λͺ…λ Ήμ–΄

: λ©”μ„œλ“œμ˜ 리턴값은 μ˜€λ‘œμ§€ return문에 μ˜ν•΄μ„œλ§Œ μƒμ„±λœλ‹€

* return 값이 μ—†λŠ” λ©”μ„œλ“œ => λ¦¬ν„΄νƒ€μž… 뢀뢄에 void라고 ν‘œκΈ°

  λ©”μ„œλ“œ μž‘μ„±μ‹œ, λ¦¬ν„΄μžλ£Œν˜•/void λ‘˜ 쀑 ν•˜λ‚˜λŠ” λ°˜λ“œμ‹œ μžˆμ–΄μ•Όν•œλ‹€.

 

πŸ”Ž μž…λ ₯κ°’O, 좜λ ₯κ°’O

int sum(int a, int b) {

     return a+b;

}

* int c = 객체λͺ….sum(3,4);

  System.out.println(c);    // 7

 

πŸ”Ž μž…λ ₯κ°’X, 좜λ ₯κ°’O

 String say() {

       return "Hi";

  }

* String a = 객체λͺ….say();

  System.out.println(a);    // Hi 

 

πŸ”Ž μž…λ ₯κ°’O, 좜λ ₯κ°’X

void sum(int a, int b){

      System.out.println("합은 " + (a+b) + "μž…λ‹ˆλ‹€");

}

* 객체λͺ….sum(3,4);   // 합은 7μž…λ‹ˆλ‹€

 

πŸ”Ž μž…λ ₯κ°’X, 좜λ ₯κ°’X

void say() {

      System.out.println("Hi");

}

* 객체λͺ….say();   // Hi

 

πŸ”Ž νŠΉλ³„ν•œ 경우 λ©”μ„œλ“œλ₯Ό λΉ μ Έλ‚˜κ°€κΈ°λ₯Ό 원할 λ•Œ return을 λ‹¨λ…μœΌλ‘œ μ‚¬μš©ν•˜μ—¬ λ©”μ„œλ“œλ₯Ό μ¦‰μ‹œ λΉ μ Έλ‚˜κ°ˆ 수 μžˆλ‹€

   * λ¦¬ν„΄μžλ£Œν˜•μ΄ void인 λ©”μ„œλ“œλ§Œ ν•΄λ‹Ή

* fool이 λ“€μ–΄μ˜€λ©΄ λ¬Έμžμ—΄μ„ 좜λ ₯ν•˜μ§€ μ•Šκ³  λ©”μ„œλ“œλ₯Ό μ¦‰μ‹œ λΉ μ Έλ‚˜κ°„λ‹€ <- returnκ°’ void

 

* Sample 클래슀의 sayNick λ©”μ„œλ“œλ₯Ό 호좜

-> Sample 클래슀의 객체λ₯Ό 생성 Sample sample = new Sample();

-> μƒμ„±λœ 객체λ₯Ό 톡해 sayNick λ©”μ„œλ“œ 호좜 sample.sayNick("fool");

 

πŸ”Ž λ§€κ°œλ³€μˆ˜(parameter)와 인수(arguments)

λ§€κ°œλ³€μˆ˜ : λ©”μ„œλ“œμ— μž…λ ₯으둜 μ „λ‹¬λœ 값을 λ°›λŠ” λ³€μˆ˜, λ©”μ„œλ“œμ˜ μž…λ ₯κ°’

인수 : λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ μ „λ‹¬ν•˜λŠ” μž…λ ₯κ°’

 

πŸ’‘ ν•¨μˆ˜ function

: ν•˜λ‚˜μ˜ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” 일련의 μ½”λ“œ

: μ€‘λ³΅λ˜λŠ” κΈ°λŠ₯ -> ν•¨μˆ˜λ‘œ κ΅¬ν˜„

: ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ„œ μ‚¬μš©ν•œλ‹€

public class FunctionEx {

	public static int addNum(int n1, int n2) { // ν•¨μˆ˜ μ„ μ–Έ addNumμ—μ„œ μ„ μ–Έλœ λ³€μˆ˜ n1, n2 
											   			// addNum(num1, num2)값을 λ³΅μ‚¬ν•΄μ„œ λ°›λŠ” μ—­ν• λ§Œ ν•œλ‹€
		int result = n1 + n2;
		return result;
	}
	
	public static void main(String[] args) { // μ‹€μ œ μ‹€ν–‰ λΆ€λΆ„
						// mainμ—μ„œ μ„ μ–Έλœ λ³€μˆ˜ num1, num2 
						// n1, n2와 λ³„κ°œ
		int num1 = 10;
		int num2 = 20;
		
		int sum = addNum(num1, num2);
		System.out.println(sum);
	}
}

* public : λ©”μ†Œλ“œ μ ‘κ·Όμ œμ–΄μž, ν•΄λ‹Ή λ©”μ„œλ“œλŠ” μ–΄λ–€ κ³³μ—μ„œλ“ μ§€ 호좜 κ°€λŠ₯

* void : λ©”μ†Œλ“œ μ‹€ν–‰ ν›„ λ¦¬ν„΄λ˜λŠ” κ°’μ˜ μžλ£Œν˜•

* static : addNum λ©”μ„œλ“œλŠ” static으둜 μ„ μ–Έν•˜μ˜€κΈ° λ•Œλ¬Έμ— λ³„λ„μ˜ 객체 생성없이 λ©”μ„œλ“œ 호좜만으둜 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€

          : "클래슀λͺ….λ©”μ„œλ“œλͺ…" ν˜•νƒœλ‘œ 호좜 κ°€λŠ₯