반응형

소스 코드 353

[C#] 7.3 설계한 내용 프로젝트에 옮기기 - 학생 이동

7.3 설계한 내용 프로젝트에 옮기기 학생 이동 [그림] 학생 이동 시퀀스 다이어그램 이제 학생 이동 시퀀스 다이어그램에 약속된 호출들을 추가해 봅시다. 해당 시퀀스 다이어그램을 보면 캠퍼스 클래스에는 학생의 수를 반환하는 GetStuCount 와 GetStuInfo, GetStudent 메서드를 추가하면 되겠죠. 그런데, GetStuCount는 멤버 속성으로 하면 어떨까요? 그리고 GetStudent를 인덱서로 하면 어떨까요? 어떠한 것으로 하더라도 큰 문제가 되지 않지만, C# 언어에서 제공하는 문법적 요소의 특징을 고려한다면 변경하는 것이 나을 것 같습니다. 이처럼 개발 과정에서 이전 단계들에서 약속한 것을 수정하기를 원한다면 약속한 문서를 반드시 수정하는 것을 잊지 마시기 바랍니다. 실제 개발에서..

[C#] 7.3 설계한 내용 프로젝트에 옮기기 - 클래스 추가

7.3 설계한 내용 프로젝트에 옮기기 클래스 추가 이제는 앞에서 설계한 내용을 기반으로 프로젝트에 필요한 클래스를 추가하고 필요한 멤버를 추가해 보기로 합시다. 먼저, 설계 단계의 클래스 다이어그램에 해당하는 클래스를 프로젝트에 추가하시고 일반화 관계에 있으면 상속에 대해 표현하시기 바랍니다. 캠퍼스 생활(CampusLife)은 단일체로 정의하기로 하였으니 이에 대해 표현을 합시다. 단일체를 표현하는 방법은 캡슐화의 생성자 항목에서 설명했으므로 별도의 설명은 하지 않겠습니다. ▶ CampusLife.cs Class Campus { internal Campus() //기본 생성자 { throw new NotImplementedException(); } } 초기화 단계에서 학생 생성하는 시퀀스 다이어그램을 ..

[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.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.4 인덱서

5.1.4 인덱서 인덱서는 멤버 요소들로 구성된 컬렉션 개체의 요소에 쉽게 접근할 수 있게 해 주는 멤버입니다. 인덱서는 매개 변수가 있다는 점을 제외하면 구현 방법이 속성과 매우 흡사하며 속성처럼 get 블록과 set 블록을 선택적으로 정의할 수 있습니다. 인덱스를 캡슐화할 때에는 요소 형식, this 키워드, [매개 변수]를 선언하고 내부에 get 혹은 set 블록을 정의하면 됩니다. class Example{ ... public string this[int index] { get { return ...; } set { ...[index] = value; } }} 사용하는 곳에서는 인덱스 연산자를 이용하여 원하는 요소를 참조할 수 있습니다. static void Main(string[] args){ ..

반응형