eajni IT μ΄ˆλ³΄μ‚¬μ „ πŸ’¦πŸ’¦

[JAVA] OOP

2022-11-16

객체

ν”„λ‘œκ·Έλž¨μ˜ λ™μž‘ 주체가 λ˜λŠ” μš”μ†Œ, λͺ¨λ“  κ°μ²΄λŠ” μƒνƒœμ™€ λ™μž‘μ„ 가짐

객체 μ§€ν–₯

객체λ₯Ό 톡해 μ½”λ“œλ₯Ό κ΅¬μ„±ν•˜λŠ” 방법둠, 객체의 μƒν˜Έμž‘μš©μ„ μ½”λ“œλ‘œ λ‚˜νƒ€λƒ„

클래슀 = ν•„λ“œ(field) + λ©”μ†Œλ“œ(method) 객체 섀계도 = 객체 속성(λ³€μˆ˜) + 객체 행동(λͺ…λ Ήλ¬Έ) (λͺ…λ Ήλ¬Έ)

  • μΈμŠ€ν„΄μŠ€ : ν•΄λ‹Ή 클래슀 νƒ€μž…μ˜ 객체 (μ—¬λŸ¬κ°œ 생성 κ°€λŠ₯)

ν•„λ“œ

클래슀 λ³€μˆ˜μ™€ μΈμŠ€ν„΄μŠ€ λ³€μˆ˜λŠ” λ³„λ„λ‘œ μ΄ˆκΈ°ν™”ν•˜μ§€ μ•ŠμœΌλ©΄ μžλ™ μ΄ˆκΈ°ν™”λ˜λ©°, μ§€μ—­λ³€μˆ˜λŠ” λ³„λ„λ‘œ μ΄ˆκΈ°ν™” ν•΄μ€˜μ•Ό 함

λ³€μˆ˜ μ €μž₯ λ©”λͺ¨λ¦¬ μ‚¬μš© 방법
클래슀 λ³€μˆ˜(static variable) λ©”μ†Œλ“œ μ˜μ—­ ν΄λž˜μŠ€μ΄λ¦„.λ³€μˆ˜μ΄λ¦„
μΈμŠ€ν„΄μŠ€ λ³€μˆ˜(instance variable) νž™ μ˜μ—­ μΈμŠ€ν„΄μŠ€μ΄λ¦„.λ³€μˆ˜μ΄λ¦„
μ§€μ—­λ³€μˆ˜(local variable) μŠ€νƒ μ˜μ—­ λ³€μˆ˜μ΄λ¦„

λ©”μ†Œλ“œ

μ€‘λ³΅λ˜λŠ” μ½”λ“œμ˜ 반볡적인 ν”„λ‘œκ·Έλž˜λ°μ„ ν”Όν•˜κΈ° μœ„ν•΄ μ‚¬μš© ν•˜λ‚˜μ˜ λ©”μ†Œλ“œκ°€ ν•˜λ‚˜μ˜ κΈ°λŠ₯λ§Œμ„ μˆ˜ν–‰ν•˜λ„λ‘ μž‘μ„±ν•˜λŠ” 것이 기본적

  • 클래슀 λ©”μ†Œλ“œ(static method)
  • μΈμŠ€ν„΄μŠ€ λ©”μ†Œλ“œ(instance method)
κ°μ²΄μ°Έμ‘°λ³€μˆ˜μ΄λ¦„.λ©”μ†Œλ“œμ΄λ¦„();                  
// λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” λ©”μ†Œλ“œμ˜ 호좜

κ°μ²΄μ°Έμ‘°λ³€μˆ˜μ΄λ¦„.λ©”μ†Œλ“œμ΄λ¦„(인수1, 인수2, ...); 
// λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” λ©”μ†Œλ“œμ˜ 호좜
  • λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©

μƒμ„±μž

μƒμ„±λœ 객체의 ν•„λ“œλ₯Ό μ΄ˆκΈ°ν™”ν•΄μ£ΌλŠ” λ©”μ†Œλ“œ

  • μƒμ„±μžλ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ•„λ„ μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ κΈ°λ³Έ μƒμ„±μžλ₯Ό μ œκ³΅ν•¨
  • μƒμ„±μžλŠ” λ°˜ν™˜κ°’μ΄ μ—†μ§€λ§Œ, λ°˜ν™˜ νƒ€μž…μ„ voidν˜•μœΌλ‘œ μ„ μ–Έν•˜μ§€ μ•ŠλŠ”λ‹€.
  • μƒμ„±μžλŠ” μ΄ˆκΈ°ν™”λ₯Ό μœ„ν•œ 데이터λ₯Ό 인수둜 전달받을 수 μžˆλ‹€.
  • 객체λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 방법이 μ—¬λŸ¬ 개 μ‘΄μž¬ν•  κ²½μš°μ—λŠ” ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ 개의 μƒμ„±μžλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. (즉, μƒμ„±μžλ„ ν•˜λ‚˜μ˜ λ©”μ†Œλ“œμ΄λ―€λ‘œ, λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”© κ°€λŠ₯)
class Car {
		//μƒμ„±μž μ„ μ–Έ
		Car(String modelName, int modelYear, String color, int maxSpeeds) {
			this.modelName = modelName;
			this.modelYear = modelYear;
			this.color = color;
			this.maxSpeed = maxSpeed;
			this.currentSpeed = 0;
		}
		

	Car() {
			this("μ†Œλ‚˜νƒ€", 2012, "검정색", 160); // λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•¨.
													//λ°˜λ“œμ‹œ ν•΄λ‹Ή μƒμ„±μžμ˜ 첫 μ€„μ—μ„œλ§Œ 호좜 κ°€λŠ₯
		}

	public String getModel() {
			return this.modelYear + "년식 " + this.modelName + " " + this.color;
	}
  • this μ°Έμ‘°λ³€μˆ˜ : μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜ 이름과 μΈμŠ€ν„΄μŠ€ λ³€μˆ˜μ˜ 이름이 같을 κ²½μš°μ—λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ μ•žμ— thisν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬ ꡬ뢄해야 함

  • this() λ©”μ†Œλ“œ : μƒμ„±μž λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©ν•  수 있으며, 같은 클래슀의 λ‹€λ₯Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•  λ•Œ μ‚¬μš©ν•¨

public class Method05 {

    public static void main(String[] args) {
			Car tcpCar = new Car();
			System.out.println(tcpCar.getModel())
			//2012년식 μ†Œλ‚˜νƒ€ 검정색

			Car myCar = new Car("μ•„λ°˜λ–Ό", 2016, "흰색", 200);
			System.out.println(myCar .getModel())	
			//2016년식 μ•„λ°˜λ–Ό 흰색
		}

}

객체 μ§€ν–₯의 μž₯점과 단점

πŸ‘ μ½”λ“œ μž¬μ‚¬μš©μ„± πŸ‘ κ°„νŽΈν•œ μœ μ§€λ³΄μˆ˜(μ—°κ΄€ 객체만 μˆ˜μ •) πŸ‘ 업무 λΆ„μž₯ 및 도식화가 μš©μ΄ν•΄ 큰 규λͺ¨ ν”„λ‘œκ·Έλž˜λ°μ— 유리 πŸ‘Ž 각 객체의 μ˜μ‘΄κ΄€κ³„ λ³΅μž‘λ„μ— μ˜ν•΄ 비ꡐ적 느린 속도 πŸ‘Ž 높은 섀계 μ—­λŸ‰ μš”κ΅¬

  • λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©κ³Ό μ˜€λ²„λΌμ΄λ”©

    λ©”μ†Œλ“œ μ˜€λ²„λ‘œλ”©μ€ μ„œλ‘œ λ‹€λ₯Έ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό κ°–λŠ” μ—¬λŸ¬ λ©”μ†Œλ“œλ₯Ό ν•˜λ‚˜μ˜ μ΄λ¦„μœΌλ‘œ μ •μ˜ν•˜λŠ” 것인 ν•œνŽΈ λ©”μ†Œλ“œ μ˜€λ²„λΌμ΄λ”©μ€ 상속 관계에 μžˆλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 이미 μ •μ˜λœ λ©”μ†Œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ 같은 μ‹œκ·Έλ‹ˆμ³λ₯Ό κ°–λŠ” λ©”μ†Œλ“œλ‘œ λ‹€μ‹œ μ •μ˜ν•˜λŠ” 것을 의미


객체 μ§€ν–₯ 섀계 원칙

Single Responsibility Principle

단일 μ±…μž„ 원칙

ν•˜λ‚˜μ˜ ν΄λž˜μŠ€λŠ” ν•˜λ‚˜μ˜ μ—­ν• λ§Œ ν•΄μ•Ό ν•œλ‹€.

Open - Close Principle

개방-폐쇄 원칙

ν™•μž₯ (상속)μ—λŠ” μ—΄λ €μžˆκ³ , μˆ˜μ •μ—λŠ” λ‹«ν˜€ μžˆμ–΄μ•Ό ν•œλ‹€.

Liskov Substitution Principle

λ¦¬μŠ€μ½”ν”„ μΉ˜ν™˜ 원칙

μžμ‹μ΄ λΆ€λͺ¨μ˜ μžλ¦¬μ— 항상 ꡐ체될 수 μžˆμ–΄μ•Ό ν•œλ‹€.

Interface Segregation Principle

μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙

κ°μ²΄λŠ” μžμ‹ μ΄ ν˜ΈμΆœν•˜μ§€ μ•ŠλŠ” λ©”μ†Œλ“œμ— μ˜μ‘΄ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

Dependency Inversion Property

μ˜μ‘΄μ„± μ—­μ „ 원칙

μƒμœ„ λͺ¨λ“ˆμ΄ ν•˜μœ„ λͺ¨λ“ˆμ— μ˜μ‘΄ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.


좔상화

객체의 곡톡적인 속성과 κΈ°λŠ₯을 μΆ”μΆœν•˜μ—¬ μ •μ˜ ν•˜λŠ”κ²ƒ β‡’ μ—­ν• κ³Ό κ΅¬ν˜„μ˜ 뢄리

Untitled


μΆ”μƒν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€μ˜ 차이

extends

  • 좔상 ν΄λž˜μŠ€λŠ” ν•˜λ‚˜ μ΄μƒμ˜ 좔상 λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•œ 클래슀λ₯Ό μ˜λ―Έν•˜λ©°, μƒμ„±μž 및 일반 λ©”μ„œλ“œλ„ 포함할 수 μžˆλ‹€.
  • 좔상 ν΄λž˜μŠ€λŠ” 단일 μƒμ†λ§Œ ν—ˆμš©λœλ‹€.

implements

  • μΈν„°νŽ˜μ΄μŠ€λŠ” 좔상 λ©”μ„œλ“œμ™€ μƒμˆ˜λ§Œμ„ ν¬ν•¨ν•œλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€λŠ” ν΄λž˜μŠ€μ— 닀쀑 κ΅¬ν˜„ 및 μΈν„°νŽ˜μ΄μŠ€ 끼리 닀쀑 상속이 κ°€λŠ₯ν•˜λ‹€.
  • 좔상 λ©”μ„œλ“œλŠ” ν•¨μˆ˜ μ„ μ–Έλ§Œ λ˜μ–΄μžˆκ³  κ΅¬ν˜„λΆ€κ°€ μ—†λŠ” λ©”μ„œλ“œλ₯Ό μ˜λ―Έν•œλ‹€.

λ‹€ν˜•μ„±

μ–΄λ–€ 객체의 μ†μ„±μ΄λ‚˜ κΈ°λŠ₯이 κ·Έ λ§₯락에 따라 λ‹€λ₯Έ 역할을 μˆ˜ν–‰ν•  수 μžˆλŠ” 객체 μ§€ν–₯의 νŠΉμ„±μ„ 의미

β‡’ ν•œ νƒ€μž…μ˜ μ°Έμ‘°λ³€μˆ˜λ₯Ό 톡해 μ—¬λŸ¬ νƒ€μž…μ˜ 객체λ₯Ό μ°Έμ‘°ν•  수 μžˆλ„λ‘ λ§Œλ“  것

  • λŒ€ν‘œμ μΈ μ˜ˆμ‹œλ‘œ λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©κ³Ό μ˜€λ²„λΌμ΄λ”©μ΄ ν•΄λ‹Ή

    • μ˜€λ²„λΌμ΄λ”© : 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œκ°€Β μƒν™©μ— 따라 λ‹€λ₯Έ 역할을 μˆ˜ν–‰ν•˜λŠ” 것
    • μ˜€λ²„λ‘œλ”© : ν•˜λ‚˜μ˜ 클래슀 λ‚΄μ—μ„œ 같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬ 개 μ€‘λ³΅ν•˜μ—¬ μ •μ˜ν•˜λŠ” 것

    ### κ΅¬ν˜„ μ˜ˆμ‹œ

    β‡’ 각 ν΄λž˜μŠ€μ— 직접 μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λ„둝 μΈν„°νŽ˜μ΄μŠ€λ‘œ 감싸주어, μ½”λ“œμ˜ 쀑볡성이 사라지고 μ™ΈλΆ€λ‘œλΆ€ν„° 데이터 λ³΄ν˜Έκ°€ κ°€λŠ₯해짐


상속

기쑴의 클래슀λ₯Ό μž¬ν™œμš©ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀λ₯Ό μž‘μ„±ν•˜λŠ” μžλ°”μ˜ 문법 μš”μ†Œλ₯Ό 의미

  • μƒμœ„ ν΄λž˜μŠ€λ‘œλΆ€ν„° ν™•μž₯된 μ—¬λŸ¬ 개의 ν•˜μœ„ ν΄λž˜μŠ€λ“€μ΄ λͺ¨λ‘ μƒμœ„ 클래슀의 속성과 κΈ°λŠ₯듀을 κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 있음
  • λͺ¨λ“  ꡬ체적인 λ‚΄μš©λ“€μ„ μƒμœ„ ν΄λž˜μŠ€μ— μ •μ˜ν•΄λ‘κ³  ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œλŠ” 그것을 λ‹¨μˆœνžˆ κ°€μ Έλ‹€κ°€ μž¬μ‚¬μš©ν•  수 있음

Untitled


Comments

Content