카테고리 없음

[C#] 섀도잉, 하이딩, 오버라이딩

지윤공원🌳 2021. 10. 13. 14:54
728x90

C#에는 다른 언어와는 다른 점이 많습니다.

그중에서도 많이 사용되는 개념인 섀도잉, 하이딩에 대해서 알아보겠습니다.

그리고 하이딩과 오버라이딩은 구조가 비슷하여 헷갈리기 쉬운데요.

하이딩과 오버라이딩의 정확한 차이점을 알아가시면 좋겠습니다. 

 

Shadowing (섀도잉)

섀도잉은 특정한 영역에서 변수의 이름이 겹치는 현상을 일컫습니다.

즉, 이름이 겹침으로 인해 한 변수가 다른 변수를 가리게 되는 것입니다. 

주로 아래 예제처럼 클래스 변수 이름과 지역 변수 이름이 겹치는 경우가 많습니다. 

 

예제의 Main 함수에서 introduce변수를 출력한 결과 지역 변수 introduce가 출력된 것을 볼 수 있습니다. 

클래스 변수 introduce가 가려졌으므로 섀도잉입니다.

// using 구문 생략
class Program
{
	// 클래스 변수 introduce 선언
	public static string introduce = "클래스 변수";
	static void Main(string[] args)
	{
		// 지역 변수 introduce 선언
		String introduce = "메서드 안에 있는 지역 변수";
		Console.WriteLine(introduce); // 여기서 사용되는 건 지역변수 introduce
	}
}

 

Hiding (하이딩)

하이딩은 상속 관계에서 부모 클래스와 자식 클래스 간에 같은 이름의 멤버(변수, 메서드)를 만드는 것입니다.

정상적인 상속을 막기에 되도록 상속 관계에서는 되도록 변수, 메서드 이름을 겹치지 않게 하는 게 좋습니다.

 

예제를 보면 2개의 클래스가 있습니다.

하나는 부모 클래스인 Person클래스, 나머지 하나는 자식 클래스인 Student 클래스입니다. 

Student클래스는 Person클래스를 상속받고 있습니다. 

Main함수에서 Student형의 객체를 만들고 변수 whoiam를 출력하고 메서드 Intro를 호출하고 있습니다. 

이때 Student클래스의 변수 whoiam과 메서드 Intro를 사용하는 것을 볼 수 있습니다. 이게 하이딩입니다. 

 

메서드+변수 하이딩 예제

// using 구문 생략
class Program
{
	// Person 클래스
	class Person
	{
		public string whoiam = "person";
		public void Intro()
		{
			Console.WriteLine("I am " + whoiam);
		}
	}

	// Person 클래스를 상속받는 Student클래스
	class Student : Person
	{
		public string whoiam = "student";
		public void Intro()
		{
			Console.WriteLine("I am " + whoiam);
		}
	}

	static void Main(string[] args)
	{
		Student student = new Student();
		Console.WriteLine(student.whoiam);
		student.Intro();
	}
}

 

+ new 키워드

new키워드는 인스턴스 객체를 만들 때 사용되기도 하지만 하이딩을 명시적으로 나타낼 때도 사용합니다. 

위 예제의 Student클래스를 new키워드를 사용하여 수정하면 아래와 같습니다. 

new 키워드는 결과는 같지만 하이딩을 명시적으로 나타낼 수 있다는 점에서 사용합니다. 

class Student : Person
{
	public new string whoiam = "student";
	public new void Intro()
	{
		Console.WriteLine("I am " + whoiam);
	}
}

 

Overriding (오버라이딩)

상속을 허용하는 언어라면 대부분 가지고 있는 기능입니다. 

오버라이딩은 상속 관계에서 부모 클래스의 메서드가 자식 클래스에서 선언한 메서드에 의해 가려지는 것입니다. 

부모 클래스의 메서드를 재정의하는 것이죠.

 

Main메서드에서 Student형의 인스턴스 객체를 생성했습니다.

만든 stduent객체의 Intro메서드를 실행하고 student객체를 Person형으로 강제 형 변환하여 Intro를 실행했으나 결과를 보면 모두 Stduent클래스의 Intro가 실행된 것을 볼 수 있습니다. 

즉, 오버라이딩을 하면 아무리 형 변환을 해도 재정의한 메서드가 호출됩니다. 

// using 구문 생략
class Program
{
	// Person 클래스
	class Person
	{
		public string whoiam = "person";
		public virtual void Intro()
		{
			Console.WriteLine("I am " + whoiam);
		}
	}

	// Person 클래스를 상속받는 Student클래스
	class Student : Person
	{
		public string whoiam = "student";
		public override void Intro()
		{
			Console.WriteLine("I am " + whoiam);
		}
	}

	static void Main(string[] args)
	{
		Student student = new Student();
		student.Intro();
		((Person)student).Intro();
	}
}

 

하이딩과 오버라이딩의 차이점

  • 하이딩은 멤버(변수, 메서드 등)에 적용되지만 오버라이딩은 메서드에만 적용된다.
  • 하이딩은 형 변환을 통해 부모 메서드를 호출할 수 있다. (부모 메서드를 숨기는 것이기 때문) 하지만, 오버라이딩은 형변환을 해도 재정의된 자식 메서드가 호출된다. 

 

 

 

 

 

728x90