본문 바로가기

프로그래밍/C#

6. C# 기초 - 3일차 개체 지향 프로그래밍(메서드 및 클래스)

1. 메서드 작성

namespace Lab07
{
    class Program
    {
        static void Main(string[] args)
        {
            int data1 = 100;
            int data2 = 200;

            int total = data1 + data2;

            TotalProcess();
            TotalProcess2(data1, data2); // 값 전달
            int result = TotalProcess3(data1, data2); // 값 전달
            string dataResult = TotalProcess4();
            TotalProcess4; // 값을 돌려주는 데 지정할 공간이 없음 : 문제가 발생하지 않음(실제로는 하지 않는다)

        }

        private static string TotalProcess4()
        {
            string name = "홍길동";
            return name;
        }

        // 매개변수가 있고, 돌려주는 것이 있는 메서드
        private static int TotalProcess3(int data1, int data2)
        {
            int total = data1 + data2;
            return total; // 리턴 타입의 경우 변수나 해당 값을 사용하면 문제 없음
        }

        // 매개변수가 있고, 돌려주는 것이 없는 메서드
        private static void TotalProcess2(int inputData1, int inputData2) // 매개변수 이름은 호출하는 메서드의 변수 이름과 같이 하는 경우가 많음 : 호출하는 메서드의 변수를 확인하기 위해서
        {
            int total = inputData1 + inputData2;
        }

        // 해당 메서드는 매개 변수 없고 돌려주는 것이 없는 메서드 생성
        private static void TotalProcess()
        {
            int totalData1 = 200;
            int totalData2 = 300;

            int total = totalData1 + totalData2;

        }
    }
}

 

 

2. 매개변수 전달

namespace Lab08
{
    class Program
    {
        static int result; // 필드 - 전역변수
        static void Main(string[] args)
        {
            // 값 전달
            TotalProcess1(100, 200); // 값 전달 : 변수의 저장된 실제 값, 바로 값을 전달
            // 참조 전달
            int data1 = 2000;
            TotalProcess2(ref data1); //참조 전달 : 변수의 위치(데이터의 위치를 전달 : 예 C/C++ 포인터 전달)

            int data2;
            TotalProcess3(out data2);//참조 전달 : out 전달
            result = 0;

            TotalProcess4(out data1);
            TotalProcess5(ref data2); // 참조 전달 ref 규칙은 초기 값을 넣고 전달해야함 => 규칙임


        }

        private static void TotalProcess5(ref int data2)
        {
            data2 = 9999;
        }

        private static void TotalProcess4(out int data1)
        { // out으로 전달 받으면 꼭 전달받은 메서드에서 해당 변수의 값을 꼭 넣어야 됨.
            data1 = 9215;
            string tempData = "12345";
            int data2;
            bool check = int.TryParse(tempData, out data2); // 형변환 기능에서 out 키워드 사용

            //data2 = int.Parse(tempData); //mutex - 응용 프로그램 중복실행 방지를 위해 out 키워드 사용
        }

        private static void TotalProcess3(out int data2)
        {
            data2 = 199;
            result = 99999;
        }

        private static void TotalProcess2(ref int inputData)
        {
            inputData = 1;
        }

        private static void TotalProcess1(int v1, int v2)
        {
            int total = v1 + v2;
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lab09
{
    class Program
    {
        static void Main(string[] args)
        {
            MyProcess(20, "홍길동"); // 값 형식의 매개변수
            MyProcess(name: "길동이", age: 100); // 변수 이름을 지정하여 전달 C# 4.0부터 지원
            // 실무에서는 권장하지 않음 : 팀 프로젝트에서 여러명이 개발할 경우
            int total1 = Calc(100, 200, "*"); // 팀프로젝트에서 다른 언어를 사용한 사람이 있을 경우 권장하지 않음
            int total2 = Calc(100, 200);

        }
        static int Calc(int data1, int data2, string calcType="+")
        {
            int result = 0;
            if(calcType == "+")
            {
                result = data1 + data2;
            }
            else
            {
                result = 0;
            }
            return result;
        }

        static void MyProcess(int age, string name)
        {
            int total = age + 200;
            string result = name + "님";
        }
    }
}
namespace Lab10
{
    class Program
    {
        static void Main(string[] args)
        {
            // 내가 만든 데이터 타입을 가져다 사용하기
            // 인스턴스를 해야함
            MyClass m = new MyClass(); // m은 MyClass의 인스턴스 결과물 - 개체
            string name = m.UserName("홍길동");
            Program p = new Program(); // static에서 non static을 가져올 때에는 인스턴스를 하면 된다.
            int age = p.UserAge();
        }

        int UserAge()
        {
            return 20;
        }
    }

    class MyClass
    {
        public string UserName(string inputName)
        {
            return inputName + "님";

        }
    }
}

3. 여러 클래스를 여러 파일로 관리할 경우(여러사람과 같이 프로젝트를 작업할 경우)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lab11
{
    class Program
    {
        static void Main(string[] args)
        {
            UserInfo info = new UserInfo();
            string name = info.UserName("홍길동");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lab11 //클래스를 여러 파일로 나눠서 관리할 때, namespace는 통일 
{
    class UserInfo
    {
        public string UserName(string inputData)
        {
            return inputData + "님";
        }
    }
}

 

4. 부모 클래스 상속

  • 사용할 때 부모 클래스이름을 작성하여 상속
  • 특정 소스코드를 수정할 수 없거나 기능을 추가해야할 경우, 해당 코드를 상속받아서 새로운 기능을 추가하여 작업
namespace Lab12
{
    class Program
    {
        static void Main(string[] args)
        {
            //UserInfo info = new UserInfo();

            ExtUserInfo info = new ExtUserInfo();
            string name = info.UserName();
            int age = info.UserAge();
            string mail = info.UserEmailData();// 부모에서 protected 메서드로 선언하여 자식에서 가공하고 돌려줌
        }
    }
}
namespace Lab12
{
    class UserInfo
    {
        public string UserName()
        {
            return "홍길동";
        }

        protected string UserMail()
        {
            return "aa@aa.co.kr";
        }
    }
}
namespace Lab12
{
    class ExtUserInfo : UserInfo // 부모 클래스를 상속(UserInfo)
    {
        public int UserAge()
        {
            return 20;
        }

        public string UserEmailData()
        {
            string mail = base.UserMail();
            return mail;
        }
    }
}

 

5. 개체 형 변환

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lab13
{
    class Program
    {
        static void Main(string[] args)
        {
            ExtMyCSL exCLs = new ExtMyCSL();
            new Program().TypeExchange(exCLs); // 개체를 보냄
        }

        private void TypeExchange(object data)
        {
            // as 연산자
            MyCLS cls = data as MyCLS; // 인스턴스를 하지 않고 Main에서 인스턴스 했기 떄문에 바로 사용 가능
            // as 연산자는 형 변환이 불가능하면 오류 발생하기 때문에 아래와 같이 체크함

            bool check = data is MyCLS; // 형 변환이 되는지 확인 후 가능하면 True
            // 명시적으로 형 변환
            MyCLS cls2 = (MyCLS)data; // 개체를 명시적으로 형변환

            // 실무에서 하는 방법 : as 연산자보다 이 방법을 실무에서 선호함
            if (data is MyCLS)
            {
                MyCLS cls3 = (MyCLS)data;
            }

        }
    }
}

 

6. 네임스페이스 관리

  • 여러명이 참여하는 프로젝트일 경우, 폴더와 파일별로 클래스를 관리하기 위해 다음과 같이 구성
  • 실무 권장사항 : 1개의 네임스페이스 -> 1개의 클래스(최대 5개 안에)

'프로그래밍 > C#' 카테고리의 다른 글

8. C# 기초 4일차  (0) 2021.11.04
7. C# 기초 4일차 실습  (0) 2021.11.04
5. C# 기초 -3일차 NET과 개체지향 프로그래밍  (0) 2021.11.03
4. C# 기초 -2일차(실습)  (0) 2021.11.02
3. C# 기초 -2일차(이론)  (0) 2021.11.02