반응형

전체 글 2934

[C#] 6.2.4 가상화 virtual, 재정의 override

6.2.4 가상화 virtual, 재정의 override new 키워드로 기반 클래스의 멤버를 무효화 할 때는 사용하는 변수 형식의 멤버가 사용됩니다. 이러한 특징은 기반 형식의 변수로 다양한 파생 개체를 참조할 때 실제 개체에 정의된 멤버가 사용되지 않으므로 다형성의 장점을 충분히 사용하지 못합니다. C#에서는 기반 형식에서 정의한 멤버를 파생 형식에서 재정의하면 변수의 형식이 아닌 개체의 형식의 멤버가 동작하게 virtual 키워드와 override 키워드를 제공합니다. 기반 형식에서 virtual 키워드를 명시하여 멤버를 선언하면 가상 멤버가 됩니다. 이때 파생 형식에서 기반 형식의 가상 멤버를 재정의할 때는 override 키워드를 명시합니다. ▶ virtual로 가상 메서드 선언, overrid..

[C#] 무효화 - new 키워드, base 키워드

6.2.3 무효화 - new 키워드, base 키워드 C#에서 파생된 형식에서 기반 형식에 정의된 멤버와 같은 이름의 멤버를 new 키워드를 사용하여 캡슐화하면 기반 형식의 멤버는 무효화됩니다. 이 때는 사용하는 곳의 형식에 따른 멤버가 사용됩니다. 즉, 기반 형식의 변수로 접근하면 기반 형식의 멤버가 사용되고 파생 형식의 변수로 접근하면 파생 형식의 멤버가 사용됩니다. ▶ new 키워드를 이용한 무효화 class Man { internal void Work() { Console.WriteLine("일을 하다."); } } class Student : Man { internal new void Work() //new 키워드로 기반 형식 Man의 Work 메서드 무효화 { base.Work(); //bas..

[C#] 6.2.2 is 연산자와 as 연산자

6.2.2 is 연산자와 as 연산자 이처럼 기반 형식의 변수로 파생된 개체를 참조할 수 있다는 특징은 사용의 편의성이 제공합니다. 하지만 프로그램에서 파생 형식에만 캡슐화된 멤버에 접근하여 사용해야 할 때도 있습니다. 이 때 is 연산자와 as 연산자를 사용하면 파생 개체를 참조할 수 있습니다. ▶ 용어: 상향 캐스팅 , 하향 캐스팅 Stu stu = man as Stu; //파생된 형식 개체 참조 if (stu != null) //man이 Stu개체일 때 { stu.Study(); } else { Console.WriteLine("Stu 형식 개체가 아닙니다. "); } is 연산자는 이항 연산자로 좌항에 변수가 오고 우항에 형식 명을 명시하면 해당 변수가 해당 형식으로 호환할 수 있는지를 반환합니다..

[C#] 6.2 다형성 - 기반 형식의 변수로 파생한 개체를 참조

6.2 다형성 OOP 언어는 캡슐화, 상속과 더불어 중요한 특징으로 다형성이 있습니다. C#에서의 다형성은 크게 두 가지로 얘기합니다. 첫째로 변수는 여러 형식의 개체를 참조할 수 있다는 것입니다. C#에서는 기반 형식의 변수로 파생된 개체를 참조할 수 있습니다. 두 번째로 변수를 통해 메서드를 호출했을 때 구체적인 동작이 다를 수 있다는 것입니다. C#에서는 기반 형식의 멤버 메서드를 추상 메서드와 가상 메서드로 지정할 수 있는데 파생된 형식에서 재정의하면 기반 형식의 변수로 파생된 개체를 참조했을 때 변수의 형식에 정의된 멤버가 아닌 참조된 실제 개체의 멤버가 수행이 됩니다. 6.2.1 기반 형식의 변수로 파생한 개체를 참조 C#에서는 다형성을 제공하여 기반 형식의 변수로 파생된 개체를 참조할 수 있..

[C#] 6. 상속과 다형성 - 6.1 상속

6. 상속과 다형성 C#에서는 다른 형식을 기반으로 파생된 형식을 정의할 수 있습니다. 이러한 OOP 언어의 특징을 상속이라고 합니다. C#에서 상속은 클래스와 인터페이스가 기반 형식이 될 수 있고 구조체는 기반 형식으로 인터페이스만 가능합니다. 이처럼 상속으로 표현된 기반 클래스와 파생 클래스의 관계를 일반화 관계라고 합니다. C#에서는 기반 형식의 변수로 파생된 형식의 개체를 참조할 수 있어 사용하는 곳에 편의를 제공합니다. 그리고 기반 형식에 정의한 멤버 메서드를 파생 형식에서 재정의할 수 있습니다. 이처럼 기반 형식의 멤버 메서드를 재정의하여 사용하는 변수의 형식의 멤버 메서드가 아닌 실제 참조하고 있는 개체의 멤버 메서드가 수행되게 할 수 있습니다. 이 같은 특징을 다형성이라고 합니다. 이번 장..

[C#] 5.3 접근 한정자

5.3 접근 한정자 C#에서는 정의하는 형식을 사용하는 범위나 형식 내의 멤버에 대해 사용할 수 있는 범위를 접근 한정자를 통해 지정할 수 있습니다. 형식 정의문 앞에 올 수 있는 접근 한정자에는 public과 internal이 있는데 명시를 하지 않으면 internal로 지정됩니다. public으로 접근 지정하면 다른 .NET 어셈블리에서도 접근할 수 있지만 internal로 지정하면 같은 .NET 어셈블리에서만 접근할 수 있습니다. 예를 들어 라이브러리를 만들 때 라이브러리 내에서만 접근할 멤버들은 internal로 외부에서 사용해도 되는 멤버는 public으로 지정합니다. 이에 대해 이해하려면 여러 개의 .NET 어셈블리로 구성된 프로그램을 만들 수 있어야 하는데 여기서 이를 다루는 것은 적절치 않..

[C#] 5.2 개체의 멤버와 정적(static) 멤버

5.2 개체의 멤버와 정적(static) 멤버 클래스나 구조체에 캡슐화할 수 있는 멤버들은 어떠한 것들이 있는지 살펴보았는데 중간마다 개체의 멤버와 정적인 멤버라는 얘기가 나왔던 것을 기억하시죠. 이제 이들에 대해 좀 더 자세히 살펴봅시다. 클래스나 구조체를 정의하였다는 것은 형식을 정의한 것을 의미하며 해당 형식에 맞는 실질적인 대상을 개체라고 합니다. 개체의 멤버는 개체의 데이터나 이를 사용하기 위한 메서드 등을 얘기합니다. 이에 반해 정적인 멤버는 개체에 상관없이 해당 형식에 공통으로 사용되는 멤버입니다. 클래스나 구조체에 캡슐화된 멤버들 중에 static 키워드나 const 키워드가 붙어 있는 멤버들은 정적인 멤버이며 이 외에 다른 멤버들은 개체의 멤버입니다. public으로 접근이 지정된 멤버들..

[C#] 5.1.8 연산자 중복 정의

5.1.8 연산자 중복 정의 C#에서는 클래스와 구조체의 멤버로 연산자 중복 정의를 캡슐화할 수 있습니다. 연산자 중복 정의를 하는 방법은 메서드와 비슷한데 static 키워드를 붙여 정적 멤버로 만들어야 하며 public으로 접근을 한정시키고 메서드 이름 대신 operator 키워드와 연산 기호를 명시한다는 점입니다. 그렇다고 모든 연산자를 중복 정의가 가능한 것은 아닙니다. 다음은 중복 정의가 가능한 것들입니다. 단항 연산자: +, -, !, ~, ++, --, true, false이항 연산자: +,-,*,/,%,&,|,^,, ==, !=, , = ▶ 연산자 중복 정의

[C#] 5.1.7 상수와 읽기 전용

5.1.7 상수와 읽기 전용 C#에서는 상수에는 컴파일 시에 상수값이 결정되는 상수 멤버 필드와 런타임에 결정되는 읽기 전용을 제공하고 있습니다. 상수 멤버 필드는 const 키워드와 형식, 필드 이름과 초기값을 대입하면 됩니다. 이처럼 상수 멤버 필드를 캡슐화하면 이는 개체의 멤버가 아닌 묵시적으로 정적 멤버가 되므로 명시적으로 static 키워드를 사용할 수 없습니다. [그림 18] 상수 멤버 필드에 static 키워드를 명시할 경우 오류 화면 읽기 전용을 캡슐화할 때는 readonly 키워드와 형식, 이름을 선언하면 됩니다. 읽기 전용은 상수 멤버 필드와 다르게 묵시적으로 정적 멤버가 아니므로 static 키워드를 명시해야 정적 멤버가 됩니다. 그리고 읽기 전용은 생성자에서 초기화할 수 있습니다. ..

[C#] 5.1.6 소멸자

5.1.6 소멸자 소멸자는 개체가 소멸할 때 수행해야 할 작업에 대한 코드 블록입니다. 소멸자는 클래스에서만 정의할 수가 있고 구조체에는 정의할 수 없습니다. C++에서는 동적으로 생성된 개체를 개발자가 소멸시켜야 합니다. 하지만 C#에서는 .NET 플랫폼의 가비지 수집기가 주기적으로 개체 수명을 조사를 통해 개체를 참조하는 변수가 없는 개체를 확인하고 정책에 의해 자동으로 소멸합니다. 이에 소멸자의 접근 한정자는 개발자가 명시할 수 없습니다. 그리고 다른 메서드들과 달리 중복 정의할 수도 없습니다. 소멸자의 이름은 형식 이름 앞에 ~가 붙습니다. 그리고 가비지 수집기가 소멸되는 시점에 자동으로 호출합니다. class Man{ ~Man() { Console.WriteLine("소멸자"); }} 컴파일러는..

반응형