23.04.06 Day48

오윤범·2023년 4월 6일
0

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)
  • 문제 풀 때 먼저 메모장 / 손으로 문제 이해 하고 푸는 습관을 꼭 만들자

0개의 댓글