[Java] Class에 λŒ€ν•˜μ—¬ (λ―Έμ™„μ„±)

2021. 3. 15. 20:55γ†κ°œλ… 정리 μž‘μ—…μ‹€/Java

728x90
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”? μ£Όλ‹ˆν•˜λž‘ μž…λ‹ˆλ‹€.

03μ›” 15일 μˆ™μ œλ‘œ Class에 λŒ€ν•˜μ—¬ μ‘°μ‚¬ν•˜λŠ” 것을 받은 κ²ƒμ΄μ—μš”!

μˆ™μ œ λ‚΄μš©μ„ κ³΅μœ ν•΄μ„œ μ—¬λŸ¬λΆ„λ“€κ»˜μ„œλ„ κ³΅λΆ€ν•˜μ‹œλŠ”λ°, λ§Žμ€ 도움 λ˜μ‹œκΈ° λ°”λΌκ² μŠ΅λ‹ˆλ‹€!

그럼 λ°”λ‘œ μ‹œμž‘ ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€!

 

πŸ“Œ Class μˆ™μ œ 01

   πŸ“ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP, Object-Oriented Programing)


 

객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” λͺ¨λ“  데이터λ₯Ό 객체(Object)둜 μ·¨κΈ‰ν•˜λ©°, μ΄λŸ¬ν•œ 객체가 λ°”λ‘œ ν”„λ‘œκ·Έλž˜λ°μ˜ 쀑심이 λ˜λŠ” κ²ƒμ΄μ—μš”.

객체(Object)λž€ κ°„λ‹¨νžˆ μ΄μ•ΌκΈ°ν•˜μžλ©΄ μ‹€ μƒν™œμ—μ„œ μš°λ¦¬κ°€ 인식할 수 μžˆλŠ” μ‚¬λ¬Όλ‘œ μ„€λͺ…ν•  수 μžˆκ² μŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 객체의 μƒνƒœ(State)와 행동(Behavior)을 κ΅¬μ²΄ν™”ν•˜λŠ” ν˜•νƒœμ˜ ν”„λ‘œκ·Έλž˜λ°μ΄ λ°”λ‘œ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° μž…λ‹ˆλ‹€.

이 λ•Œ! 객체λ₯Ό λ§Œλ“€μ–΄ λ‚΄κΈ° μœ„ν•œ 섀계도와 같은 κ°œλ…μ„ 클래슀(Class)라고 ν•©λ‹ˆλ‹€.

 

   πŸ“ 클래슀(Class)


μžλ°”μ—μ„œ 클래슀(Class)λž€ 객체λ₯Ό μ •μ˜ν•˜λŠ” ν‹€ λ˜λŠ” 섀계도와 같은 의미둜 μ‚¬μš©λ©λ‹ˆλ‹€.

μžλ°”μ—μ„œλŠ” μ΄λŸ¬ν•œ 섀계도인 클래슀λ₯Ό 가지고, μ—¬λŸ¬ 객체λ₯Ό μƒμ„±ν•˜μ—¬ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

ν΄λž˜μŠ€λŠ” 객체의 μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν•„λ“œ(Field)와 객체의 행동을 λ‚˜νƒ€λ‚΄λŠ” λ©”μ„œλ“œ(Method)둜 ꡬ성 λ˜λŠ” κ²ƒμ΄μ—μš”.

즉, ν•„λ“œ(Field)λž€ Class에 ν¬ν•¨λœ λ³€μˆ˜(Variable)을 μ˜λ―Έν•œλ‹΅λ‹ˆλ‹€!

λ˜ν•œ, λ©”μ„œλ“œ(Method)λž€ μ–΄λ– ν•œ νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜κΈ° μœ„ν•œ λͺ…λ Ήλ¬Έμ˜ 집합이라 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ£Όλ‹ˆν•˜λž‘μ€ μž…λ ₯값을 λ°›μ•„ 좜λ ₯값을 λ‚΄λŠ” 계산기라고 ν‘œν˜„ν•˜κ³  싢은 κ²ƒμ΄μ—μš”!

 

     πŸ‘‰ Class의 예


public class Car {

	private String modelName;
    private int modelYear;
    private int color;
    private int maxSpeed;
    
    
    public void accelerate() {
    	System.out.println("였빠 달렀!")
    }
    
    public void brake() {
    	System.out.println("멈좰라!");
    }
    
 }
 
 public class Test {
 
 	public void main(String[] args) {

	car.modelName = "람보λ₯΄κΈ°λ‹ˆ";
    car.modelYear = 2016;
    car.color = "주황색";
    car.maxSpeed = 350;
    
    car.accelerate();
    car.brake();
    
    }
 }

λ‚΄ μ°¨ (myCar): 섀계도에 μ˜ν•΄ μƒμ‚°λœ μ°¨λŸ‰

친ꡬ μ°¨(FriendCar): 섀계도에 μ˜ν•΄ μƒμ‚°λœ 또 λ‹€λ₯Έ μ°¨λŸ‰

 

 

   πŸ“ 객체(Object) λ˜λŠ” μΈμŠ€ν„΄μŠ€(Instance)


μžλ°”μ—μ„œ Classλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μš°μ„  ν•΄λ‹Ή Class Type의 객체(Object)λ₯Ό μ„ μ–Έν•΄μ•Ό ν•˜λŠ” κ²ƒμ΄μ—μš”.

μ΄λ ‡κ²Œ Classλ‘œλΆ€ν„° 객체λ₯Ό μ„ μ–Έν•˜λŠ” 과정을 Class의 μΈμŠ€ν„΄μŠ€ν™”λΌκ³  ν•œλ‹΅λ‹ˆλ‹€!

λ˜ν•œ, μ΄λ ‡κ²Œ μ„ μ–Έλœ ν•΄λ‹Ή Class Type의 객체λ₯Ό μΈμŠ€ν„΄μŠ€(Instance)라고 ν•˜λŠ” κ²ƒμ΄μ—μš”.

즉, μΈμŠ€ν„΄μŠ€λž€ Memory에 ν• λ‹Ήλœ 객체λ₯Ό μ˜λ―Έν•˜λŠ” κ²ƒμ΄μ—μš”.

 

μžλ°”μ—μ„œλŠ” ν•˜λ‚˜μ˜ Classλ‘œλΆ€ν„° μ—¬λŸ¬ 개의 μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λ ‡κ²Œ μƒμ„±λœ μΈμŠ€ν„΄μŠ€λŠ” λ…λ¦½λœ Memory 곡간에 μ €μž₯된 μžμ‹ λ§Œμ˜ Fieldλ₯Ό κ°€μ§ˆ 수 μžˆλ‹΅λ‹ˆλ‹€!

ν•˜μ§€λ§Œ, ν•΄λ‹Ή Class의 λͺ¨λ“  λ©”μ„œλ“œ(Method)λŠ” ν•΄λ‹Ή Classμ—μ„œ μƒμ„±λœ λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅μœ ν•˜κ²Œ λœλ‹΅λ‹ˆλ‹€!

 

 

   πŸ“ this와 this()


this μ°Έμ‘° λ³€μˆ˜λŠ” μΈμŠ€ν„΄μŠ€κ°€ λ°”λ‘œ 자기 μžμ‹ μ„ μ°Έμ‘°ν•˜λŠ”λ°, μ‚¬μš©ν•˜λŠ” λ³€μˆ˜μΈ κ²ƒμ΄μ—μš”. μ΄λŸ¬ν•œ this μ°Έμ‘° λ³€μˆ˜λŠ” ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ˜ μ£Όμ†Œλ₯Ό 가리킀고 μžˆλ‹΅λ‹ˆλ‹€!

 

λ‹€μŒ μ˜ˆμ‹œ μ½”λ“œλŠ” Car Class의 μƒμ„±μžλ₯Ό λ‚˜νƒ€λ‚Έ μ˜ˆμ œλžλ‹ˆλ‹€.

public class Car {

	/* μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ (ν•„λ“œ) */
	
	private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;
    
    
    /* μƒμ„±μž */
    
    
    public Car(String modelName, int modelYear, String color, int maxSpeed) {
    	this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
        this.maxSpeed = maxSpeed;
        this.currentSpeed = 0;
    } // μƒμ„±μž 끝
    
} // Class 끝

μœ„μ˜ 예제처럼 μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜ 이름과 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ˜ 이름이 같을 κ²½μš°μ—λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ•žμ— this ν‚€μ›Œλ“œλ₯Ό λΆ™ν˜€μ•Όλ§Œ ν•˜λŠ” κ²ƒμ΄μ—μš”. κ·Έ μ΄μœ λŠ” thisλ₯Ό μž…λ ₯ν•˜μ§€ μ•ŠμœΌλ©΄ κ°€κΉŒμ΄ μžˆλŠ” μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜ 이름인 λ³€μˆ˜λͺ…μœΌλ‘œ 인지λ₯Ό ν•˜κΈ° λ•Œλ¬Έμ΄μ—μš”!

λ§Œμ•½ λ§€κ°œλ³€μˆ˜λͺ…을 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λͺ…κ³Ό λ‹€λ₯΄κ²Œ ν•œλ‹€λ©΄ ꡳ이 thisλ₯Ό λΆ™νžˆμ§€ μ•Šμ•„λ„ λœλ‹΅λ‹ˆλ‹€!

 

μ΄λ ‡κ²Œ μžλ°”μ—μ„œλŠ” this μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” κ²ƒμ΄μ—μš”.

μ΄λŸ¬ν•œ this μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” μ˜μ—­μ€ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 뿐이며, Class λ©”μ„œλ“œμ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λŠ” κ²ƒμ΄μ—μš”.

λͺ¨λ“  μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œμ—λŠ” this μ°Έμ‘° λ³€μˆ˜κ°€ μˆ¨κ²¨μ§„ 지역 λ³€μˆ˜λ‘œ μ‘΄μž¬ν•˜κ³  μžˆλ‹΅λ‹ˆλ‹€!

 

       πŸ‘‰ this()


this() λ©”μ„œλ“œλŠ” μƒμ„±μž λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” κ²ƒμ΄μ—μš”. 이것은 같은 클래슀의 λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©ν•œλ‹΅λ‹ˆλ‹€!

this() λ©”μ„œλ“œμ— 인수λ₯Ό μ „λ‹¬ν•˜λ©΄ μƒμ„±μž 쀑 λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜κ°€ μΌμΉ˜ν•˜λŠ” λ‹€λ₯Έ μƒμ„±μžλ₯Ό μ°Ύμ•„ 호좜 ν•΄ μ£ΌλŠ” κ²ƒμ΄μ—μš”!

 

✏️ λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜(Method Signature)λž€? λ©”μ„œλ“œμ˜ 이름과 λ©”μ„œλ“œμ˜ μ›ν˜•μ— λͺ…μ‹œλ˜λŠ” λ§€κ°œλ³€μˆ˜(인자) 리슀트λ₯Ό κ°€λ₯΄ν‚¨λ‹΅λ‹ˆλ‹€!

 

λ‹€μŒμ€ this μ°Έμ‘° λ³€μˆ˜μ™€ this() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œ μ˜ˆμ œμž…λ‹ˆλ‹€.

public Car {
	private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;
  	
    
    public Car(String modelName, int modelYear, String color, int maxSpeed) {
    	this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
        this.maxSpeed = maxSpeed;
        this.currentSpeed = 0;
    }
    
    public Car() {
    	this("μ†Œλ‚˜νƒ€", 2012, "검정색", 160);		// λ‹€λ₯Έ μƒμ„±μž 호좜!
    }
    
    public String getModel() {
    	return this.modelYear + "년식" + this.modelName + " " + this.color;
    }
  } // Class 끝
    
   /* ########################################################################### */
    
    public class Method05 {
    	public static void main(String[] args) {
        	Car tcpCar = new Car();
            System.out.println(tcpCar.getModel();
        } // Main 끝
    } // Class 끝
    
    
    /* ########################################################################### */
      
    // μ‹€ν–‰ κ²°κ³Ό
    
    // 2012년식 μ†Œλ‚˜νƒ€ 검정색

μœ„μ˜ μ˜ˆμ œμ—μ„œ λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§€λŠ” 첫번째 μƒμ„±μžλŠ” this μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ— μ ‘κ·Όν•˜κ³  μžˆλŠ” κ²ƒμ΄μ—μš”!

λ˜ν•œ, λ§€κ°œλ³€μˆ˜λ₯Ό 가지지 μ•ŠλŠ” λ‘λ²ˆμ§Έ μƒμ„±μžλŠ” λ‚΄λΆ€μ—μ„œ this() λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ 첫번째 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κ³  μžˆλ‹΅λ‹ˆλ‹€!

μ΄λ ‡κ²Œ λ‚΄λΆ€μ μœΌλ‘œ λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜μ—¬ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™” ν•  수 μžˆλŠ” κ²ƒμ΄μ—μš”!

 

✏️ 단, ν•œ μƒμ„±μžμ—μ„œ λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  μ‹œ λ°˜λ“œμ‹œ ν•΄λ‹Ή μƒμ„±μžμ˜ 첫 μ€„μ—μ„œλ§Œ ν˜ΈμΆœν•  수 μžˆλŠ” 것 잊으면 μ•ˆ λ˜λŠ” κ²ƒμ΄μ—μš”!

 

 

   πŸ“ Static(정적) ν‚€μ›Œλ“œ


정적(Static)은 κ³ μ •λœμ΄λž€ 의미λ₯Ό κ°–κ³  μžˆλŠ” κ²ƒμ΄μ—μš”. Staticμ΄λΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ Staticλ³€μˆ˜μ™€ Static λ©”μ„œλ“œλ₯Ό λ§Œλ“€ 수 μžˆλŠ”λ°, λ‹€λ₯Έλ§λ‘œ μ •μ ν•„λ“œμ™€ 정적 λ©”μ„œλ“œλΌκ³  ν•˜λ©°, 이 λ‘˜μ„ 합쳐 정적 멀버(Static Member) ν˜Ήμ€ 클래슀 멀버(Class Member)라고 ν•˜λŠ” κ²ƒμ΄μ—μš”.

정적 ν•„λ“œμ™€ 정적 λ©”μ„œλ“œλŠ” 객체(μΈμŠ€ν„΄μŠ€)에 μ†Œμ†λœ 멀버가 μ•„λ‹ˆλΌ ν΄λž˜μŠ€μ— κ³ μ •λœ λ©€λ²„λΌλŠ” 점을 잊으면 μ•ˆ λ˜λŠ” κ²ƒμ΄μ—μš”. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 클래슀 λ‘œλ”κ°€ 클래슀λ₯Ό λ‘œλ”©ν•΄μ„œ λ©”μ„œλ“œ λ©”λͺ¨λ¦¬ μ˜μ—­μ— μ μž¬ν•  λ•Œ ν΄λž˜μŠ€λ³„λ‘œ 관리 λœλ‹΅λ‹ˆλ‹€. λ•Œλ¬Έμ— 클래슀의 λ‘œλ”©μ΄ λλ‚˜λŠ” μ¦‰μ‹œ λ°”λ‘œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹΅λ‹ˆλ‹€!

 

 

       πŸ‘‰ 정적(Class)멀버 생성


Static ν‚€μ›Œλ“œλ₯Ό 톡해 μƒμ„±λœ 정적 멀버듀은 Heap μ˜μ—­μ΄ μ•„λ‹Œ Static μ˜μ—­μ— 할당이 λ˜λŠ” κ²ƒμ΄μ—μš”. Static μ˜μ—­μ— ν• λ‹Ήλœ MemoryλŠ” λͺ¨λ“  객체가 κ³΅μœ ν•˜μ—¬ ν•˜λ‚˜μ˜ 멀버λ₯Ό μ–΄λ””μ„œλ“ μ§€ μ°Έμ‘°ν•  수 μžˆλŠ” μž₯점을 κ°–μ§€λ§Œ, Garbage Collector의 관리 μ˜μ—­ 밖에 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— Static μ˜μ—­μ— μžˆλŠ” 멀버듀은 ν”„λ‘œκ·Έλž¨μ˜ μ’…λ£Œμ‹œκΉŒμ§€ Memoryλ₯Ό ν• λ‹Ήν•œ μ±„λ‘œ μ‘΄μž¬ν•˜κ²Œ λœλ‹΅λ‹ˆλ‹€. λ•Œλ¬Έμ— Static을 λ„ˆλ¬΄ λ‚¨λ°œν•˜κ²Œ 되면 λ§Œλ“€κ³ μž ν•˜λŠ” System μ„±λŠ₯에 μ•…μ˜ν–₯을 쀄 수 μžˆλ‹€λŠ” 점! 잊으면 μ•ˆ λ˜λŠ” κ²ƒμ΄μ—μš”.

λ˜ν•œ, μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” λŒ€λΆ€λΆ„ private둜 μ§€μ •ν•˜κ³ , getter와 setterλ₯Ό μ‚¬μš©ν•΄μ„œ μ°Έμ‘°λ₯Ό ν•˜κ²Œ λ©λ‹ˆλ‹€. κ·Έ μ΄μœ λŠ” [Java] μžλ°”μ˜ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming) 이 κ³³μ—μ„œ ν™•μΈν•˜μ‹€ 수 μžˆλŠ” κ²ƒμ΄μ—μš”! 

 

[Java] μžλ°”μ˜ 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming)

μ•ˆλ…•ν•˜μ„Έμš”? μ£Όλ‹ˆν•˜λž‘ μž…λ‹ˆλ‹€. ν˜„μž¬ μ£Όλ‹ˆν•˜λž‘μ€ κ΅­λΉ„μ§€μ›μœΌλ‘œ μžλ°”λ₯Ό 배우고 있고, κ·Έ 곡뢀 λ‚΄μš©μ„ λ‹€μ‹œ λ³΅μŠ΅ν• κ²Έ λ˜ν•œ, μžλ°” 곡뢀λ₯Ό ν•˜μ‹œλŠ” λΆ„λ“€κ»˜ 보닀 μ‰½κ²Œ 이해할 수 μžˆλŠ” 자료λ₯Ό λ§Œλ“€κ³  μ‹Ά

junyharang.tistory.com

 

   πŸ“ μƒμ„±μžλž€?


ν•„λ“œλŠ” 무쑰건 μ„ μ–Έλ§Œ ν•΄μ•Ό ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ metaλΌλŠ” ν•„λ“œμ— 10을 λ„£κ³  μ‹Άλ‹€λ©΄ μ•„λž˜μ™€ 같이 μΆ”κ°€ν•˜λ©΄ μ•ˆλ©λ‹ˆλ‹€.

public class test() { 
	private int meta = 10; // μ΄λ ‡κ²Œ ν•„λ“œμ—μ„œ μ΄ˆκΈ°ν™”κΉŒμ§€ ν•˜λ©΄ μ•ˆλ¨. 
}

μ΄ˆκΈ°ν™”λŠ” Methodλ‚˜, μƒμ„±μžμ—μ„œλ§Œ ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€. 즉, λ‚΄κ°€ μ–΄λ–€ ν•„λ“œμ— 값을 μ΄ˆκΈ°ν™” ν•˜κ³  싢을 λ•Œ, μƒμ„±μžλ₯Ό μ“΄λ‹€κ³  이해 ν•˜λ©΄ μ’‹μŠ΅λ‹ˆλ‹€. μƒμ„±μžλŠ” λ°˜λ“œμ‹œ ν•„μš”ν•œ 것은 μ•„λ‹ˆκ³ , ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•  ν•„μš”κ°€ μžˆμ„ λ•Œ μ‚¬μš©ν•˜λ©΄ λ˜λŠ” 것 μž…λ‹ˆλ‹€.

κ²°κ΅­ μƒμ„±μžλŠ” μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ”œ λ•Œ ν˜ΈμΆœλ˜λŠ” 'μΈμŠ€ν„΄μŠ€ μ΄ˆκΈ°ν™” λ©”μ„œλ“œ'라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μƒμ„±μžλŠ” μ˜€λ²„λ‘œλ”©(같은 이름을 가진 μ—¬λŸ¬ λ©”μ†Œλ“œ μ‚¬μš©)이 κ°€λŠ₯ ν•©λ‹ˆλ‹€.

참고둜 객체λ₯Ό 생성할 λ•Œ new 뒀에 μ˜€λŠ” 것이 μƒμ„±μž 호좜 μž…λ‹ˆλ‹€!

Test test new Test();

// Test();λŠ” test 객체의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λŠ” 것

 

 

 

 

   πŸ“ μ ‘κ·Ό μ§€μ •μž(μ œμ–΄μž)


μ˜μ–΄λ‘œ 치면 ν˜•μš©μ‚¬(λͺ…사λ₯Ό 꾸며쀌)κ³Ό 같은 κ²ƒμ΄μ—μš”. ν΄λž˜μŠ€μ™€ 클래슀 Memberμ—κ²Œ 뢀가적인 의미λ₯Ό λΆ€μ—¬ν•˜μ£ !

μ ‘κ·Ό μ œμ–΄μž: public, protected, defulat, private ( 4개 쀑 ν•˜λ‚˜λ§Œ μ‚¬μš© κ°€λŠ₯)

κ·Έ μ™Έ: static, final, abstract, native, transient, synchronized, volatile, strictfp

μ œμ–΄μžλŠ” ν΄λž˜μŠ€λ‚˜ λ©€λ²„λ³€μˆ˜μ™€ λ©”μ„œλ“œμ— 주둜 μ‚¬μš©λ˜λ©°, ν•˜λ‚˜μ˜ λŒ€μƒμ— μ—¬λŸ¬ μ œμ–΄μžλ₯Ό μ‘°ν•©ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” κ²ƒμ΄μ—μš”.

μ ‘κ·Ό μ œμ–΄μžλŠ” ν•œ λ²ˆμ— 넀가지 쀑 ν•˜λ‚˜λ§Œ μ‚¬μš© κ°€λŠ₯ ν•˜λ‹΅λ‹ˆλ‹€!

ν•„λ“œ(Class λ³€μˆ˜) μž…μž₯μ—μ„œ 봀을 λ•Œ, μš”μ²­ν•˜λŠ” μͺ½μ—μ„œ λ‚˜μ—κ²Œ ν•¨λΆ€λ‘œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 κΆŒν•œμ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λŠ” 이유λ₯Ό λΉ„μœ λ‘œ λ“€μžλ©΄ ν•„λ“œ μž…μž₯μ—μ„œ λ‚΄κ°€ 가지고 μžˆλŠ” 물건을 μ•„λ¬΄λ‚˜ μ™€μ„œ κ°€μ Έκ°€κ³ , λ°”κΎΈκ³  ν•˜λ©΄ 기뢄이 λ‚˜μ˜κ² μ§€μš”? κ·Έλž˜μ„œ 이것을 λͺ»ν•˜λ„둝 λ‚΄ 물건을 숨기기 μœ„ν•΄ Class(객체)μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜(ν•„λ“œ)λ₯Ό 은닉화λ₯Ό ν•˜μ—¬ λ³€μˆ˜ μžλ£Œν˜• μ•žμ— Privateλ₯Ό μž‘μ„±ν•˜κ²Œ λ©λ‹ˆλ‹€. 단, λͺ¨λ“  MethodλŠ” public으둜 μ„ μ–Έν•˜λŠ”κ²Œ μ’‹λ‹΅λ‹ˆλ‹€.

μ ‘κ·Ό μ œμ–΄μžλŠ” publicκ³Ό private외에도 두가지가 더 μžˆμŠ΅λ‹ˆλ‹€. protected와 defaultκ°€ κ·Έκ²ƒμž…λ‹ˆλ‹€. protectedλŠ” 상속 관계에 μžˆλ‹€λ©΄ μ„œλ‘œ λ‹€λ₯Έ νŒ¨ν‚€μ§€μ— μžˆλŠ” 클래슀의 접근도 ν—ˆμš©ν•©λ‹ˆλ‹€. defaultλŠ” μ ‘κ·Ό μ œμ–΄ μ§€μ‹œμžκ°€ μ—†λŠ” 경우λ₯Ό μ˜λ―Έν•˜λŠ”λ°, μ ‘κ·Ό μ œμ–΄μžκ°€ μ—†λŠ” λ©”μ†Œλ“œλŠ” 같은 νŒ¨ν‚€μ§€μ— 있고, 상속 관계에 μžˆλŠ” λ©”μ„œλ“œμ— λŒ€ν•΄μ„œλ§Œ 접근을 ν—ˆμš© ν•©λ‹ˆλ‹€. μ•„λž˜ 그림은 μ ‘κ·Ό μ œμ–΄μž λ³„λ‘œ μ ‘κ·Ό ν—ˆμš© λ²”μœ„λ₯Ό 그림으둜 λ‚˜νƒ€λ‚Έ κ²ƒμ΄μ—μš”. μ•ˆμͺ½μ— μžˆμ„μˆ˜λ‘ μ ‘κ·Ό ν†΅μ œκ°€ μ‚Όμ—„ν•˜κ³ , 밖에 μžˆμ„μˆ˜λ‘ 접근이 μžμœ λ‘­μŠ΅λ‹ˆλ‹€.

μ ‘κ·Ό μ œμ–΄μžλŠ” Member λ˜λŠ” Class에 μ‚¬μš© λœλ‹΅λ‹ˆλ‹€!

μ ‘κ·Ό μ œμ–΄μžκ°€ μ‚¬μš©λ  수 μžˆλŠ” κ³³ - Class, Member λ³€μˆ˜, Method, μƒμ„±μž
  - private : 같은 클래슀 λ‚΄ μ ‘κ·Ό κ°€λŠ₯
  - defulat : 같은 νŒ¨ν‚€μ§€ λ‚΄λ§Œ μ ‘κ·Ό κ°€λŠ₯
  - protected : 같은 νŒ¨ν‚€μ§€ 내와 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ μžμ† Classμ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯
  - public : μ–΄λ–€ κ³³μ—μ„œλ“  μ ‘κ·Ό κ°€λŠ₯ 

좜처: μƒν™œμ½”λ”©

 

public > protected > (default) > private

 

 

 

 

   πŸ“ μ˜€λ²„λ‘œλ”©(Overloading)

         πŸ‘‰ Method Signature(λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜)


λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ˜ 핡심은 λ°”λ‘œ λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜(Method Signature)에 μžˆλ‹΅λ‹ˆλ‹€!

λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜λž€? λ©”μ„œλ“œμ˜ 선언뢀에 λͺ…μ‹œλ˜λŠ” λ§€κ°œλ³€μˆ˜μ˜ 리슀트λ₯Ό κ°€λ¦¬ν‚¨λ‹΅λ‹ˆλ‹€!

λ§Œμ•½ 두 λ©”μ„œλ“œκ°€ λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ™€ νƒ€μž…, κ·Έ μˆœμ„œκΉŒμ§€ λͺ¨λ‘ κ°™λ‹€λ©΄, 이 두 λ©”μ„œλ“œμ˜ μ‹œκ·Έλ‹ˆμ²˜λŠ” κ°™λ‹€κ³  ν•  수 μžˆλ‹΅λ‹ˆλ‹€!

 

 

         πŸ‘‰ Method Overloading


λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©(overloading)μ΄λž€? 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μ€‘λ³΅ν•˜μ—¬ μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹΅λ‹ˆλ‹€!

μžλ°”μ—μ„œλŠ” μ›λž˜ ν•œ 클래슀 내에 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό λ‘˜ 이상 κ°€μ§ˆ 수 μ—†λŠ” κ²ƒμ΄μ—μš”.

ν•˜μ§€λ§Œ, λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜λ‚˜ νƒ€μž…μ„ λ‹€λ₯΄κ²Œ ν•œλ‹€λ©΄? ν•˜λ‚˜μ˜ μ΄λ¦„μœΌλ‘œ λ©”μ„œλ“œλ₯Ό μž‘μ„±ν•  수 μžˆλŠ” κ²ƒμ΄μ—μš”.

즉, λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ€ μ„œλ‘œ λ‹€λ₯Έ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°–λŠ” μ—¬λŸ¬ λ©”μ„œλ“œλ₯Ό 같은 μ΄λ¦„μœΌλ‘œ μ •μ˜ν•˜λŠ” 것이라고 ν•  수 μžˆλ‹΅λ‹ˆλ‹€!

 

μ΄λŸ¬ν•œ λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ„ μ‚¬μš©ν•¨μœΌλ‘œμ¨, λ©”μ„œλ“œμ— μ‚¬μš©λ˜λŠ” 이름을 μ ˆμ•½ν•  수 μžˆλŠ” κ²ƒμ΄μ—μš”.

λ˜ν•œ, λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ 전달해야 ν•  λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ΄λ‚˜, κ°œμˆ˜μ— λŒ€ν•΄ 크게 μ‹ κ²½ 쓰지 μ•Šκ³ , 호좜 ν•  수 μžˆλ‹΅λ‹ˆλ‹€!

λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ€ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ νŠΉμ§• 쀑 ν•˜λ‚˜μΈ λ‹€ν˜•ν˜•(Polymorphism)을 κ΅¬ν˜„ν•˜λŠ” 방법 쀑 ν•˜λ‚˜λžλ‹ˆλ‹€.

 

λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ˜ λŒ€ν‘œμ  μ˜ˆλ‘œλŠ” println()을 λ“€ 수 μžˆλŠ” κ²ƒμ΄μ—μš”.

println()은 μ „λ‹¬λ°›λŠ” λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…μ— 따라 λ‹€μŒκ³Ό 같이 λ‹€μ–‘ν•œ μ›ν˜• μ€‘μ—μ„œ μ μ ˆν•œ μ›ν˜•μ„ ν˜ΈμΆœν•˜κ²Œ λœλ‹΅λ‹ˆλ‹€!

println()

println(boolean x)

println(char x)

println(char[] x)

println(double x)

println(float x)

println(int x)

println(long x)

println(Object x)

println(String x)

 

 

         πŸ‘‰ Method Overloading 쑰건


μžλ°”μ—μ„œ λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ΄ μ„±λ¦½λ˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒκ³Ό 같은 쑰건을 λ§Œμ‘±ν•΄μ•Ό ν•˜λŠ” κ²ƒμ΄μ—μš”.

첫째! λ©”μ„œλ“œμ˜ 이름이 κ°™μ•„μ•Ό ν•©λ‹ˆλ‹€.

λ‘˜μ§Έ! λ©”μ„œλ“œμ˜ μ‹œκ·Έλ‹ˆμ²˜ 즉, λ§€κ°œλ³€μˆ˜μ˜ 개수 λ˜λŠ” νƒ€μž…μ΄ 달라야 ν•©λ‹ˆλ‹€.

 

λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ€ λ°˜ν™˜ νƒ€μž…κ³ΌλŠ” 관계가 μ—†λ‹€λŠ” 점 잊으면 μ•ˆ λ˜λŠ” κ²ƒμ΄μ—μš”. λ§Œμ•½ λ©”μ„œλ“œμ˜ μ‹œκ·Έλ‹ˆμ²˜λŠ” 같은데 λ°˜ν™˜ νƒ€μž…λ§Œμ΄ λ‹€λ₯Έ κ²½μš°μ—λŠ” μ˜€λ²„λ‘œλ”©μ΄ μ„±λ¦½λ˜μ§€ μ•ŠλŠ” λ‹΅λ‹ˆλ‹€!

 

         πŸ‘‰ Method Overloading 예제


μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” μ‚¬μš©μžκ°€ μ˜€λ²„λ‘œλ”©λœ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄, μ „λ‹¬λœ λ§€κ°œλ³€μˆ˜μ˜ κ°œμˆ˜μ™€ νƒ€μž…κ³Ό 같은 μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°€μ§€λŠ” λ©”μ„œλ“œλ₯Ό μ°Ύμ•„ ν˜ΈμΆœν•œλ‹΅λ‹ˆλ‹€.

λ‹€μŒμ€ ν•¨μˆ˜μ˜ μ˜€λ²„λ‘œλ”©μ„ μ΄μš©ν•˜μ—¬ μ •μ˜ν•œ display() λ©”μ„œλ“œμ˜ μ›ν˜• 예제 μž…λ‹ˆλ‹€.

public void display (int num1)				// 전달받은 num1을 κ·ΈλŒ€λ‘œ 좜λ ₯
public void display (int num1, int num2)	// 전달받은 두 μ •μˆ˜μ˜ 곱을 좜λ ₯
public void display (int num1, double num2)	// 전달 받은 μ •μˆ˜μ™€ μ‹€μˆ˜μ˜ 합을 좜λ ₯

 

이제 μ‚¬μš©μžκ°€ display() λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄, μ»΄νŒŒμΌλŸ¬λŠ” μžλ™μœΌλ‘œ 같은 μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°€μ§€λŠ” λ©”μ„œλ“œλ₯Ό μ°Ύμ•„ ν˜ΈμΆœν•œλ‹΅λ‹ˆλ‹€!

display(10);		// 1번 display() 호좜 => 10
display(10, 20);	// 2번 display() 호좜 => 10 * 20 = 200
display(10, 3.14);	// 3번 display() 호좜 => 10 + 3.14 = 13.14
display(10, 'a');	// 2번과 3번 λͺ¨λ‘ 호좜 κ°€λŠ₯!

λ¬Έμ œλŠ” 4번과 같이 첫번째 μΈμˆ˜λ‘œλŠ” μ •μˆ˜λ₯Ό, λ‘λ²ˆμ§Έ μΈμˆ˜λ‘œλŠ” μ‹€μˆ˜λ₯Ό μ „λ‹¬λ°›λŠ” ν˜ΈμΆœμž…λ‹ˆλ‹€.

μžλ°”μ—μ„œ charν˜• λ°μ΄ν„°λŠ” intν˜• 뿐만 μ•„λ‹ˆλΌ doubleν˜•μœΌλ‘œλ„ νƒ€μž…μ΄ λ³€ν™˜λ  수 있기 λ•Œλ¬ΈμΈ κ²ƒμ΄μ—μš”.

 

λ”°λΌμ„œ 이와 같은 ν˜ΈμΆœμ€ μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ μ–΄λŠ μ‹œκ·Έλ‹ˆμ²˜μ˜ display()λ₯Ό ν˜ΈμΆœν•΄μ•Ό 할지 뢈λͺ…ν™•ν•΄ μ§€λŠ” κ²ƒμ΄μ—μš”.

μžλ°”μ—μ„œλŠ” μ˜€λ²„λ‘œλ”©ν•œ λ©”μ„œλ“œμ˜ μ΄λŸ¬ν•œ λͺ¨ν˜Έν•œ ν˜ΈμΆœμ„ ν—ˆμš©ν•˜μ§€ μ•ŠμœΌλ©°, μœ„μ™€ 같은 경우 더 μž‘μ€ ν‘œν˜„ λ²”μœ„λ₯Ό κ°€μ§€λŠ” intν˜•μœΌλ‘œ μžλ™ ν˜•λ³€ν™˜μ„ ν•˜κ²Œ λœλ‹΅λ‹ˆλ‹€.

 

λ‹€μŒ μ˜ˆμ œλŠ” μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ display()λ₯Ό λ‹€μ–‘ν•œ μ‹œκ·Έλ‹ˆμ²˜λ‘œ μ˜€λ²„λ‘œλ”©ν•˜λŠ” 예제 인 κ²ƒμ΄μ—μš”.

public class Test {
	
    static void display(int num1) {
    	System.out.println(num1);
    }
    
    static void display(int num1, int num2) {
    	System.out.println(num1 * num2);
    }
    
    static void display(int num1, double num2) {
    	System.out.println(num1 + num2);
    }
    
 } // Class 끝
    
/* ########################################################### */

public class Method01 {
	public Static void main(String[] args) {
    	Test myfunc = new Test();
        
        myfunc.display(10);
        myfunc.dispaly(10,20);
        myfunc.display(10, 3.14);
        myfunc.display(10, 'a');
    } // Main 끝
 } // Class 끝
 
 
 /* #######################μ‹€ ν–‰  κ²° κ³Ό########################## */
 
 10
 200
 13.14
 970		// a의 ASCII Code 값이 97μ΄λ―€λ‘œ, 97 * 10이 연산됨
 
 
 

μœ„μ˜ 예제처럼 λ©”μ„œλ“œμ˜ μ˜€λ²„λ‘œλ”©μ€ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…λΏ μ•„λ‹ˆλΌ, λ§€κ°œλ³€μˆ˜μ˜ 개수λ₯Ό 달리해도 μž‘μ„±ν•  수 μžˆλ‹΅λ‹ˆλ‹€!

 

 

 

 

 

πŸ“Œ Class μˆ™μ œ 02

   πŸ“ μƒμ†μ΄λž€?


Main Methodμ—μ„œ μƒˆλ‘œμš΄ Classλ₯Ό 생성할 λ•Œ μžλ£Œν˜• νƒ€μž…λͺ…을 λ‹€λ₯΄κ²Œ ν•˜κ³ , Class λ³€μˆ˜λͺ…을 λ™μΌν•˜κ²Œ ν•˜μ—¬ μƒμ„±ν•˜κ²Œ 되면 Classλͺ…을 μ •μ˜ν•˜λŠ” λΆ€λΆ„μ—μ„œ extendκ°€ λ‚˜μ˜€λŠ”λ°, 이걸 '상속 λ°›λŠ”λ‹€'라고 ν•©λ‹ˆλ‹€.

λΆ€λͺ¨ 객체와 μžμ‹ κ°μ²΄λŠ” μ—„μ—°νžˆ λ‹€λ₯Έ μ½”λ“œμž…λ‹ˆλ‹€. λ‹€λ₯Έ Methodμ—μ„œ μžμ‹ 객체λ₯Ό ν˜ΈμΆœν•  λ•ŒλŠ” λ°”λ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜μ§€λ§Œ, λΆ€λͺ¨ 객체λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ Superλ₯Ό κ±°μ³μ„œ κ°€μ•Ό ν•©λ‹ˆλ‹€.

λΆ€λͺ¨ ν•„λ“œκ°€ Private이면 μžμ‹ λ§Œ 접근이 κ°€λŠ₯ν•˜λ‹€λŠ” 의미이기 λ•Œλ¬Έμ— μžμ‹λ„ μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€. λΆ€λͺ¨ ν•„λ“œκ°€ Protected이면 μ œν•œμ  접근이 κ°€λŠ₯ν•˜λ‹€λŠ” 의미인데, μžμ‹ κ°μ²΄λŠ” 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 상속은 κ²°κ΅­ μ–΄λ–€ Class 객체λ₯Ό μƒμ„±ν•˜κ³ ,  κΈ°λŠ₯을 λ„£μ–΄ μ“°λ‹€κ°€ μΆ”κ°€μ μœΌλ‘œ κΈ°λŠ₯을 더 λ„£κ³  싢을 λ•Œ, μžμ‹ Class 객체λ₯Ό μƒμ„±ν•΄μ„œ μ‚¬μš©ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

λΆ€λͺ¨λŠ” ν•˜λ‚˜λ°–μ— κ°€μ§ˆ 수 μ—†κΈ° λ•Œλ¬Έμ— ν•œ λΆ€λͺ¨μ—κ²Œλ§Œ 상속 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

κ²°κ΅­ κΈ°μ‘΄ Classλ₯Ό ν™•μž₯ν•΄μ„œ μƒˆλ‘œμš΄ Classλ₯Ό λ§Œλ“œλŠ” κ²ƒμž…λ‹ˆλ‹€. κΈ°μ‘΄ Classλ₯Ό Base λ˜λŠ” parent(λΆ€λͺ¨), μƒμœ„ 클래슀(Super Class)라 ν•˜κ³ , μƒˆλ‘œ λ§Œλ“  Classλ₯Ό νŒŒμƒ(Derived Class) λ˜λŠ” Child Class라고 ν•©λ‹ˆλ‹€.

public class AdvanceWhell extends Wheel { 
	public void back() { 
    	System.out.println("λ’€λ‘œ κ΅΄λŸ¬κ°„λ‹€."); 
    } // back End 
} // Class End

μœ„μ˜ μ½”λ“œμ—μ„œ Classλͺ… μ λŠ” 곳에 extends μ™Όμͺ½μ€ μžμ‹ Classλͺ…이 였고, 였λ₯Έμͺ½μ€ λΆ€λͺ¨ Classλͺ…이 μ˜΅λ‹ˆλ‹€. λΆ€λͺ¨ ClassλŠ” ν•˜λ‚˜λ§Œ μ‚¬μš©ν•  수 있고, 상속을 μ‚¬μš©ν•˜λ©΄ μ½”λ“œλŸ‰μ„ 많이 쀄일 수 있게 λ©λ‹ˆλ‹€.

 

κ²°κ΅­ μƒμ†μ΄λž€ 기쑴의 ν΄λž˜μŠ€μ— κΈ°λŠ₯을 μΆ”κ°€ν•˜κ±°λ‚˜, μž¬μ •μ˜ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 상속은 μΊ‘μŠν™”, 좔상화와 λ”λΆˆμ–΄ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ κ΅¬μ„±ν•˜λŠ” μ€‘μš”ν•œ νŠΉμ§• 쀑 ν•˜λ‚˜μΈ κ²ƒμ΄μ—μš”.

 

상속을 μ΄μš©ν•˜λ©΄ 기쑴에 μ •μ˜λ˜μ–΄ μžˆλŠ” 클래슀의 λͺ¨λ“  ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό λ¬Όλ €λ°›μ•„, μƒˆλ‘œμš΄ 클래슀λ₯Ό 생성할 수 μžˆλ‹΅λ‹ˆλ‹€!

 

         πŸ‘‰ μƒμ†μ˜ μž₯점


μžλ°”μ—μ„œ 클래슀의 상속은 λ‹€μŒκ³Ό 같은 μž₯점을 κ°–λŠ” κ²ƒμ΄μ—μš”.

첫째! 기쑴에 μž‘μ„±λœ 클래슀λ₯Ό μž¬ν™œμš©ν•  수 μžˆλ‹€!

λ‘˜μ§Έ! μžμ‹ 클래슀 섀계 μ‹œ μ€‘λ³΅λ˜λŠ” 멀버λ₯Ό 미리 λΆ€λͺ¨ ν΄λž˜μŠ€μ— μž‘μ„±ν•΄ 두면 μžμ‹ ν΄λž˜μŠ€μ—μ„œλŠ” ν•΄λ‹Ή 멀버λ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€!

μ…‹μ§Έ! 클래슀 κ°„μ˜ 계측적 관계λ₯Ό κ΅¬μ„±ν•¨μœΌλ‘œ λ‹€ν˜•μ„±μ˜ 문법적 ν† λŒ€λ₯Ό λ§ˆλ ¨ν•œλ‹€!

 

 

         πŸ‘‰ μžμ‹ 클래슀(Child Class)


μžμ‹ 클래슀(Child Class)λž€ λΆ€λͺ¨ 클래슀의 λͺ¨λ“  νŠΉμ„±μ„ λ¬Όλ € λ°›μ•„ μƒˆλ‘­κ²Œ μž‘μ„±λœ 클래슀인 κ²ƒμ΄μ—μš”.

λ‹€μŒμ€ λΆ€λͺ¨ ν΄λž˜μŠ€μ™€ μžμ‹ 클래슀 κ°„μ˜ 포함도 μž…λ‹ˆλ‹€.

이처럼 λΆ€λͺ¨ ν΄λž˜μŠ€λŠ” μžμ‹ ν΄λž˜μŠ€μ— ν¬ν•¨λœ κ²ƒμœΌλ‘œ λ³Ό 수 μžˆλŠ” κ²ƒμ΄μ—μš”. λ”°λΌμ„œ λΆ€λͺ¨ ν΄λž˜μŠ€μ— μƒˆλ‘œμš΄ ν•„λ“œλ₯Ό ν•˜λ‚˜ μΆ”κ°€ν•˜λ©΄, μžμ‹ ν΄λž˜μŠ€μ—λ„ μžλ™μœΌλ‘œ ν•΄λ‹Ή ν•„λ“œκ°€ μΆ”κ°€λœ κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹΅λ‹ˆλ‹€!

 

μžμ‹ ν΄λž˜μŠ€μ—λŠ” λΆ€λͺ¨ 클래슀의 ν•„λ“œμ™€ λ©”μ„œλ“œλ§Œ μƒμ†λ˜λ©°, μƒμ„±μžμ™€ μ΄ˆκΈ°ν™” ν΄λŸ­μ€ μƒμ†λ˜μ§€ μ•ŠλŠ”μ  μ°Έκ³ ν•˜μ‹œκΈΈ λ°”λΌλŠ” κ²ƒμ΄μ—μš”! λ˜ν•œ, λΆ€λͺ¨ 클래슀의 μ ‘κ·Ό μ œμ–΄κ°€ Privateμ΄λ‚˜, Default둜 μ„€μ •λœ λ©€λ²„λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ μƒμ†λ°›μ§€λ§Œ, 접근은 ν•  수 μ—†λ‹΅λ‹ˆλ‹€!

 

public class Parent {
	private int a = 10;
    public int b = 20;
} // class 끝

/* ####################################### */

public Child extends Parent {
	public int c = 30;
    
    pubilc void display() {
    	/* System.out.println(a); 상속받은 Private ν•„λ“œ μ°Έμ‘° */
        System.out.println(b);	// 상속받은 public ν•„λ“œ μ°Έμ‘°
        System.out.println(c);	// 자기 μžμ‹ μ΄ μ„ μ–Έν•œ public ν•„λ“œ μ°Έμ‘°
    } // display 끝
} // Class 끝

/* ####################################### */

public class inheritance01 {
	public static void main(Strint[] args) {
    	Child ch = new Child();
        ch.display();
    } // Main 끝
} // Class 끝


/* ############# μ‹€ ν–‰  κ²° κ³Ό ############### */

20
30

μœ„ 예제의 μžμ‹ 클래슀의 λ©”μ„œλ“œμ—μ„œ λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 상속받은 public ν•„λ“œλ₯Ό μ°Έμ‘°ν•˜λŠ” 것이 μžˆλŠ” κ²ƒμ΄μ—μš”.

이처럼 μžμ‹ ν΄λž˜μŠ€μ—μ„œ λ”°λ‘œ μ„ μ–Έν•˜μ§€ μ•Šμ€ ν•„λ“œλΌλ„ ν•΄λ‹Ή μ΄λ¦„μ˜ ν•„λ“œλ₯Ό λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 상속 λ°›μ•˜λ‹€λ©΄ λ¬Έμ œκ°€ μ—†λ‹΅λ‹ˆλ‹€!

ν•˜μ§€λ§Œ 주석 처리된 a 좜λ ₯ λ¬Έμž₯은 ν•΄λ‹Ή ν•„λ“œκ°€ λΆ€λͺ¨ 클래슀의 private ν•„λ“œλΌλ©΄ 아무리 μžμ‹μ΄λΌλ„ μ ‘κ·Όν•  수 μ—†μœΌλ―€λ‘œ 였λ₯˜κ°€ λ‚œλ‹΅λ‹ˆλ‹€!

λ˜ν•œ, μžμ‹ ν΄λž˜μŠ€μ—μ„œλŠ” 자기 μžμ‹ μ΄ μΆ”κ°€ μ„ μ–Έν•œ ν•„λ“œλ‚˜ λ©”μ„œλ“œλ₯Ό μ„ μ–Έν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹΅λ‹ˆλ‹€!

 

✏️ μžλ°”μ—μ„œ ν΄λž˜μŠ€λŠ” 단 ν•œ 개의 ν΄λž˜μŠ€λ§Œμ„ μƒμ†λ°›λŠ” 단일 μƒμ†λ§Œ κ°€λŠ₯ν•˜λ‹΅λ‹ˆλ‹€!

 

 

         πŸ‘‰ Object Class


μžλ°”μ—μ„œλŠ” Object ν΄λž˜μŠ€λŠ” λͺ¨λ“  클래슀의 λΆ€λͺ¨ 클래슀 즉, μ•„λ‹΄κ³Ό ν•˜μ™€ ν˜Ήμ€ 단ꡰ 할아버지가 λ˜λŠ” 클래슀 인 κ²ƒμ΄μ—μš”.

λ”°λΌμ„œ μžλ°”μ˜ λͺ¨λ“  ν΄λž˜μŠ€λŠ” μžλ™μœΌλ‘œ Object 클래슀의 λͺ¨λ“  ν•„λ“œμ™€ λ©”μ„œλ“œλ₯Ό μƒμ†λ°›κ²Œ λœλ‹΅λ‹ˆλ‹€.

 

즉, μžλ°”μ˜ λͺ¨λ“  ν΄λž˜μŠ€λŠ” λ³„λ„λ‘œ extends ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ Object 클래슀의 상속을 λͺ…μ‹œν•˜μ§€ μ•Šμ•„λ„ Object 클래슀의 λͺ¨λ“  멀버λ₯Ό 자유둭게 μ‚¬μš©ν•  수 μžˆλ‹΅λ‹ˆλ‹€.

 μžλ°”μ˜ λͺ¨λ“  κ°μ²΄μ—μ„œ toString()μ΄λ‚˜, clone()κ³Ό 같은 λ©”μ„œλ“œλ₯Ό λ°”λ‘œ μ‚¬μš©ν•  수 μžˆλŠ” μ΄μœ κ°€ ν•΄λ‹Ή λ©”μ„œλ“œλ“€μ΄ Object 클래슀의 λ©”μ„œλ“œμ΄κΈ° λ•Œλ¬Έμ΄λžλ‹ˆλ‹€.

 

 

   πŸ“ Super와 Super()

         πŸ‘‰ Super ν‚€μ›Œλ“œ


Super ν‚€μ›Œλ“œλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 ν•„λ“œλ‚˜ λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ°Έμ‘°ν•˜λŠ”λ° μ‚¬μš©ν•˜λŠ” μ°Έμ‘° λ³€μˆ˜μΈ κ²ƒμ΄μ—μš”.

μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ˜ 이름과 지역 λ³€μˆ˜μ˜ 이름이 같을 경우 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ•žμ— this ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ ꡬ뢄할 수 μžˆμ—ˆλ˜ κ±° κΈ°μ–΅ν•˜μ‹œλ‚˜μš”?

이와 λ§ˆμ°¬κ°€μ§€λ‘œ λΆ€λͺ¨ 클래슀의 멀버와 μžμ‹ 클래슀의 멀버 이름이 같을 경우 superλ₯Ό μ‚¬μš©ν•˜μ—¬ ꡬ별할 수 μžˆλ‹΅λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ μžλ°”μ—μ„œλŠ” super μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λͺ¨ 클래슀의 멀버에 μ ‘κ·Όν•  수 μžˆλ‹΅λ‹ˆλ‹€!

this와 λ§ˆμ°¬κ°€μ§€λ‘œ super μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” λŒ€μƒλ„ μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 뿐이며, 클래슀 λ©”μ„œλ“œμ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λŠ” 점 잊으면 μ•ˆλ˜λŠ” κ²ƒμ΄μ—μš”!

 

public class Parent {
	int a = 10;
} // Parent Class 끝

/* ############################################## */

public Child extends Parent {
	public void display() {
    	System.out.println(a);
        System.out.println(this.a);
        System.out.println(super.a);
    } // display 끝
} // Child Class 끝


/* ############################################## */

public class inheritance02 {
	public static void main(String[] args) {
    	Child ch = new Child();
        ch.display();
    } // Main 끝
} // inheritance02 Class 끝


/* ################# 좜 λ ₯  κ²° κ³Ό ################ */

10
10
10

μœ„μ˜ μ˜ˆμ œμ—μ„œ intν˜• λ³€μˆ˜ num은 λΆ€λͺ¨ 클래슀인 Parent ν΄λž˜μŠ€μ—μ„œλ§Œ μ„ μ–Έλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 지역 λ³€μˆ˜μ™€ this μ°Έμ‘° λ³€μˆ˜, super μ°Έμ‘° λ³€μˆ˜ λͺ¨λ‘ 같은 값을 좜λ ₯ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

class Parent {

    int a = 10;

} // Parent 끝

/* ######################################### */

 

class Child extends Parent {

    int a = 20;

 

    void display() {

        System.out.println(a);

        System.out.println(this.a);

        System.out.println(super.a);

    } // display 끝

} // Child 끝

/* ######################################### */

public class Inheritance03 {

    public static void main(String[] args) {

        Child ch = new Child();

        ch.display();

    } // main 끝

} // Inheritance03 끝

/* ################# 좜 λ ₯  κ²° κ³Ό ############### */

20
20
10

ν•˜μ§€λ§Œ μœ„μ˜ μ˜ˆμ œμ—μ„œ intν˜• λ³€μˆ˜ num은 μžμ‹ 클래슀인 Child ν΄λž˜μŠ€μ—μ„œλ„ μ„ μ–Έ λ˜μ–΄ μžˆλ‹΅λ‹ˆλ‹€.

λ”°λΌμ„œ 지역 λ³€μˆ˜μ™€ this μ°Έμ‘° λ³€μˆ˜λŠ” μžμ‹ ν΄λž˜μŠ€μ—μ„œ λŒ€μž…λœ 값을 좜λ ₯ν•˜κ³ , super μ°Έμ‘° λ³€μˆ˜λ§Œμ΄ λΆ€λͺ¨ ν΄λž˜μŠ€μ— λŒ€μž…λœ 값을 좜λ ₯ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

 

         πŸ‘‰ Super() λ©”μ„œλ“œ


this() λ©”μ„œλ“œκ°€ 같은 클래슀의 λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©λœλ‹€λ©΄, super() λ©”μ„œλ“œλŠ” λΆ€λͺ¨ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©λ˜λŠ” κ²ƒμ΄μ—μš”.

μžμ‹ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜λ©΄, ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€μ—λŠ” μžμ‹ 클래슀의 고유 λ©€λ²„λΏλ§Œ μ•„λ‹ˆλΌ λΆ€λͺ¨ 클래슀의 λͺ¨λ“  λ©€λ²„κΉŒμ§€λ„ ν¬ν•¨λ˜μ–΄ μžˆλ‹΅λ‹ˆλ‹€!

λ”°λΌμ„œ λΆ€λͺ¨ 클래슀의 멀버λ₯Ό μ΄ˆκΈ°ν™”ν•˜κΈ° μœ„ν•΄ μžμ‹ 클래슀의 μƒμ„±μžμ—μ„œ λΆ€λͺ¨ 클래슀의 μƒμ„±μžκΉŒμ§€ ν˜ΈμΆœν•΄μ•Όλ§Œ ν•œλ‹΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λΆ€λͺ¨ 클래슀의 μƒμ„±μž ν˜ΈμΆœμ€ λͺ¨λ“  클래슀의 λΆ€λͺ¨ 클래슀인 Object 클래슀의 μƒμ„±μžκΉŒμ§€ 계속 거슬러 μ˜¬λΌκ°€λ©° μˆ˜ν–‰λ˜λŠ” κ²ƒμ΄μ—μš”.

 

λ”°λΌμ„œ μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” λΆ€λͺ¨ 클래슀의 μƒμ„±μžλ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν˜ΈμΆœν•˜μ§€ μ•ŠλŠ” λͺ¨λ“  μžμ‹ 클래슀의 μƒμ„±μž 첫 쀄에 μžλ™μœΌλ‘œ λ‹€μŒκ³Ό 같은 λͺ…령문을 μΆ”κ°€ν•˜μ—¬, λΆ€λͺ¨ 클래슀의 멀버λ₯Ό μ΄ˆκΈ°ν™”ν•  수 μžˆλ„λ‘ ν•΄ μ€€λ‹΅λ‹ˆλ‹€.

super();

 

ν•˜μ§€λ§Œ μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” 컴파일 μ‹œ ν΄λž˜μŠ€μ— μƒμ„±μžκ°€ ν•˜λ‚˜λ„ μ •μ˜λ˜μ–΄ μžˆμ§€ μ•Šμ•„μ•Όλ§Œ, μžλ™μœΌλ‘œ κΈ°λ³Έ μƒμ„±μžλ₯Ό μΆ”κ°€ ν•΄ μ£ΌλŠ” κ²ƒμ΄μ—μš”.

λ§Œμ•½ λ‹€μŒ 예제처럼 λΆ€λͺ¨ ν΄λž˜μŠ€μ— λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§€λŠ” μƒμ„±μžλ₯Ό ν•˜λ‚˜λΌλ„ μ„ μ–Έν–ˆλ‹€λ©΄, λΆ€λͺ¨ ν΄λž˜μŠ€μ—λŠ” κΈ°λ³Έ μƒμ„±μžκ°€ μžλ™μœΌλ‘œ μΆ”κ°€λ˜μ§€ μ•Šμ„ κ²ƒμ΄μ—μš”.

 

Public class Parent {
	int a;
    
    parent (int n) {
    	a = n;
    } // Parent 끝
} // Class 끝

 

κ·Έλ ‡μ§€λ§Œ λ‹€μŒ 예제처럼 Parent 클래슀λ₯Ό 상속받은 μžμ‹ ν΄λž˜μŠ€μ—μ„œ super() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λΆ€λͺ¨ 클래슀의 κΈ°λ³Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κ²Œ λœλ‹€λ©΄ 였λ₯˜κ°€ λ°œμƒν•˜κ²Œ 될 κ²ƒμ΄μ—μš”.

public Parent {
	int a;
    
    public Parent(int n) {
    	a = n;
    } // Parent 끝
} // Class 끝


/* ########################################## */

class Child extends Parent {
	int b;
    
    public Child() {
    	super();
        b = 20;
    } Child 끝
} Class 끝

μ™œλƒν•˜λ©΄ λΆ€λͺ¨ 클래슀인 Parent ν΄λž˜μŠ€μ—λŠ” κΈ°λ³Έ μƒμ„±μžκ°€ μ—†κΈ° λ•Œλ¬ΈμΈ κ²ƒμ΄μ—μš”.

λ”°λΌμ„œ λ§€κ°œλ³€μˆ˜λ₯Ό κ°€μ§€λŠ” μƒμ„±μžλ₯Ό μ„ μ–Έν•΄μ•Ό ν•  경우 λ˜λ„λ‘ λ‹€μŒκ³Ό 같이 κΈ°λ³Έ μƒμ„±μžκΉŒμ§€ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•˜λŠ” 것이 μ’‹λ‹΅λ‹ˆλ‹€!

class Parent {

    int a;

    Parent() { a = 10; }

    Parent(int n) { a = n; }

}

 

class Child extends Parent {

    int b;

    Child() {

        super();

        b = 20;

    }

 

λ‹€μŒμ€ super() λ©”μ„œλ“œκ°€ μ–΄λ–»κ²Œ ν˜ΈμΆœλ˜λŠ”μ§€ λ³΄μ—¬μ£ΌλŠ” κ²ƒμ΄μ—μš”.

class Parent {

    int a;

    Parent() { 	/* κΈ°λ³Έ μƒμ„±μž μ„ μ–Έ */
    	a = 10; 
    }
    
    Parent(int n) { 
    	a = n; 
    }
}

 

class Child extends Parent {

    int b;
    Child() {
      //super(40);
        b = 20;

    }

    void display() {
        System.out.println(a);
        System.out.println(b);
    }
}



public class Inheritance04 {

    public static void main(String[] args) {

        Child ch = new Child();
        ch.display();
    }
}

/* ############## μ‹€ ν–‰  κ²° κ³Ό ################ */

10
20

μœ„μ˜ μ˜ˆμ œλŠ” κ·Έλƒ₯ μ‹€ν–‰ μ‹œ μžλ°” μ»΄νŒŒμΌλŸ¬λŠ” 주석 처리된 [//super(40)] 라인에 μžλ™μœΌλ‘œ super(); ꡬ문을 μΆ”κ°€ν•˜κ²Œ 될 κ²ƒμ΄μ—μš”.

λ”°λΌμ„œ λ³€μˆ˜ aλŠ” 10으둜 μ΄ˆκΈ°ν™” λœλ‹΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, [//super(40)]라인에 주석 처리λ₯Ό ν•΄μ œν•˜κ³  μ‹€ν–‰ μ‹œ λΆ€λͺ¨ 클래슀인 Parent ν΄λž˜μŠ€λŠ” λ‘λ²ˆμ§Έ μƒμ„±μžμ— μ˜ν•΄ μ΄ˆκΈ°ν™” 될 κ²ƒμž…λ‹ˆλ‹€. λ”°λΌμ„œ λ³€μˆ˜ aλŠ” 40으둜 μ΄ˆκΈ°ν™” 될 κ²ƒμ΄μ—μš”!

 

 

 

 

 

   πŸ“ μ˜€λ²„λΌμ΄λ”©(overriding)

         πŸ‘‰ λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© (Method Overriding)


μ•žμ„œ 배운 μ˜€λ²„λ‘œλ”©(overloading)μ΄λž€ μ„œλ‘œ λ‹€λ₯Έ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°–λŠ” μ—¬λŸ¬ λ©”μ†Œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ΄λ¦„μœΌλ‘œ μ •μ˜ν•˜λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

μ˜€λ²„λΌμ΄λ”©(overriding)μ΄λž€ 상속 관계에 μžˆλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 이미 μ •μ˜λœ λ©”μ†Œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ 같은 μ‹œκ·Έλ‹ˆμ³λ₯Ό κ°–λŠ” λ©”μ†Œλ“œλ‘œ λ‹€μ‹œ μ •μ˜ν•˜λŠ” 것이라고 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μžλ°”μ—μ„œ μžμ‹ ν΄λž˜μŠ€λŠ” λΆ€λͺ¨ 클래슀의 private 멀버λ₯Ό μ œμ™Έν•œ λͺ¨λ“  λ©”μ†Œλ“œλ₯Ό μƒμ†λ°›μŠ΅λ‹ˆλ‹€.

μ΄λ ‡κ²Œ 상속받은 λ©”μ†Œλ“œλŠ” κ·ΈλŒ€λ‘œ μ‚¬μš©ν•΄λ„ 되고, ν•„μš”ν•œ λ™μž‘μ„ μœ„ν•΄ μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

즉, λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©μ΄λž€ 상속받은 λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλ₯Ό μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

 

μžλ°”μ—μ„œλŠ” λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©μ„ 톡해 상속받은 λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ 직접 μž¬μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ μ˜ˆμ œλŠ” λΆ€λͺ¨ 클래슀인 Parent 클래슀의 display() λ©”μ†Œλ“œλ₯Ό μžμ‹ 클래슀인 Child ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

class Parent {

    void display() { 
    	System.out.println("λΆ€λͺ¨ 클래슀의 display() λ©”μ†Œλ“œμž…λ‹ˆλ‹€."); 
    }

}

class Child extends Parent {

    void display() { 
    	System.out.println("μžμ‹ 클래슀의 display() λ©”μ†Œλ“œμž…λ‹ˆλ‹€."); 
    }

}

 

public class Inheritance05 {

    public static void main(String[] args) {

        Parent pa = new Parent();

        pa.display();

        Child ch = new Child();

        ch.display();

        Parent pc = new Child();

        pc.display();

    }

}
μ‹€ν–‰ κ²°κ³Ό

λΆ€λͺ¨ 클래슀의 display() λ©”μ†Œλ“œμž…λ‹ˆλ‹€.
μžμ‹ 클래슀의 display() λ©”μ†Œλ“œμž…λ‹ˆλ‹€.
μžμ‹ 클래슀의 display() λ©”μ†Œλ“œμž…λ‹ˆλ‹€.

μœ„μ˜ μ˜ˆμ œμ—μ„œλŠ” μ„Έλ²ˆμ§Έμ™€ 같이 μΈμŠ€ν„΄μŠ€μ˜ μ°Έμ‘°κ°€ ν—ˆμš©λ˜λŠ” μ΄μœ λŠ” λ°”λ‘œ μžλ°”μ—μ„œμ˜ λ‹€ν˜•μ„± λ•Œλ¬ΈμΈ κ²ƒμ΄μ—μš”.

 

 

         πŸ‘‰ μ˜€λ²„λΌμ΄λ”© 쑰건


μžλ°”μ—μ„œ λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ”©ν•˜κΈ° μœ„ν•œ 쑰건은 λ‹€μŒκ³Ό 같은 κ²ƒμ΄μ—μš”.

 

1. μ˜€λ²„λΌμ΄λ”©μ΄λž€ λ©”μ†Œλ“œμ˜ λ™μž‘λ§Œμ„ μž¬μ •μ˜ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ, λ©”μ†Œλ“œμ˜ μ„ μ–ΈλΆ€λŠ” κΈ°μ‘΄ λ©”μ†Œλ“œμ™€ μ™„μ „νžˆ κ°™μ•„μ•Ό ν•©λ‹ˆλ‹€.

    ν•˜μ§€λ§Œ λ©”μ†Œλ“œμ˜ λ°˜ν™˜ νƒ€μž…μ€ λΆ€λͺ¨ 클래슀의 λ°˜ν™˜ νƒ€μž…μœΌλ‘œ νƒ€μž… λ³€ν™˜ν•  수 μžˆλŠ” νƒ€μž…μ΄λΌλ©΄ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2. λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλ³΄λ‹€ μ ‘κ·Ό μ œμ–΄μžλ₯Ό 더 쒁은 λ²”μœ„λ‘œ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€

3. λΆ€λͺ¨ 클래슀의 λ©”μ†Œλ“œλ³΄λ‹€ 더 큰 λ²”μœ„μ˜ μ˜ˆμ™Έλ₯Ό μ„ μ–Έν•  수 μ—†μŠ΅λ‹ˆλ‹€.

 

 

         πŸ‘‰ μ˜€λ²„λΌμ΄λ”©κ³Ό μ˜€λ²„λ‘œλ”©μ˜ 차이


μ˜€λ²„λ‘œλ”©(Overloding) 기쑴에 μ—†λŠ” μƒˆλ‘œμš΄ 이름이 같은 λ©”μ„œλ“œλ₯Ό μ •μ˜ (new) (상속과 무관)
μ˜€λ²„λΌμ΄λ”©(Overriding) 상속받은 λ©”μ„œλ“œμ˜ λ‚΄μš©μ„ λ³€κ²½ (Changer, modify)

 

μ˜€λ²„λ‘œλ”©κ³Ό μ˜€λ²„λΌμ΄λ”©μ€ κ·Έ λ‹¨μ–΄μ˜ μœ μ‚¬ν•¨μœΌλ‘œ ν˜Όλ™ν•˜κΈ° μ‰¬μš΄ κ²ƒμ΄μ—μš”. ν•˜μ§€λ§Œ, κ·Έ κ°œλ…μ€ ν™•μ‹€νžˆ λ‹€λ₯΄λ©°, κ·Έ 차이점을 μ•„λŠ” 것이 μ€‘μš”ν•˜λ‹΅λ‹ˆλ‹€!

class Parent {

    void display() { System.out.println("λΆ€λͺ¨ 클래슀의 display() λ©”μ†Œλ“œμž…λ‹ˆλ‹€."); }

}

class Child extends Parent {

    // μ˜€λ²„λΌμ΄λ”©λœ display() λ©”μ†Œλ“œ

    void display() { System.out.println("μžμ‹ 클래슀의 display() λ©”μ†Œλ“œμž…λ‹ˆλ‹€."); }

    void display(String str) { System.out.println(str); } // μ˜€λ²„λ‘œλ”©λœ display() λ©”μ†Œλ“œ

}

 

public class Inheritance06 {

    public static void main(String[] args) {

        Child ch = new Child();

        ch.display();

        ch.display("μ˜€λ²„λ‘œλ”©λœ display() λ©”μ†Œλ“œμž…λ‹ˆλ‹€.");

    }

}
μ‹€ν–‰ κ²°κ³Ό

μžμ‹ 클래슀의 display() λ©”μ†Œλ“œμž…λ‹ˆλ‹€.
μ˜€λ²„λ‘œλ”©λœ display() λ©”μ†Œλ“œμž…λ‹ˆλ‹€.

 

 

 

 

 

   πŸ“ 레퍼런슀 ν˜•λ³€ν™˜


μΈμŠ€ν„΄μŠ€ κ°„μ˜ ν˜•λ³€ν™˜μœΌλ‘œ μ—… μΊμŠ€νŒ…(Up Casting)κ³Ό λ‹€μš΄ μΊμŠ€νŒ…(Down Casting)이 μžˆλŠ” κ²ƒμ΄μ—μš”.

일반적으둜 레퍼런슀 ν˜•λ³€ν™˜μ€ μ—… μΊμŠ€νŒ…μ„ μ˜λ―Έν•œλ‹΅λ‹ˆλ‹€.

 

         πŸ‘‰ μ—… μΊμŠ€νŒ… (Up Casting)


μ„œλΈŒ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό 슈퍼클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜μ—¬, μŠˆνΌν΄λž˜μŠ€μ—μ„œ μ„œλΈŒ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” κ²ƒμ΄μ—μš”.

μžλ™ ν˜•λ³€ν™˜λ„ κ°€λŠ₯ν•˜λ©°, μ°Έμ‘° κ°€λŠ₯ν•œ μ˜μ—­μ΄ μΆ•μ†Œλ˜μ–΄ μ ‘κ·Όν•  수 μžˆλŠ” 멀버가 μ€„μ–΄λ“ λ‹΅λ‹ˆλ‹€! (상속받은 λ©€λ²„λ§Œ μ°Έκ³  κ°€λŠ₯.)

 

         πŸ‘‰ λ‹€μš΄ μΊμŠ€νŒ… (Down Casting)


슈퍼 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ„œλΈŒ 클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜μ—¬, μ„œλΈŒ ν΄λž˜μŠ€μ—μ„œ 슈퍼 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” κ²ƒμ΄μ—μš”.

μžλ™ ν˜•λ³€ν™˜μ€ λΆˆκ°€ν•˜λ©°, ν˜•λ³€ν™˜ μ—°μ‚°μžλ₯Ό 톡해 λͺ…μ‹œμ  ν˜•λ³€ν™˜μ„ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” κ²ƒμ΄μ—μš”. μ°Έμ‘° κ°€λŠ₯ μ˜μ—­μ΄ ν™•λŒ€(μ—… μΊμŠ€νŒ… μ„ ν–‰ ν•„μš”)λœλ‹΅λ‹ˆλ‹€!

단, μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μ˜μ—­μ— λŒ€ν•œ μ°Έμ‘° μœ„ν—˜μ„± λ•Œλ¬Έμ— 일반적으둜 λ‹€μš΄ μΊμŠ€νŒ…μ€ λΆˆκ°€ν•˜λ‹΅λ‹ˆλ‹€!

 

κ²°κ΅­ μ—… μΊμŠ€νŒ…μ„ ν•˜κ²Œ 되면 μ„œλΈŒ 클래슀 νƒ€μž…μ˜ 멀버λ₯Ό μ‚¬μš©ν•  수 μ—†κ²Œ 되며, λ‹€μš΄ μΊμŠ€νŒ…μœΌλ‘œ 이 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹΅λ‹ˆλ‹€. λ˜ν•œ, λ‹€μš΄ μΊμŠ€νŒ…μ΄ μ„±λ¦½ν•˜λ €λ©΄? μ—… μΊμŠ€νŒ…μ΄ λ¨Όμ € μ„ ν–‰ λ˜μ•Ό ν•œλ‹΅λ‹ˆλ‹€!

 

 

 

 

 

πŸ“Œ Class μˆ™μ œ 03

   πŸ“ 좔상 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 이유?


 

 

 

   πŸ“ 좔상 클래슀 λ§Œλ“œλŠ” 방법?


 

 

 

 

 

   πŸ“ μΈν„°νŽ˜μ΄μŠ€μ˜ μ‚¬μš©μ²˜?


 

728x90
λ°˜μ‘ν˜•