이번 강의에서는 캡슐화 실습을 해 봅시다.
캡슐화는 여러 개의 멤버를 하나의 형식으로 묶는 과정을 말합니다. 이번 실습에서는 학생 클래스를 정의하는 실습을 해 보기로 할게요.
실습할 학생 클래스의 멤버는 다음과 같아요.
학생 클래스 멤버 필드 아이큐 매력 번호 - 읽기 전용, 순차 부여 이름 가장 최근에 부여한 번호 - 정적 멤버 멤버 메서드 생성자(이름) 공부하다(횟수) 춤추다(횟수) 노래하다(횟수) ToString 재정의 멤버 속성 get은 public, set private
OOP 프로그래밍에서는 구현할 프로그램을 UML 다이어그램을 이용하여 요구 분석 및 아키텍쳐링, 설계를 한 후에 구체적으로 구현하고 테스트를 하곤 하죠. 특히 형식을 정의할 때 이를 클래스 다이어그램으로 표시하고 형식과 형식 사이의 관계를 도식하곤 합니다.
여기서 실습할 학생 클래스를 클래스 다이어그램으로 표현하면 다음처럼 표현할 수 있어요.
사각형을 삼등분하였을 때 첫 번째 칸은 클래스 이름, 두 번째 칸은 멤버 필드, 세 번째 칸은 멤버 메서드입니다.
그리고 멤버 앞에 + 표시는 public 접근 지정을 의미하고 -는 private 접근 지정을 의미합니다. 참고로 protected 접근 지정은 #으로 표시합니다.
lastnum과 get_LastNum처럼 밑줄 친 멤버는 정적 멤버를 의미합니다.
특수한 의미를 나타내기 위해 <<스테레오 타입>> 을 사용할 수도 있습니다.
이제 시나리오에 맞게 코드를 작성해 보세요. 메서드 내에서 구체적으로 수행할 작업은 여러분들이 추가적으로 시나리오를 작성하여 구현해 보세요. 그리고 난 후에 비교해 보시기 바랍니다.
using System; namespace 캡슐화_실습___학생_클래스_정의하기 { class Student//학생 클래스 { #region 멤버 필드 int iq;// 아이큐 int cp;// 매력 readonly int num;// 번호 string name;// 이름 static int lastnum;// 가장 최근에 부여한 번호 #endregion #region //멤버 메서드 public Student(string name)// 생성자 { this.name = name; lastnum++; num = lastnum; } // 공부하다 public void Study(int tcnt) { Console.WriteLine("{0}번 {1}학생 {2}횟수 공부하다.", num, name, tcnt); iq += tcnt; } // 춤추다 public void Dance(int tcnt) { Console.WriteLine("{0}번 {1}학생 {2}횟수 춤추다.", num, name, tcnt); cp += tcnt; } // 노래하다 public void Sing(int tcnt) { Console.WriteLine("{0}번 {1}학생 {2}횟수 노래하다.", num, name, tcnt); iq += tcnt / 2; cp += tcnt / 2; } // ToString 재정의 public override string ToString() { return string.Format("번호:{0} 이름:{1}", num, name); } #endregion #region//멤버 속성 // get은 public, set private public int IQ { get { return iq; } private set { iq = value; } } public int CP { get { return cp; } private set { cp = value; } } public int Num { get { return num; } } public string Name { get { return name; } private set { name = value; } } public static int LastNum { get { return lastnum; } } #endregion } }
//https://ehpub.co.kr //실습으로 다지는 C# //9. 캡슐화 실습 - 학생 클래스 정의하기 using System; namespace 캡슐화_실습___학생_클래스_정의하기 { class Program { static void Main(string[] args) { Student stu1 = new Student("홍길동"); Student stu2 = new Student("강감찬"); Console.WriteLine(stu1); Console.WriteLine(stu2); stu1.Study(3); Console.WriteLine("번호:{0} 이름:{1} 아이큐:{2} 매력:{3}", stu1.Num, stu1.Name, stu1.IQ, stu1.CP); stu1.Dance(4); Console.WriteLine("번호:{0} 이름:{1} 아이큐:{2} 매력:{3}", stu1.Num, stu1.Name, stu1.IQ, stu1.CP); stu1.Sing(6); Console.WriteLine("번호:{0} 이름:{1} 아이큐:{2} 매력:{3}", stu1.Num, stu1.Name, stu1.IQ, stu1.CP); Console.WriteLine("가장 최근에 부여한 학생 번호:{0}", Student.LastNum); } } }
실행 결과는 다음과 같습니다.
번호:1 이름:홍길동 번호:2 이름:강감찬 1번 홍길동학생 3횟수 공부하다. 번호:1 이름:홍길동 아이큐:3 매력:0 1번 홍길동학생 4횟수 춤추다. 번호:1 이름:홍길동 아이큐:3 매력:4 1번 홍길동학생 6횟수 노래하다. 번호:1 이름:홍길동 아이큐:6 매력:7 가장 최근에 부여한 학생 번호:2