C# - ํŒŒ์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค

2020. 11. 19. 15:30ใ†์ „๊ณต ๊ณผ๋ชฉ/์œˆ๋„์šฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

C# - ํŒŒ์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค

 

ํŒŒ์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค .. ์ฒ˜์Œ ์ด ๊ฐœ๋…์„ ์ ‘ํ•˜๋ฉด ํ—ท๊ฐˆ๋ฆฐ๋‹ค. ์ž๋ฐ”์—์„œ๋„ ๋ฐฐ์šธ ๋•Œ ํ—ท๊ฐˆ๋ ธ๊ธฐ์— ์ด๋ฒˆ์— ํ™•์‹คํ•˜๊ฒŒ ์ •๋ฆฌ๋ฅผ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

 

ํŒŒ์ƒ ํด๋ž˜์Šค๋ž€?

- ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํด๋ž˜์Šค์— ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ

์—ฌ๊ธฐ์„œ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ํด๋ž˜์Šค๋Š” "๋ฒ ์ด์Šค ํด๋ž˜์Šค"์ด๋‹ค.

 

๋ฒ ์ด์Šค ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋“ค์ด ํŒŒ์ƒ ํด๋ž˜์Šค๋กœ ์˜ฎ๊ฒจ์ง€๋Š” ๊ณผ์ •์„ "์ƒ์†"์ด๋ผ๊ณ  ํ•˜๋ฉฐ ํŒŒ์ƒ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ "์žฌ์‚ฌ์šฉ์„ฑ"์„ ๋†’์—ฌ์ค€๋‹ค. ๊ฐ™์€ ๊ฑธ ๊ณ„์†ํ•ด์„œ ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ์— ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๊ฐ€ ๋‚˜ํƒ€๋‚œ ๊ฒƒ์ด๋‹ค.

 

ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ์ •์˜ ๋ฐฉ๋ฒ•

[์ ‘๊ทผ ์ˆ˜์ •์ž] class ํŒŒ์ƒ ํด๋ž˜์Šค๋ช… : ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋ช… {

๋ฉค๋ฒ„

}

 

ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ํ•„๋“œ์˜ ์ด๋ฆ„๊ณผ ๋ฒ ์ด์Šค ํด๋ž˜์Šค ํ•„๋“œ์˜ ์ด๋ฆ„์ด ๊ฐ™๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

-> ๋ฒ ์ด์Šค ํด๋ž˜์Šค์˜ ํ•„๋“œ๊ฐ€ ์ˆจ๊ฒจ์ง„๋‹ค. -> ์ด๋•Œ ๊ตณ์ด ๋ฒ ์ด์Šค ํด๋ž˜์Šค์˜ ํ•„๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด base์ง€์ •์–ด๋ฅผ ํ†ตํ•ด์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด์ž.

 

using System;
class BaseClass{
	protected int a = 1;
    protected int b = 2;
    }

class DerivedClass : BaseClass{
	new int a = 3; //new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ •์˜๋ฅผ ํ•ด์ฃผ์ž
    new double b = 4.5;
    public void Output(){
    	Console.WriteLine("BaseClass : a = {0}, DerivedClass : a = {1}", base.a, a);
        Console.WriteLine("BaseClass : b = {0}, DerivedClass : b = {1}", base.b, b);
        }
       }

class HiddenApp{
	public static void Main() {
    	DerivedClass obj = new DerivedClass();
        obj.Output();
        }
}

์œ„์˜ ์†Œ์Šค์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋Š”

a = 1,3

b = 2, 4.5์ด๋‹ค.

 

์œ ์˜ํ•  ์ ์€ base.a๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ baseํด๋ž˜์Šค์— ์žˆ๋Š” a๊ฐ€ protected๋‚˜ public์œผ๋กœ ์ ‘๊ทผ ์ˆ˜์ •์ž๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. 

 

ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž

- ๋ฉ”์ธ ํด๋ž˜์Šค์—์„œ ํŒŒ์ƒ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค๋ฉด "ํŒŒ์ƒ ํด๋ž˜์Šค ์ ‘๊ทผ -> ๋ฒ ์ด์Šค ํด๋ž˜์Šค ์ƒ์„ฑ์ž ํ˜ธ์ถœ -> ํŒŒ์ƒ ํด๋ž˜์Šค ์ƒ์„ฑ์ž ํ˜ธ์ถœ"์˜ ๊ณผ์ •์œผ๋กœ ์ผ์–ด๋‚œ๋‹ค.

 

์ƒ์„ฑ์ž์—๋Š” ๋ช…์‹œ์ ์œผ๋กœ base()๋ฅผ ๋ถ™์—ฌ๋„ ๋˜๊ณ  ์•ˆ๋ถ™์—ฌ๋„ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ์ƒ์„ฑ์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ์„ ๋•Œ์—๋Š” ํŒŒ์ƒํด๋ž˜์Šค ์ƒ์„ฑ์ž(๋งค๊ฐœ๋ณ€์ˆ˜) : base(๋งค๊ฐœ๋ณ€์ˆ˜)์™€ ๊ฐ™์ด ๋ช…์‹œ๋ฅผ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. 

 

๋ฉ”์†Œ๋“œ ์žฌ์ •์˜

- ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ๋ฉ”์†Œ๋“œ๋ฅผ ์ƒ์†๋ฐ›์„ ๋•Œ, ํŒŒ์ƒ ํด๋ž˜์Šค ๋‚ด์— ๊ฐ™์€ ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‹œ๊ทธ๋„ค์ฒ˜๊ฐ€ ๋‹ค๋ฅด๋ฉด ์ค‘๋ณต(overriding) ๊ฐ™์œผ๋ฉด (overloading)์ด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์‹œ๊ทธ๋„ค์ฒ˜๋Š” ๋ฉ”์†Œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋‚˜ ํ˜•์„ ์˜๋ฏธํ•˜๋ฉฐ ์‹œ๊ทธ๋„ค์ฒ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋ฒ ์ด์Šค ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋Œ€์ฒดํ•˜๊ณ  ๋‹ค๋ฅด๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋˜๋Š” ์…ˆ์ด๋‹ค.

 

๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์˜ค๋ฒ„๋ผ์ด๋”ฉ๊ณผ ์˜ค๋ฒ„๋กœ๋”ฉ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

 

using system;
class BaseClass{
	public void MethodA(){
    	Console.WriteLine("In the BaseClass ...");
        }
       }

class DerivedClass : BaseClass{
	new public void MethodA(){
    	Console.WriteLine("overriding");
        }

	public void MethodA(int i){
    	Console.WriteLine("overloading");
        }
       }
class OverApp{
	public static void main(){
		BaseClass obj1 = new BaseClass();
        DerivedClass obj2 = new DerivedClass();
        obj1.MethodA();
        obj2.MethodA();
        obj2.MethodA(1);
        }
       }
       

 

๊ฒฐ๊ณผํ™”๋ฉด

In the BaseClass ...

overriding

overloading

 

์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋–„๋ฌธ์— new์—ฐ์‚ฐ์ž๋ฅผ ๋ถ™์ด๋ฉด์„œ ์‹œ๊ทธ๋„ค์ฒ˜๊ฐ€ ๋˜‘๊ฐ™์•„์•ผํ•˜๊ณ 

์˜ค๋ฒ„๋กœ๋”ฉ์€  ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์€ ๊ฐ™์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— "์ƒˆ๋กœ์šด" ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

๊ฐ€์ƒ ๋ฉ”์†Œ๋“œ

์ง€์ •์–ด virtual๋กœ ์„ ์–ธ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ƒ ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ํ•œ๋‹ค. ํ•ต์‹ฌ์€ ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜๋˜์„œ ์‚ฌ์šฉํ•จ์„ ์•Œ๋ ค์ฃผ๋Š” ๋ฉ”์†Œ๋“œ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ฐ€์ƒ ๋ฉ”์†Œ๋“œ๋Š” new๋‚˜ override ์ˆ˜์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์žฌ์ •์˜ํ•˜๋ฉฐ new๋Š” ๊ฐ์ฒด ํ˜•์— ๋”ฐ๋ผ ํ˜ธ์ถœ๋˜๊ณ , override๋Š” ๊ฐ์ฒด ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒƒ์— ๋”ฐ๋ผ ํ˜ธ์ถœ๋œ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด BaseClass s = new DerivedClass(); ๋ผ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, s๋ณ€์ˆ˜๋Š” BaseClass์˜ ๊ฐ์ฒด ํ˜•์„ ๊ฐ€์ง€๋ฉด์„œ DerivedClass๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ฆ‰ new ์—ฐ์‚ฐ์ž๋กœ virtual๊ฐ€ ์žฌ์ •์˜๋˜๋ฉด ์ž๋ฃŒํ˜•๋งŒ ๋ณด๋ฉด๋˜๊ณ , override ์—ฐ์‚ฐ์ž๋กœ virtual๊ฐ€ ์žฌ์ •์˜๋˜๋ฉด ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ๋งŒ ๋ณด๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๊ณง ๋‚˜์˜ฌ ๋‹คํ˜•์„ฑ์—์„œ ์ข€ ๋” ๊นŠ์ด ๋‹ค๋ฃจ๊ฒ ๋‹ค.

 

๋ด‰์ธ ๋ฉ”์†Œ๋“œ

- ๋ง ๊ทธ๋Œ€๋กœ ๋ด‰์ธ๋œ ๋ฉ”์†Œ๋“œ๋กœ, ์žฌ์ •์˜ ๋˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฉฐ ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ ๋˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค. sealed๋ฅผ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

ํด๋ž˜์Šค๋„ ๋ด‰์ธ์œผ๋กœ ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ ๋ด‰์ธ ํด๋ž˜์Šค ์•ˆ์˜ ๋ฉ”์†Œ๋“œ๋“ค์€ ์ „๋ถ€ ๋ด‰์ธ๋ฉ”์†Œ๋“œ๊ฐ€ ๋œ๋‹ค.

 

์ถ”์ƒ ํด๋ž˜์Šค

- ์ถ”์ƒ ํด๋ž˜์Šค๋ž€ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค์ด๋ฉฐ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋Š” ์‹ค์งˆ์ ์ธ ๊ตฌํ˜„์„ ๊ฐ–์ง€ ์•Š๊ณ  ๋ฉ”์†Œ๋“œ ์„ ์–ธ๋งŒ ์žˆ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

- ์ถ”์ƒ ํด๋ž˜์Šค์—๋Š” ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹Œ ๋ฉ”์†Œ๋“œ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ณ  ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์กด์žฌํ•œ๋‹ค๋ฉด ์ถ”์ƒ ํด๋ž˜์Šค์ด๋‹ค. 

- ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ•ด ์ƒ์†๋œ ํ›„์— ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•˜๊ณ  abstract ์ˆ˜์ •์ž๋Š” virtual ์ˆ˜์ •์ž์˜ ์˜๋ฏธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— override ์ˆ˜์ •์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

abstract ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

 

using System;
abstract class AbstractClass {
	public abstract void MethodA();
    public void MethodB() {
    	Console.WriteLine("MethodB()");
        }
       }

class ImpClass : AbstractClass {
	override public void MethodA() {
		Console.WriteLine("MethodA()");
        }
      }
class AbsApp{
	public static void Main(){
    	ImpClass obj = new ImpClass();
        obj.MethodA();
        obj.MethodB();
        }
      }

๊ฒฐ๊ณผ ํ™”๋ฉด

MethodB()

MethodA()

 

ํ•ต์‹ฌ์€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋–„๋Š” abstract๋ฅผ ๋ถ™์—ฌ์ฃผ๊ณ  ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ ํ•  ๋•Œ๋Š” override๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ์ ‘๊ทผ ์ˆ˜์ •์ž๋Š” ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

 

ํด๋ž˜์Šคํ˜• ๋ณ€ํ™˜

ํด๋ž˜์Šค๋„ ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์ฒ˜๋Ÿผ ํ˜• ๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด a๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ b๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•˜์„ ๋•Œ aํด๋ž˜์Šค๋Š” bํด๋ž˜์Šค๋ณด๋‹ค ๋‚ฎ์€ ํด๋ž˜์Šค๊ฐ€ ๋œ๋‹ค. ์ฆ‰ ์ƒ์†๋œ ํด๋ž˜์Šค๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋•Œ a ํด๋ž˜์Šค์˜ ํ˜•์„ b๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์„ ๋•Œ ๋” ๋†’์€ ํ˜•์œผ๋กœ ๋ฐ”๋€Œ๋Š”๋ฐ ์ด๋ฅผ "์บ์ŠคํŒ…-์—…"์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

ํŒŒ์ƒ ํด๋ž˜์Šค๊ฐ€ ๋ฒ ์ด์Šค ํด๋ž˜์Šคํ˜•์œผ๋กœ ๋ฐ”๋€ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์— ๋ฐ˜๋Œ€๋˜๋Š”๊ฒƒ์ด "์บ์ŠคํŒ…-๋‹ค์šด"์ด๋‹ค. ์บ์ŠคํŒ… ๋‹ค์šด์€ ์บ์ŠคํŠธ ์—ฐ์„ ์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋ช…์‹์ ์œผ๋กœ ํด๋ž˜์Šคํ˜•์„ ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

(a)b = value; ์™€ ๊ฐ™์ด ๋ง์ด๋‹ค.

ํฐ ๊ฒƒ์„ ์ž‘์€ ๊ฒƒ์— ๋„ฃ๊ธฐ๋Š” ํž˜๋“ค๊ณ  ์ž‘์€ ๊ฒƒ์„ ํฐ ๊ฒƒ์— ๋„ฃ๊ธฐ๋Š” ์‰ฌ์šด ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•˜๋‹ค.

 

๋‹คํ˜•์„ฑ

- ์ ์šฉํ•˜๋Š” ๊ฐ์ฒด์— ๋”ฐ๋ผ ๋ฉ”์†Œ๋“œ์˜ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ

- ์ด๋Š” virtual์™€ override์˜ ์กฐํ•ฉ์œผ๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ์„ ์–ธํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰ ๋ฒ ์ด์Šค ํด๋ž˜์Šค์—์„œ virtual๋กœ ์„ ์–ธํ•˜๊ณ  ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ override๋กœ ๋ฉ”์†Œ๋“œ๋ฅผ ์žฌ์ •์˜ํ•ด์•ผํ•œ๋‹ค.

 

using System;
class BaseClass {
	public virtual void Output(){
		Console.WriteLine("Base");
        }
      }

class DerivedClass : BaseClass {
	public override void Output(){
    	Console.WriteLine("Derived");
        }
      }
class PolyApp{
	static void Print(BaseClass obj){
		obj.Output();
       }
   public static void Main() {
   		BaseClass obj1 = new BaseClass();
        DerivedClass obj2 = new DerivedClass();
        Print(obj1);
        Print(obj2);
       }
     }  
     

๊ฒฐ๊ณผ ํ™”๋ฉด 

Base

Derived

 

virtual์™€ override์˜ ์กฐํ•ฉ์€ ์•ž์—์„œ๋„ ๋งํ–ˆ๋“ฏ์ด ๊ฐ์ฒด์˜ ํ˜•์ด ์•„๋‹Œ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฐœ์ฒด์— ๋”ฐ๋ผ ์ด๋ฃจ์–ด์ง„๋‹ค.

CLanguage c = new Java();  c.Print(); ๋ผ๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ Clanguageํด๋ž˜์Šค์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ Javaํด๋ž˜์Šค์— ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ์žฅ์—์„œ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.