λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
"곡뢀" π‘Ÿπ‘’π‘π‘œπ‘Ÿπ‘‘/π½π‘Žπ‘£π‘Ž

[Java] μ˜€λ²„λ‘œλ”© & μ˜€λ²„λΌμ΄λ”©(Overloading & Overriding)

by ΰ·† Yoni ΰ·† 2022. 8. 1.
728x90
μ˜€λ²„λ‘œλ”© (Overloading)

 

κ³΅μ‹μ μœΌλ‘œ λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”©μ„ μ •μ˜ν•˜κ³  μžˆλŠ” 말은

같은 μ΄λ¦„μ˜ λ©”μ„œλ“œλ₯Ό 쀑볡 μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

이것은 무슨 말일까?

 

Javaμ—μ„œλŠ” μ›λž˜ ν•œ 클래슀 내에 같은 μ΄λ¦„μ˜

λ©”μ„œλ“œλ₯Ό 생성할 수 μ—†λ‹€.

 

ν•˜μ§€λ§Œ, μ˜€λ²„λ‘œλ”©μ„ μ‚¬μš©ν•œλ‹€λ©΄ κ°€λŠ₯ν•˜λ‹€.

 

λ©”μ„œλ“œ μ˜€λ²„λ‘œλ”© 쑰건은 μ΄λŸ¬ν•˜λ‹€.

 

λ©”μ„œλ“œ 이름은 동일해야 ν•œλ‹€.

λ§€κ°œλ³€μˆ˜μ˜ 개수 λ˜λŠ” μˆœμ„œ, νƒ€μž…μ΄ 달라야 ν•œλ‹€.

리턴 νƒ€μž…μ€ 상관이 μ—†λ‹€.

 

μ˜€λ²„λ‘œλ”©μ˜ 예제λ₯Ό λ§Œλ“€μ–΄λ³΄μ•˜λ‹€.

class Exam {
	String name;
	String subject;
	int score;
	
	void test(String name) {
		this.name = name;
		
		System.out.println("μ‹œν—˜ μ‘μ‹œμž 이름은 " + name + "μž…λ‹ˆλ‹€.");
	}
	
	void test(String name, String subject) {
		this.name = name;
		this.subject = subject;
		
		System.out.println("μ‹œν—˜ μ‘μ‹œμž 이름은 " + name + "이고 κ³Όλͺ©λͺ…은 " + subject + "μž…λ‹ˆλ‹€.");
	}
	
	void test(String name, String subject, int score) {
		this.name = name;
		this.subject = subject;
		this.score = score;
		
		System.out.println("μ‹œν—˜ μ‘μ‹œμž 이름은 " + name + "이고 κ³Όλͺ©λͺ…은 " + subject + "이고 μ μˆ˜λŠ” " + score + "μ μž…λ‹ˆλ‹€.");
	}
}

public class Overloading {
	public static void main(String[] args) {
		Exam e = new Exam();
		
		e.test("κΉ€μ½”λ”©");
		// μ‹œν—˜ μ‘μ‹œμž 이름은 κΉ€μ½”λ”©μž…λ‹ˆλ‹€.
		e.test("λ‚˜μ½”λ”©", "Java ν”„λ‘œκ·Έλž˜λ°");
		// μ‹œν—˜ μ‘μ‹œμž 이름은 λ‚˜μ½”λ”©μ΄κ³  κ³Όλͺ©λͺ…은 Java ν”„λ‘œκ·Έλž˜λ°μž…λ‹ˆλ‹€.
		e.test("λ‹€μ½”λ”©", "Python", 90);
		// μ‹œν—˜ μ‘μ‹œμž 이름은 닀코딩이고 κ³Όλͺ©λͺ…은 Python이고 μ μˆ˜λŠ” 90μ μž…λ‹ˆλ‹€.
	}
}

 

μœ„ μ˜ˆμ œμ—μ„œλ„ 보면 μ•Œκ² μ§€λ§Œ,

λ©”μ„œλ“œ 이름은 λͺ¨λ‘ test둜 λ™μΌν•œλ°

λ§€κ°œλ³€μˆ˜μ˜ 갯수, νƒ€μž…μ΄ λͺ¨λ‘ λ‹€λ₯΄λ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.

 

Java μ»΄νŒŒμΌλŸ¬λŠ” μ‚¬μš©μžκ°€

μ˜€λ²„λ‘œλ”©λœ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜λ©΄,

μ „λ‹¬λœ λ§€κ°œλ³€μˆ˜μ˜ 개수, νƒ€μž… 등을 λͺ¨λ‘ κ³ λ €ν•˜μ—¬

μ•Œλ§žμ€ λ©”μ„œλ“œλ₯Ό μ°Ύμ•„ ν˜ΈμΆœν•΄μ€€λ‹€.

 

<μ˜€λ²„λ‘œλ”©μ˜ μž₯점>

μ΄λ ‡κ²Œ μ˜€λ²„λ‘œλ”©μ„ μ‚¬μš©ν•œλ‹€λ©΄,

κΈ°μ–΅ν•΄μ•Ό ν•  λ©”μ„œλ“œκ°€ κ°μ†Œν•˜κ²Œ 되고

쀑볡 μ½”λ“œμ— λŒ€ν•œ 효율적인 관리가 κ°€λŠ₯ν•˜κ²Œ λœλ‹€.

 


μ˜€λ²„λΌμ΄λ”© (Overriding)

 

λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©μ΄λž€ 상속 관계에 μžˆλŠ”

λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ 이미 μ •μ˜λœ λ©”μ„œλ“œλ₯Ό

μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.

 

Javaμ—μ„œ μžμ‹ ν΄λž˜μŠ€λŠ”

λΆ€λͺ¨ 클래슀의 private μš”μ†Œλ“€μ„ μ œμ™Έν•œ

λͺ¨λ“  것듀을 μƒμ†λ°›λŠ”λ‹€λŠ” νŠΉμ§•μ„ 가진닀.

 

λ©”μ„œλ“œλ₯Ό μƒμ†λ°›μœΌλ©΄,

κ·Έ λ©”μ„œλ“œλ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•  μˆ˜λ„ 있고

μžμ‹ ν΄λž˜μŠ€μ— μ ν•©ν•˜κ²Œ λ°œμ „μ‹œμΌœ

μˆ˜μ •ν•΄μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

 

μ΄λ ‡κ²Œ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό

μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 것을

λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”©μ΄λΌκ³  ν•˜λŠ” 것이닀.

 

λ©”μ„œλ“œ μ˜€λ²„λΌμ΄λ”© 쑰건은 μ΄λŸ¬ν•˜λ‹€.

 

λ©”μ„œλ“œ 이름이 κ°™μ•„μ•Ό ν•œλ‹€.

맀개 λ³€μˆ˜μ˜ 개수, νƒ€μž…, μˆœμ„œκ°€ κ°™μ•„μ•Ό ν•œλ‹€.

리턴 νƒ€μž…μ΄ κ°™μ•„μ•Ό ν•œλ‹€.

μ ‘κ·Ό μ œν•œμž(public, private λ“±...)λŠ” λΆ€λͺ¨λ³΄λ‹€ λ²”μœ„κ°€ λ„“κ±°λ‚˜ κ°™μ•„μ•Ό ν•œλ‹€.

쑰상보닀 더 큰 μ˜ˆμ™Έλ₯Ό 던질 수 μ—†λ‹€.

 

μ˜€λ²„λΌμ΄λ”© 예제

class Parent {
	void hello() {
		System.out.println("μ•ˆλ…•ν•˜μ„Έμš” λΆ€λͺ¨ ν΄λž˜μŠ€μž…λ‹ˆλ‹€.");
	}
}

class Child extends Parent {
	@Override
	void hello() {
		System.out.println("μ•ˆλ…•ν•˜μ„Έμš” μ €λŠ” λΆ€λͺ¨ 클래슀λ₯Ό μƒμ†λ°›μ•˜μŠ΅λ‹ˆλ‹€.");
	}
}

public class Overriding {

	public static void main(String[] args) {
		Parent p = new Parent();
		Child c = new Child();
		
		p.hello();
		// μ•ˆλ…•ν•˜μ„Έμš” λΆ€λͺ¨ ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
		c.hello();
		// μ•ˆλ…•ν•˜μ„Έμš” μ €λŠ” λΆ€λͺ¨ 클래슀λ₯Ό μƒμ†λ°›μ•˜μŠ΅λ‹ˆλ‹€.

	}

}

 

이렇듯, μžμ‹ ν΄λž˜μŠ€κ°€ λΆ€λͺ¨ 클래슀의

λ©”μ„œλ“œλ₯Ό 상속받아도 λ‹€λ₯Έ κΈ°λŠ₯을 μ‚¬μš©ν•˜κ³ μž ν•  λ•Œ

이 μ˜€λ²„λΌμ΄λ”©μ„ μ‚¬μš©ν•˜λŠ” 것이닀.

728x90

λŒ“κΈ€