C#
클래스 Class
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace cs13_class { class cat // Class는 private이라도 cs13_class라는 namespace 내에서 접근 가능함 // 내부 멤버변수 , 멤버메서드는 그렇지 않아서 public 등 접근 권한 명시해야함 { #region<생성자> public cat() { name = string.Empty; color = string.Empty; age = 0; } public cat(string _name,string _color, sbyte _age) { name = _name; color = _color; age = _age; } #endregion #region<멤버변수 - 속성> public string name; // 고양이 이름 public string color; // 고양이 색 public sbyte age; // 고양이 나이 sbyte : 0~255 #endregion #region<멤버메서드 - 기능> public void meow() { Console.WriteLine("{0} 야옹", name); } public void run() { Console.WriteLine("{0} 달림",name); } #endregion } internal class Program { static void Main(string[] args) { //객체 생성 후 초기화 cat kitty = new cat(); kitty.color = "하얀색"; kitty.name = "키티"; kitty.age = 3; kitty.meow(); kitty.run(); Console.WriteLine("{0} : {1} / {2}살", kitty.name, kitty.color,kitty.age); Console.WriteLine(); //객체 생성과 동시에 초기화 cat nero = new cat() {name="네로",color="검은색",age=5}; nero.meow(); nero.run(); Console.WriteLine("{0} : {1} / {2}살", nero.name, nero.color, nero.age); Console.WriteLine(); //생성자를 통해 초기화 cat catt=new cat("무명이","무색",10); catt.meow(); catt.run(); Console.WriteLine("{0} : {1} / {2}살", catt.name, catt.color, catt.age); } } }
1) class은 private이라도 동일한 namespace 내에서 접근 가능하지만 class의 멤버변수,멤버 메서드는 그렇지않아서 public / private 등 접근 권한을 명시해야함
2) class의 멤버변수를 초기화 할 때는 객체 생성 후 초기화 하는 방법과 객체 생성과 동시에 초기화하는 방법이 있음
3) 기본생성자 / 매개변수를 가지는 생성자로 선언과 동시에 초기화 가능
얕은복사/깊은복사
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace cs14_deepcopy { class someclass { public int somefield1; public int somefield2; public someclass deepcopy() { someclass newcopy=new someclass(); newcopy.somefield1 = this.somefield1; newcopy.somefield2=this.somefield2; return newcopy; } } internal class Program { static void Main(string[] args) { Console.WriteLine("얕은 복사"); someclass source = new someclass(); source.somefield1 = 100; source.somefield2 = 200; someclass target = source;//target에 source 복사 target.somefield2 = 300; Console.WriteLine("s.somefield1=>{0} / s.somefield2=>{1}", source.somefield1,source.somefield2 ); Console.WriteLine("t.somefield1=>{0} / t.somefield2=>{1}", target.somefield1, target.somefield2); Console.WriteLine("깊은 복사"); someclass s = new someclass(); s.somefield1 = 100; s.somefield2 = 200; someclass t = s.deepcopy(); //깊은복사 t.somefield2 = 300; Console.WriteLine("s.somefield1=>{0} / s.somefield2=>{1}", s.somefield1, s.somefield2); Console.WriteLine("t.somefield1=>{0} / t.somefield2=>{1}", t.somefield1, t.somefield2); } } }
1) someclass target=source; 를 통해서 얕은 복사를 하게되면
2) target.somefield2=300; 과 같이 복사된 클래스의 멤버변수를 수정하게되면 원본에서도 수정됨
3) someclass t = s.deepcopy(); 로 깊은 복사를 하면 t.somefield2=300;로 멤버변수를 수정해도 복사된 객체 따로 / 원본 객체 따로 바뀌는 것을 확인할 수 있음
4) 깊은 복사를 하려면 원본 클래스 내에 public 클래스명 deepcopy() 와 같이 복사를 위한 함수를 만들어주고 객체를 복사해야 원본 / 복사본 독립된 구역에서 작업 가능
접근제어자
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace cs15_accessmodifier { class waterheater//class 기본 접근 한정자 internal { protected int temp; public void settemp(int temp) { if(temp<-5||temp>40) { Console.WriteLine("범위 이탈"); return; } this.temp = temp; } internal void turnonheater() { Console.WriteLine("보일러 가동 / 온도:{0}", temp); } } internal class Program { static void Main(string[] args) { waterheater boiler = new waterheater(); boiler.settemp(50); boiler.settemp(21); boiler.turnonheater(); } } }
상속(Inheritance)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace cs16_inheritance { class Base//기반 또는 부모 클래스 { protected string name; private string color; public int age; public Base(string name, string color, int age) { this.name = name; this.color = color; this.age = age; Console.WriteLine("{0}.Base()",name); } public void BaseMethod() { Console.WriteLine("{0}.BaseMethod()",name); } public string GetColor()//동일 클래스 내에 private으로 선언한 color에 접근 가능 { return color; } } class Child:Base // 상속 시 protected / public 으로 선언된 멤버 변수는 접근가능, private은 불가능 { public Child(string name, string color, int age) : base(name, color, age) { Console.WriteLine("{0}.Child()", name); } public void ChildMethod() { Console.WriteLine("{0}.ChildMethod()", name); } } internal class Program { static void Main(string[] args) { Base b = new Base("부모", "Blue", 15); b.BaseMethod(); Child c = new Child("자식", "Green", 16); c.BaseMethod(); c.ChildMethod(); } } }
1) private으로 선언 시 동일 클래스내에서만 해당 멤버 변수에 접근 가능
2) class 상속 시 protected / public으로 선언된 멤버 변수는 접근 가능하지만 private으로 선언하면 접근 불가
3) 소스코드 실행 시 Base b = new Base(~); --> 부모 클래스의 생성자인 부모.Base()를 출력
4) b.BaseMethod(); --> 부모 클래스에 선언되어있는 BaseMetod 출력 즉 부모.BaseMethod() 출력
5) Child c = new Child(~); --> Base 클래스를 상속받은 Child 클래스 생성자가 호출될 때 부모 클래스의 생성자가 먼저 호출됨 -> 자식.Base() , 자식.Child() 출력
6) 자식 클래스인 c에서 BaseMethod와 ChildMethod 호출 시 각각 자식.BaseMethod(), 자식.ChildMethod() 출력
자식 클래스에서 생성자 호출 시에 부모 클래스의 생성자 또한 호출 된다는 것을 알아야함!
자식 클래스에서 생성자가 아닌 메소드 호출 시에는 생성자처럼 자동으로 호출되진 않는다!
C# WPF
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace wf03_property { public partial class Form1 : Form { Random rnd = new Random(45); public Form1() { InitializeComponent(); //생성자에서 되도록 설정부분 넣지 않는다 } private void Form1_Load(object sender, EventArgs e) { gbxmain.Text = "컨트롤 학습"; var fonts = FontFamily.Families.ToList(); // 내 OS 폰트명 가져오기 foreach ( var font in fonts ) { fontname.Items.Add( font.Name ); } //글자크기 min,max 값 지정 fontsize.Minimum = 5;fontsize.Maximum = 40; //텍스트박스 초기화 result.Text = "Hello, WinForm"; } private void changefontstyle() { if (fontname.SelectedIndex < 0) { fontname.SelectedIndex = 275; // 디폴트는 나눔고딕 } FontStyle style = FontStyle.Regular; if(bold.Checked==true) { style |= FontStyle.Bold; } if(italic.Checked==true) { style |= FontStyle.Italic; } decimal font_size=fontsize.Value; // font_size를 fontsize.Value 값으로 바꿈 result.Font = new Font((string)fontname.SelectedItem, (float)font_size, style); } void changeindent() { if (rboNormal.Checked) // RadioButton 이벤트 { result.Text = result.Text.Trim(); } else if (rboIndent.Checked) { result.Text = " " + result.Text; } } private void fontname_SelectedIndexChanged(object sender, EventArgs e) { changefontstyle(); } private void bold_CheckedChanged(object sender, EventArgs e) { changefontstyle(); } private void italic_CheckedChanged(object sender, EventArgs e) { changefontstyle(); } private void fontsize_ValueChanged(object sender, EventArgs e) { changefontstyle(); } private void trbdummy_Scroll(object sender, EventArgs e) { pgbdummy.Value = trbdummy.Value; } private void btnmodal_Click(object sender, EventArgs e) { Form frm = new Form() { Text = "Modal Form", Width = 300, Height = 200, Left = 10, Top = 20, BackColor = Color.Crimson, StartPosition = FormStartPosition.CenterParent }; frm.ShowDialog(); // 모달 방식으로 새 창 띄우기 } private void btnmodaless_Click(object sender, EventArgs e) { Form frm = new Form() { Text = "Modaless Form", Width = 300, Height = 200, StartPosition = FormStartPosition.CenterScreen,//Madaless는 CenterParent 안먹힘 BackColor = Color.GreenYellow }; frm.Show();//모달리스 방식으로 새창 띄우기 } // 기본적으로 MessageBox는 모달 private void btnmsgbox_Click(object sender, EventArgs e) { //MessageBox.Show(result.Text); // 기본 //MessageBox.Show(result.Text, caption: "메시지창",MessageBoxButtons.YesNoCancel);//버튼추가 //MessageBox.Show(result.Text, caption: "메시지창", MessageBoxButtons.YesNoCancel,MessageBoxIcon.Information);//아이콘추가 MessageBox.Show(result.Text, caption: "메시지창",MessageBoxButtons.YesNo,MessageBoxIcon.Warning,MessageBoxDefaultButton.Button2);//디폴트버튼설정 //MessageBox.Show(result.Text, caption: "메시지창", MessageBoxButtons.YesNo, // MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2,MessageBoxOptions.RightAlign);//글자 오른쪽 정렬 } private void btnaddroot_Click(object sender, EventArgs e) { trvdummy.Nodes.Add(rnd.Next(50).ToString());//0부터 45까지 랜덤으로 생성 } private void btnaddchild_Click(object sender, EventArgs e) { if(trvdummy.SelectedNode!=null) { trvdummy.SelectedNode.Nodes.Add(rnd.Next(50, 100).ToString()); trvdummy.SelectedNode.Expand();//트리노드 하위 펼치기 , 합치기 : Collapse treetolist(); } } void treetolist() { lsvdummy.Items.Clear(); //리스트뷰,트리뷰 등 모든 아이템을 제거 및 초기화 foreach (TreeNode item in trvdummy.Nodes) { treetolist(item); } } private void treetolist(TreeNode item) { lsvdummy.Items.Add( new ListViewItem(new[]{item.Text,item.FullPath.ToString()})); foreach(TreeNode node in item.Nodes) { treetolist(node);//재귀호출 } } private void rboNormal_CheckedChanged(object sender, EventArgs e) { changeindent(); //changefontstyle(); } private void rboIndent_CheckedChanged(object sender, EventArgs e) { changeindent(); //changefontstyle(); } private void btnload_Click(object sender, EventArgs e) { pcbdummy.Image = Bitmap.FromFile("cat.png"); } private void pcbdummy_Click(object sender, EventArgs e) { if(pcbdummy.SizeMode==PictureBoxSizeMode.Normal) { pcbdummy.SizeMode = PictureBoxSizeMode.StretchImage; } else { pcbdummy.SizeMode = PictureBoxSizeMode.Normal; } } } }
Programmers
개미군단
# 개미 군단 def solution(hp): a=hp//5 #장군개미 b=hp%5//3 #병정개미 c=hp%5%3//1 #일개미 answer =a+b+c return answer solution(999)
- 문제 풀 때 먼저 메모장 / 손으로 문제 이해 하고 푸는 습관을 꼭 만들자