Study/Java

[Java] OOP ν΄λž˜μŠ€μ™€ 객체

hong- 2022. 5. 10. 10:40

μ•ˆλ…•ν•˜μ„Έμš” λ°±μ—”λ“œκ°œλ°œμž ν™λ―Όμ •μž…λ‹ˆλ‹€.

μ˜€λŠ˜μ€ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ— λŒ€ν•΄μ„œ μ„€λͺ…ν•˜λ €κ³  ν•©λ‹ˆλ‹€ ~~~🐰

☝🏻 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP, Object Oriented Programming) μ΄λž€?

컴퓨터 ν”„λ‘œκ·Έλž¨μ„ κ°μ²΄λΌλŠ” κΈ°λ³Έ λ‹¨μœ„λ‘œ λ‚˜λˆ„κ³  각 객체가 λ©”μ‹œμ§€λ₯Ό μ£Όκ³ λ°›μ•„ 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” λΉ„μ ˆμ°¨μ  ν”„λ‘œκ·Έλž˜λ°μž…λ‹ˆλ‹€.

즉, ν•„μš”ν•œ 데이터λ₯Ό ν•œ 데 λͺ¨μ•„ μΆ”μƒν™”μ‹œμΌœ μƒνƒœμ™€ ν–‰μœ„λ₯Ό κ°€μ§„ 객체λ₯Ό λ§Œλ“€κ³  κ·Έ 객체 κ°„ 유기적 μƒν˜Έμž‘μš©ν•˜λŠ” κ²ƒμœΌλ‘œ

      μ‹€μ œ μ‚¬λ¬Όμ˜ 속성과 κΈ°λŠ₯을 λΆ„μ„ν•œ 후에 ν”„λ‘œκ·Έλž˜λ° λ³€μˆ˜μ™€ ν•¨μˆ˜λ‘œ μ •μ˜ν•˜λ©° μ‹€ 세계λ₯Ό λ°˜μ˜ν•©λ‹ˆλ‹€.

 

μ΄λŠ” μœ μ—°ν•˜κ³  변경이 μ‰½μŠ΅λ‹ˆλ‹€.

  결과적으둜 ν”„λ‘œκ·Έλž¨ 개발 및 μœ μ§€λ³΄μˆ˜μ— λ“œλŠ” λΉ„μš©κ³Ό μ‹œκ°„μ„ 획기적으둜 쀄일 수 있으며

  객체λ₯Ό 톡해 데이터λ₯Ό κ΄€λ¦¬ν•˜μ—¬ 데이터λ₯Ό 손싀 없이 κ΄€λ¦¬ν•˜κΈ° μš©μ΄ν•©λ‹ˆλ‹€.

 

λ˜ν•œ ν•˜λ‚˜μ˜ 객체가 데이터와 λ™μž‘μ„ λͺ¨λ‘ 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

   κ°μ²΄μ˜ 데이터 뢀뢄은 속성(attribute)둜, 객체의 λ™μž‘μ€ λ©”μ†Œλ“œ(method)둜 κ΅¬ν˜„ν•©λ‹ˆλ‹€.


☝🏻 클래슀 Class λž€?

 κ°μ²΄λ₯Ό μ •μ˜ν•œ 섀계도 λ˜λŠ” 틀을 μ˜λ―Έν•©λ‹ˆλ‹€.

 κ°μ²΄μ˜ μƒνƒœμ™€ 행동을 κ΅¬μ²΄ν™”ν•˜λŠ” ν˜•νƒœλ‘œ ν”„λ‘œκ·Έλž˜λ°μ„ μ§„ν–‰ν•˜λ©° μ›ν•˜λŠ” μƒνƒœμ™€ 행동을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ 섀계도라고도 ν•©λ‹ˆλ‹€.

 

 ν΄λž˜μŠ€λŠ” μ œν’ˆμ˜ [섀계도]이며 κ°μ²΄λŠ” [μ œν’ˆ]이라고 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  클래슀λ₯Ό ν™œμš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•¨μœΌλ‘œμ¨ 객체λ₯Ό λ§Œλ“€ 수 있으며 클래슀λ₯Ό 톡해 μƒμ„±λœ 객체λ₯Ό ν•΄λ‹Ή 클래슀의 μΈμŠ€ν„΄μŠ€λΌκ³  λΆ€λ¦…λ‹ˆλ‹€.

  λ•Œλ¬Έμ— ν΄λž˜μŠ€λ‘œλΆ€ν„° 객체λ₯Ό λ§Œλ“œλŠ” 과정을 μΈμŠ€ν„΄μŠ€ν™”λΌκ³  μ§€μΉ­ν•©λ‹ˆλ‹€.

 

  πŸ‘‰πŸ»  μ‰½κ²Œ λΆ•μ–΄λΉ΅μœΌλ‘œ 예λ₯Ό λ“€μ–΄ μ„€λͺ…ν•˜λ©΄,

         λΆ•μ–΄λΉ΅ κΈ°κ³„λŠ” 클래슀λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

         λΆ•μ–΄λΉ΅ κΈ°κ³„λ‘œ 뢕어빡을 λ§Œλ“€μ–΄ λ‚΄λŠ” 것을 μΈμŠ€ν„΄μŠ€ν™”λΌκ³  ν‘œν˜„ν•  수 있으며 뢕어빡을 μΈμŠ€ν„΄μŠ€λΌκ³  ν•©λ‹ˆλ‹€.

 

  🌱 μ—¬κΈ°μ„œ, 객체와 μΈμŠ€ν„΄μŠ€ 차이λ₯Ό μ„€λͺ…ν•˜μžλ©΄,

      λ‘˜μ€ 큰 μ°¨μ΄λŠ” μ—†μŠ΅λ‹ˆλ‹€.

      λ‹€λ§Œ, κ°μ²΄λŠ” λͺ¨λ“  μΈμŠ€ν„΄μŠ€λ₯Ό ν¬κ΄„ν•˜λŠ” 넓은 의미λ₯Ό κ°€μ§€λ©° μΈμŠ€ν„΄μŠ€λŠ” ν•΄λ‹Ή 객체가 μ–΄λ–€ ν΄λž˜μŠ€λ‘œλΆ€ν„° μƒμ„±λœ 것인지λ₯Ό κ°•μ‘°ν•©λ‹ˆλ‹€.


πŸ“ 클래슀의 κΈ°λ³Έ 문법

class 클래슀λͺ… { 
    //클래슀 μ •μ˜
}

   - ν΄λž˜μŠ€λŠ” 기본적으둜 class ν‚€μ›Œλ“œ μ‚¬μš©ν•˜λ©° 클래슀λͺ…은 λŒ€λ¬Έμžλ‘œ μ‹œμž‘

class Car{ //클래슀
	private String carName;   //ν•„λ“œ
        private int carYear;      //ν•„λ“œ
    
    Car(Stirng carName, int carYear){   //μƒμ„±μž
    	this.carName = carName;
        this.carYear = carYear;
    }
    
    public String getModel(){    //λ©”μ†Œλ“œ
      return this.carYear + "년식" + this.carName";

πŸ“ 클래슀의 ꡬ성 : 멀버 λ³€μˆ˜μ™€ μƒμ„±μž

public class ExampleClass{
    int x=10;                   1️⃣ ν•„λ“œ
    void printx() {...}         2️⃣ λ©”μ„œλ“œ
    ExampleClass {...}          3️⃣ μƒμ„±μž
    class ExampleClass2 {...}   4️⃣ μ΄λ„ˆ 클래슀
}

 μ—¬κΈ°μ„œ, μƒμ„±μžλ₯Ό μ œμ™Έν•œ [ ν•„λ“œ, λ©”μ„œλ“œ, μ΄λ„ˆ 클래슀 ] λ₯Ό 클래슀의 멀버라고 λΆ€λ¦…λ‹ˆλ‹€. 

    πŸ‘‰πŸ» 이 쀑 ν•„λ“œμ™€ λ©”μ„œλ“œλŠ” 각각의 ν΄λž˜μŠ€κ°€ κ°€μ§€λŠ” 속성과 κΈ°λŠ₯을 λŒ€ν‘œν•˜λ©° 속성과 κΈ°λŠ₯은 ν•΄λ‹Ή ν΄λž˜μŠ€μ™€ κ΄€λ ¨λœ λ°μ΄ν„°μ˜ 집합이며

         ν•΅μ‹¬μ μΈ 정보λ₯Ό λ‹΄κ³  있음

   1️⃣ ν•„λ“œ field 

   - 클래슀의 속성을 λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜

   - 객체의 속성을 λ³€μˆ˜λ‘œ μ μš©ν•˜κΈ° μœ„ν•΄ μ‚¬μš©

   2️⃣ λ©”μ„œλ“œ method

   - 클래슀의 κΈ°λŠ₯을 λ‚˜νƒ€λ‚΄λŠ” ν•¨μˆ˜

   - 객체의 ν–‰μœ„λ₯Ό λ‚˜νƒ€λƒ„

  3️⃣ μƒμ„±μž constructor

   - 클래슀의 객체λ₯Ό μƒμ„±ν•˜λŠ” μ—­ν• 

   - 객체λ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•œ 속성을 λΆ€μ—¬ν•˜λŠ”λ° μ‚¬μš©

  4️⃣ μ΄λ„ˆ 클래슀 inner class

   - 클래슀 λ‚΄λΆ€μ˜ 클래슀


πŸ“ 클래슀 μ’…λ₯˜

 ν΄λž˜μŠ€λŠ” μ„ μ–Έ μœ„μΉ˜μ— 따라 μ’…λ₯˜κ°€ κ΅¬λΆ„λ©λ‹ˆλ‹€.

    1️⃣  일반 클래슀

    - 파일의 μ‹œμž‘λΆ€λΆ„μ΄λ©° 일반 클래슀λ₯Ό μƒμ„±ν•˜λ €λŠ” λͺ©μ μœΌλ‘œ μ‚¬μš©

class (클래슀 이름)
{ 
	...
}

   2️⃣  쀑첩 클래슀

   - 정적 쀑첩 ν΄λž˜μŠ€λΌκ³ λ„ ν•˜λ©° μ„ μ–Έ μœ„μΉ˜λŠ” 클래슀의 λ‚΄λΆ€

   - static만 μ„ μ–Έ κ°€λŠ₯함

class (일반 클래슀 이름) 
{
	static class (쀑첩 클래슀 이름)
    {
       ...
    }
}

   3️⃣ λ‚΄λΆ€ 클래슀

   - μ„ μ–Έ μœ„μΉ˜λŠ” 클래슀 λ‚΄λΆ€

   - static λ©”μ†Œλ“œ or λ³€μˆ˜λ₯Ό κ°€μ§ˆ 수 μ—†μŒ

   - 이벀트λ₯Ό μ²˜λ¦¬ν•˜κ±°λ‚˜ 데이터 ꡬ쑰 선언을 μœ„ν•΄ μ‚¬μš©

class (일반 클래슀 이름) 
{
	class (λ‚΄λΆ€ 클래슀 이름)
    {
       ...
    }
}

   4️⃣ μ§€μ—­ 클래슀

   - μ„ μ–Έμœ„μΉ˜λŠ” λ©”μ„œλ“œ λ‚΄λΆ€λ‘œ λ©”μ„œλ“œμ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” 클래슀λ₯Ό 생성

   - μ§€μ—­λ³€μˆ˜λ₯Ό final둜 생성

class (일반 클래슀 이름) 
{
	λ©”μ„œλ“œ
    {
		static class (μ§€μ—­ 클래슀 이름)
    	{
       	...
    	}
	}
}

☝🏻 객체 Object λž€?

  클래슀λ₯Όκ°€ μ‹€μ œλ‘œ κ΅¬ν˜„λœ μΈμŠ€ν„΄μŠ€λ‘œ, 클래슀λ₯Ό μΈμŠ€ν„΄μŠ€ν™”ν•œ 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

 

 ν•„λ“œλŠ” 속성을, λ©”μ„œλ“œλŠ” κΈ°λŠ₯이라고 μƒκ°ν•˜λ©΄ λ©λ‹ˆλ‹€.

 ν•˜λ‚˜μ˜ κ°μ²΄λŠ” λ‹€μ–‘ν•œ 속성과 κΈ°λŠ₯의 μ§‘ν•©μœΌλ‘œ 이루어지며 객체의 λ©€λ²„λŠ” 속성 + κΈ°λŠ₯ + μ΄λ„ˆν΄λž˜μŠ€λ‘œ μ΄λ£¨μ–΄μ ΈμžˆμŠ΅λ‹ˆλ‹€.

 - 객체 ? λͺ¨λ“  μ‹€μž¬ν•˜λŠ” μ–΄λ–€ λŒ€μƒ

 - κ°μ²΄λŠ” λˆˆμ— λ³΄μ΄λŠ” 것 뿐만 μ•„λ‹ˆλΌ λˆˆμ— 보이지 μ•ŠλŠ” μ–΄λ–€ λ…Όλ¦¬λ‚˜ κ°œλ…λ„ 범주에 포함

 - κ°μ²΄λŠ” μš°λ¦¬κ°€ 보고 느끼고 인지할 수 μžˆλŠ” λͺ¨λ“  것 = μ‹€μž¬ν•˜λŠ” λͺ¨λ“  것 = μ‚¬μš©ν•  수 μžˆλŠ” 싀체

 

예λ₯Ό λ“€μ–΄ Car 클래슀λ₯Ό λ§Œλ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

class Car{
    private String model;   //μ°¨ λͺ¨λΈ
    private int wheels;     //바퀴 개수
    private int doors;      //차문 개수
    private String color;   //차 컬러
    
    void power() {...}       //μ‹œλ™ κ±ΈκΈ°
    void accelerate() {...}  //가속 ν•˜κΈ°
    void stop() {...}        //μ •μ§€ ν•˜κΈ°
}

  πŸ‘‰πŸ» Car 클래슀 μ•ˆμ˜ 각각의 ν•„λ“œμ™€ λ©”μ„œλ“œλ‘œ κ΅¬ν˜„

 

 - 각 λ³€μˆ˜μ˜ μžλ£Œν˜•μ€ 각 속성 값에 μ•Œλ§žλŠ” κ²ƒμœΌλ‘œ μ •μ˜ (ex. 속성 door의 μžλ£Œν˜•μ€ int둜 !)

 - 개발 섀계 방법둠 : μš°λ¦¬κ°€ μ‹€μ œ μ„Έκ³„μ—μ„œ 사물을 λ°”λΌλ³΄λŠ” 방식에 κ°€μž₯ κ°€κΉŒμš΄ 섀계 방법둠

 - new ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹€μ œ 객체λ₯Ό μƒμ„±ν•˜μ—¬ μ•žμ„œ μ •μ˜ν•œ 클래슀 멀버에 μ ‘κ·Ό κ°€λŠ₯

class CarTest {
	public static void main(String[] args) {
    
    Car bmw = new Car();     // Car 클래슀둜 λ§Œλ“€μ–΄μ§„ bmw μΈμŠ€ν„΄μŠ€
    Car tesla = new Car();   // Car 클래슀둜 λ§Œλ“€μ–΄μ§„ tesla μΈμŠ€ν„΄μŠ€
    Car audi = new Car();    // Car 클래슀둜 λ§Œλ“€μ–΄μ§„ audi μΈμŠ€ν„΄μŠ€
}

✌🏻 객체의 생성과 ν™œμš©

 πŸ“ 객체의 생성 new

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

or

클래슀λͺ… μ°Έμ‘°λ³€μˆ˜λͺ… = new μƒμ„±μž();
  Car   audi   = new  Car();

 (1) νŠΉμ • 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜ μ„ μ–Έ

 (2) new ν‚€μ›Œλ“œμ™€ μƒμ„±μžλ₯Ό 톡해 μΈμŠ€ν„΄μŠ€ μƒμ„±ν•˜μ—¬ μ°Έμ‘°λ³€μˆ˜μ— ν• λ‹Ή

  - μ°Έμ‘°λ³€μˆ˜ ? μ‹€μ œ 데이터 값이 μ•„λ‹ˆλΌ 데이터가 μ €μž₯λ˜μ–΄ μžˆλŠ” ν•© λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°’

  - new ν‚€μ›Œλ“œ ? μƒμ„±λœ 객체λ₯Ό νž™ λ©”λͺ¨λ¦¬μ— λ„£μœΌλΌλŠ” 의미λ₯Ό 가짐

    → μƒμ„±μž( 클래슀 + () )λ₯Ό 톡해 객체가 λ§Œλ“€μ–΄μ§€λ©΄ ν•΄λ‹Ή 객체λ₯Ό νž™ λ©”λͺ¨λ¦¬μ— λ„£μŒ

 

πŸ‘‰πŸ» new ν‚€μ›Œλ“œμ™€ μƒμ„±μžλ₯Ό 톡해 클래슀의 객체λ₯Ό μƒμ„±ν•œλ‹€λŠ” 것은?

                  ν•΄λ‹Ή 객체λ₯Ό νž™ λ©”λͺ¨λ¦¬μ— λ„£κ³  κ·Έ μ£Όμ†Œκ°’μ„ μ°Έμ‘°λ³€μˆ˜μ— μ €μž₯ν•œλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

 - 클래슀 Person은 클래슀 μ˜μ—­μœΌλ‘œ, μ°Έμ‘°λ³€μˆ˜ pλŠ” μŠ€νƒ μ˜μ—­μœΌλ‘œ μ €μž₯

 - μƒμ„±μžλ‘œ λ§Œλ“€μ–΄μ§„ μΈμŠ€ν„΄μŠ€λŠ” νž™ λ©”λͺ¨λ¦¬ μ˜μ—­μ— λ“€μ–΄κ°€λ©° 객체 λ‚΄λΆ€μ—λŠ” 클래슀의 멀버(ν•„λ“œ, λ©”μ„œλ“œ, μ΄λ„ˆν΄λž˜μŠ€)κ°€ μœ„μΉ˜

 - λ©”μ„œλ“œ μ½”λ“œλŠ” 클래슀 μ˜μ—­μ— μ €μž₯되고 객체 μ•ˆμ—μ„œ κ·Έ μœ„μΉ˜λ₯Ό 가리킀고 있음

   → 같은 클래슀둜 λ§Œλ“  λͺ¨λ“  κ°μ²΄λŠ” λ™μΌν•œ λ©”μ„œλ“œ 값을 κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμ— μ—¬λŸ¬ 번 같은 λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•΄μ£ΌλŠ” 것이 μ•„λ‹Œ

        ν•œ 번만 μ €μž₯해두고 ν•„μš”ν•œ κ²½μš°μ—λ§Œ 클래슀 μ˜μ—­μ— μ •μ˜λœ λ©”μ„œλ“œλ₯Ό μ°Ύμ•„ μ‚¬μš© κ°€λŠ₯

 

 πŸ‘‰πŸ» μƒμ„±λœ κ°μ²΄μ—μ„œ ν•„λ“œ 값은 μ‹€μ œ μ €μž₯ 곡간이 객체 내뢀에 있음

 πŸ‘‰πŸ» λ©”μ„œλ“œλŠ” λ‹€λ₯Έ μ˜μ—­μ— ν•˜λ‚˜λ§Œ μ €μž₯ 해놓고 κ³΅μœ ν•¨


πŸ“ 객체의 ν™œμš© : 포인트 μ—°μ‚°μž (.)

μ°Έμ‘°λ³€μˆ˜λͺ….ν•„λ“œλͺ…       // ν•„λ“œκ°’ 뢈러였기
μ°Έμ‘°λ³€μˆ˜λͺ….λ©”μ„œλ“œλͺ…()   // λ©”μ„œλ“œ 호좜

 - 포인트 μ—°μ‚°μžμΈ (.)을 ν™œμš©ν•˜μ—¬ ν•΄λ‹Ή μœ„μΉ˜μ— μžˆλŠ” 객체 μ•ˆμ„ λ³Ό 수 있음

 - .을 ν™œμš©ν•˜μ—¬ νŠΉμ • μΈμŠ€ν„΄μŠ€ 객체의 ν•„λ“œμ™€ λ©”μ„œλ“œ, 즉 객체의 멀버듀에 μ ‘κ·Όν•  수 있음