아래 글은 C# 개체와 개체지향프로그래밍 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 47단원 개체와 개체지향프로그래밍 628 ~ 640페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 47. 개체와 개체지향프로그래밍]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

 

https://www.youtube.com/watch?v=cD6PA0ngXDM 

 

 

 

 

 

✳ 개체(Object)

 

- 현실세계에서 어떤 특징(속성)을 가지며 어떤 동작(메서드)을 수행할 수 있는 단위 하나를 개체로 표현할 수 있습니다.

 예를들어 자동차, 사람, 컴퓨터 등이 있다고 할 때 다음 문장처럼 표현할 수 있습니다.

 

 

빨간색 자동차 개체 좌회전 동작을 한다.

 

 

코드에서는 개체를 만들어 내는 설계도가 클래스고, 이 클래스에서 조립된 물건 하나가 바로 개체입니다.

 

 

자동차 설계도(클래스) -> 조립(인스턴스화) -> 자동차(개체, Object)

 

 

마지막으로 클래스는 대문자로 시작하고, 개체는 소문자로 시작하는 것이 기본 원칙입니다.

 

 

 

 

 

 

using System;
using System.Collections;

// 인터페이스 : 표준, 다중상속
interface IStandard { void Run(); void Back(); }

// 네임스페이스 : 클래스명 충돌 방지
namespace Benz
{
    // 클래스 : 설계도
    class Car : IStandard
    {
        #region Public Methods
        public void Run()
        {
            Console.WriteLine("{0} 자동차가 달립니다.", name);
        }   // 메서드 : 기능/동작
        public void Back() { }
        #endregion
        #region Constructors
        public Car(string name) // 생성자 : 시동, 필드 초기화
        {
            this.name = name;
        }
        public Car()
        {
            this.name = "벤츠"; // 기본값
        }
        public Car(int length)
        {
            this.Name = "벤츠"; // 개선
            _Length = length;
            names = new string[length]; //넘겨온 값으로 요소생성    
        }
        #endregion
        #region Private Member Variables
        private string name; // 필드 : 부품 
        private string[] names; // 배열형 필드
        private readonly int _Length; // 읽기전용 필드
        #endregion
        #region Public Properties
        public string Name      // 속성 : private필드->외부공개
        {
            get { return name; }
            set { name = value; }
        }
        public int Length { get { return _Length; } }
        #endregion
        #region Destructor
        ~Car()  // 소멸자 : 폐차, 만들어진 객체 소멸될 때
        {
            Console.WriteLine("{0} 자동차가 폐차됨.", name);
        }
        #endregion
        #region Indexer
        public string this[int index]   // 인덱서:카탈로그 화
        {
            get { return names[index]; }
            set { names[index] = value; }
        }
        #endregion
        #region Iterators
        public IEnumerator GetEnumerator() // 반복기
        {
            for (int i = 0; i < _Length; i++)
            {
                yield return names[i];
            }
        }
        #endregion
        #region Public Delegates
        public delegate void EventHandler(); // 대리자:다중메서드호출
        #endregion
        #region Public Events
        public event EventHandler Click; // 이벤트 
        #endregion
        #region Event Handlers
        public void OnClick()   // 이벤트 핸들러
        {
            if (Click != null)
            {
                Click();
            }
        }
        #endregion
    }
}

class 자동차클래스
{
    static void Main(string[] args)
    {
        #region ...
        Benz.Car car = new Benz.Car("A클래스");
        car.Run(); // A클래스 자동차가 달립니다.
        Car car1 = new Car();
        car1.Name = "S클래스";
        car1.Run(); // S클래스 자동차가 달립니다. 
        Car myCar = new Car(2);
        myCar[0] = "CLA";
        myCar[1] = "GLA";
        for (int i = 0; i < myCar.Length; i++)
        {
            Console.WriteLine(myCar[i]);
        }
        foreach (string name in myCar)
        {
            Console.WriteLine(name);
        }
        #endregion
        Car btn = new Car("CLS");
        btn.Click += new Car.EventHandler(btn.Run);
        btn.Click += new Car.EventHandler(btn.Run);
        btn.OnClick();
    }
}
반응형

 

 

 

아래 글은 C# 특성(Attribute)과 리플렉션(Reflection) 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 46단원 특성과 리플렉션 614 ~ 627페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 46. 특성과 리플렉션]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

 

https://www.youtube.com/watch?v=oWoclcZhcUQ 

 

 

 

 

 

✳ 특성(Attribute)

 

  • 프로그램에서 형식, 멤버 및 다른 엔터티에 대한 추가 선언 정보를 지정 가능
  • 자동차 튜닝 -> 없었던 기능을 꾸며준다

 

 

 

 

✳ 리플렉션(Reflection)

 

  • CLR을 자기 자신에 대한 내용을 노출시켜주는 API를 제공
  • System.Typpe으로 리플렉션을 구현
  • 자동차 전시회
    -> 리플렉션(반사?)
       => 광택이 적용된 럭셔리 자동차들
  • 동적으로 특정한 형식의 멤버를 가져오려고 한다.

 

 

 

✳ 특성(Attribute)관련 예제코드

using System;

class 특성
{
    /// <summary>
    /// 닷넷 1.0 버전
    /// </summary>
    [
        Obsolete(
            "현재 메서드는 오래된 버전이므로, Say2()를 사용하세요.", false)
    ]
    public static void Say1()
    {
        Console.WriteLine("안녕");
    }
    /// <summary>
    /// 닷넷 2.0 버전 이상
    /// </summary>
    public static void Say2()
    {
        Console.WriteLine("안녕하세요");
    }
    static void Main(string[] args)
    {
        //Say1(); // 이 메서드 호출시 경고 또는 에러 발생
        Say2();
    }
}

 

 

 

 

 

✳ 리플렉션(Reflection)관련 예제코드

//[?] 리플렉션: 특정 클래스 등에 대한 정보(메타데이터)를 반환시켜주는 기능
using System;
using System.Reflection;

namespace 리플렉션_멤버정보
{
    class Test
    {
        public void TestMethod() { }
    }

    class 리플렉션_멤버정보
    {
        static void Main()
        {
            // Test 클래스에 대한 멤버 정보 얻기
            Type t = typeof(Test);

            // 인스턴스 멤버 기준으로 출력
            // MemberInfo[] members = t.GetMembers();

            // 원하는 멤버를 조건에 따라 출력
            MemberInfo[] members = t.GetMembers(
                BindingFlags.Instance | BindingFlags.Static |
                BindingFlags.NonPublic | BindingFlags.Public
            ); 

            // 멤버 출력: C# 버전에 따라 다르게 출력될 수 있음
            foreach (var member in members)
            {
                Console.WriteLine("{0}", member.Name);
            }
        }
    }
}

 

 

반응형

 

 

아래 글은 C# 메서드 오버라이드 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 44단원 메서드 오버라이드 592 ~ 599페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 44. 메서드 오버라이드]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

 

https://www.youtube.com/watch?v=UubMVC3EmyQ 

 

 

 

 

✳ 메서드(Method) 오버라이드

 

 

  • 오버라이드(재정의, 다시 정의), Override, Overriding
    - 부모클래스의 메서드를 자식 클래스에서 재정의
    - 가상 메서드
    - virtual과 override
  • 오버로드(다중 정의, 여러 번 정의), Overload, Overloading
    - 하나의 클래스에 시그니처가 다른 동일 이름의 메서드 여러번 정의

 

 

 

 

 

✳ 예제코드

namespace OverrideDemo
{
    class Parent
    {
        protected void Say() => System.Console.WriteLine("부모_안녕하세요.");
        protected void Run() => System.Console.WriteLine("부모_달리다.");
        public virtual void Walk() => System.Console.WriteLine("부모_걷다.");
        public virtual void Work() => System.Console.WriteLine("부모_프로그래머");
    }


    class Child : Parent
    {
        // public void Say() => System.Console.WriteLine("자식_안녕하세요.");
        public new void Say() => System.Console.WriteLine("자식_안녕하세요.");
        public new void Run() => System.Console.WriteLine("자식_달리다.");
        public override void Walk() => base.Walk(); // 관대한 부모의 의견을 따르다.
        public override void Work() => System.Console.WriteLine("자식_프로게이머");
    }

    class OverrideDemo
    {
        static void Main()
        {
            Child child = new Child();
            child.Say();  // 자식이 예의가 없는 경우: x -> x
            child.Run();  // 자식이 예의가 있는 경우: x -> new
            child.Walk(); // 부모도 관대하고 자식도 예의가 있는 경우: virtual -> override
            child.Work(); // 부모도 관대하고 자식도 예의가 있는 경우: virtual -> override
        }
    }
}
반응형

 

 

아래 글은 C# 상속으로 클래스 확장하기 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 43단원 상속으로 클래스 확장하기 573 ~ 591페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 43. 상속으로 클래스 확장하기]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

 

https://www.youtube.com/watch?v=kkKLpwowinc 

 

 

 

 

 

✳ 상속(Inherits) 한 줄 정의

 

- 부모 클래스에 정의된 기능을 다시 사용, 확장 및 수정하여 자식 클래스로 만들기

 

 

 

 

 

 

✳ 상속 : 부모와 자식

 

 

부모 클래스와 자식 클래스

 

  • 부모 클래스: 수포 클래스, 베이스(base) 클래스, 기본클래스
    - 특정 클래스에게 상속을 부여해 줄 클래스
    - 공통 기능을 모아 놓음
  • 자식 클래스: 서브 클래스, 파생(derived) 클래스
    - 특정 형식에게 상속을 부여 받은 타입

 

 

 

 

 

✳ 예제코드

//[?] 상속(Inheritance): 부모 클래스의 기능을 자식 클래스에서 물려받아 사용
using System;

namespace InheritanceDemo
{
    //[1] 부모 클래스 선언
    class Parent
    {
        public void Foo() => Console.WriteLine("부모 클래스의 멤버 호출");
    }

    //[2] 자식 클래스 선언
    class Child : Parent
    {
        public void Bar() => Console.WriteLine("자식 클래스의 멤버 호출");
    }

    class InheritanceDemo
    {
        static void Main()
        {
            // 자식 클래스의 인스턴스 생성
            var child = new Child();
            child.Foo(); // 부모 클래스의 멤버 호출
            child.Bar(); // 자식 클래스의 멤버 호출
        }
    }
}
반응형

 

 

아래 글은 C# 인덱서(Indexer)와 반복기 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 39단원 인덱서와 반복기 532 ~ 545페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 39. 인덱서와 반복기]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

 

https://www.youtube.com/watch?v=IuCfuPRe6Rk 

 

 

 

 

 

✳ 인덱서와 반복기

 

  • 인덱서(Indexer)
    - 클래스의 인스턴스를 배열처럼 사용할 수 있도록 해주는 구문

  • 반복기(Iterator)
    - 컬렉션의 항목을 단계별로 실행하는 데 사용되는 구문

 

 

 

 

✳ 인덱서(Indexer)

 

 

  • 개체를 배열 형식으로 표현하고자 할 때 사용
    -> 속성의 배열형

  • 배열의 인덱스 접근 방식인 개체명[0], 개체명[1] 식으로 개체의 속성(property)에 접근

  • 자동차 개체를 예를 든다면 자동차 카탈로그(광고지)와 같이
    자동차에 대한 인덱스(목차)를 표현하는 방법과 같은 의미


 

✳ 인덱서(Indexer)와 배열(Array) 비교

 

 

  배열(Array) 인덱서(Indexer)
첨자
(Subscript)
각각의 멤버에 접근할 때 정수형 첨자만을 사용 숫자형이 아닌 첨자 사용 가능, 문자열 첨자로
각각의 멤버에 접근 가능
오버로팅
(Overloading)
자식 클래스에서 오버로드 불가능 자식 클래스에서 오버로드 가능
메서드
파라미터
일반 매개변수 및 ref, out 매개변수 사용 가능 일반 매개변수만 사용가능하고
ref와 out 파라미터는 사용 불가

 

 

 

 

 

 

✳ 예제코드

//[?] 인덱서를 사용하여 여러 값을 주고 받기
using System;

namespace Indexer
{
    class Developer
    {
        private string name;
        // 인덱서 
        public string this[int index]
        {
            get { return name; }    // [index]로 요청시 특정 필드의 값을 반환한다.
            set { name = value; }   // 넘어온 값은 value 키워드로 읽어올 수 있다.
        }
    }

    class Indexer
    {
        static void Main()
        {
            var developers = new Developer();
            developers[0] = "홍길동"; // 인덱스와 상관없이 name 필드에 문자열이 저장된다. 
            Console.WriteLine(developers[0]); // 홍길동
            developers[1] = "백두산";
            Console.WriteLine(developers[1]); // 백두산
        }
    }
}
반응형

 

 

 

아래 글은 C# 메서드와 매개변수 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 37단원 메서드와 매개변수 489 ~ 502페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 37. 메서드와 매개변수]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

 

https://www.youtube.com/watch?v=7XtfWhT4hp0 

 

 

 

 

 

✳ 메서드와 매개변수

 

  • 액세스 한정자 (Accessor)
  • 반환값 (Return Type)
    -> 반환값은 모든 타입(any type)이 될 수 있음
    -> 반환값 없는 경우에는 void
  • 메서드(함수)명 (FunctionName)
  • 매개변수(Parameters)

 

Accessor returnType FunctionName(Parameters)
{
	Code;
}

 

 

 

 

 

✳ 시그니처 : 메서드명과 매개변수 리스트

 

 

  • 시그니처
    - 함수명과 매개변수 리스트
    - 메서드 오버로드의 구분점이 됨

 

 

 

 

✳ 매개변수(파라미터) 전달 기법

 

 

 - 파라미터 전달의 3가지 방법

 

in 입력모드
값에 의한 전달(Pass by value)
ref 입출력 모드
참조에 의한 전달(Pass by reference)
out 출력 모드
Output 매개변수(Output parameters)

 

 

 

 

✳ 값에 의한 전달(Pass by value)

 

  • Call by value
  • 파라미터 전달의 기본 기법
    - 파라미터 값이 복사됨
    - 변수는 메서드 안에서 바뀜
    - 메서드 밖에 있는 값에는 영향을 미치지 않음
    - 파라미터는 반드시 같거나 호환 가능해야 함

 

static void AddOne(int x)
{
	x++;  // 넘어온 값을 1 증가
}

static void Main()
{
	int k = 6;
    AddOne(K);
    Console.WriteLine(k);  // 6 출력, 7로 증가되지 않음
}

 

 

 

 

✳ 참조에 의한 전달(pass by Reference)

 

  • call by reference
  • 참조형 매개변수란?
    - 참조란 메모리 상의 퇴치(포인터)
  • 참조형 매개변수 사용
    - 형식과 변숫값이 맞아야함
    - 호출자에 의해서 원본 데이터에 영향
    - 메서드를 호출하기 전에 매개변수를 초기화해야 함

 

 

✳ oupput 매개변수(output parameters)

 

  • output 매개변수
    - 매개 변수의 값이 메서드 안에서 밖으로 전달
  • output 매개변수 사용
    - 기본적으로 ref 매개변수와 같다.
      -> 그렇지만 값이 메서드 안으로 전달되지는 않음
    - 메서드 선언과 호출 시 out 키워드 사용

 

static void OutDemo(out int p)
{
	// ...
}
int n;
OutDemo(out n);

 

 

 

 

 

✳ 가변형 매개변수 : C#

 

  • params 키워드 사용
  • 값 전달
  • 한번에 여러 개의 매개변수(배열형) 전달 가능

 

 

 

 

 

반응형

아래 글은 C# 소멸자(Destructor) 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 36단원 소멸자 482 ~ 488페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 36. 네임스페이스]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

 

 

https://www.youtube.com/watch?v=Ls88lTcYVkU 

 

 

 

 

✳ 소멸자(Destructor)

 

 

  • 생성자와 반대 개념으로 클래스로부터 인스턴스화된 개체가 메모리 상에서 없어질 때 발생하는 메서드
  • C#에서는 .NET Framework의 GC(Garbage Collector)가 개체 소멸 시 메모리 해제 등의 역할을 대신해 주기
    때문에 직접 접근 할 일은 없음
  • 자동차 시동 끄는 기능으로 비유가 가능하며 운전수가 주차하고 시동 끄는 행위를 진행하는 게 아닌
    주차요원(GC)이 모든 것을 대신 해주는 것과 의미가 같음

 

 

 

✳ 가비지 수집기(Garbage Collector)

 

 

  • 자동차(Car) 개체와 관련하여
    -> 소멸자: 좋은 호텔 앞에서의 주차요원 열학
     => 왜?
       - 키를 받고 알아서 시동을 꺼주니까?
  • 값 형과 참조형의 할당된 자원 관리 비교

 

 

 

 

✳ 개체의 라이프 사이클(Object Life Cycle)

 

 

  • 메모리 할당
    - new 키워드
  • 개체 초기화
    - 생성자(Constructor)에 의한 개체 생성 / 초기화
  • 개체 사용
    - 속성, 메서드 및 기타 멤버 사용
  • 개체 소멸
    - 소멸자에 의한 개체 정리
  • 메모리 반환

 

 

✳ 값 형과 참조형 메모리 자원 관리 비교

 

 

 

  • 값 형(Value Type)
    - Stack에 저장됨
     -> LIFO: 나중에 만들어진 변수부터 먼저 소멸됨
    - 해당 범위(Scope)를 벗어나면 자동으로 소멸됨
    - 메모리 단편화(memory fragmentation)가 없음
  • 참조형(Reference Type)
    - Heapp에 저장됨
      -> FIFO
    - 동일 개체를 여러 번 참조 가능
    - 하나라도 참조하고 있으면 소멸되지 않음
      -> 메모리 단편화(memory fragmentation)의 원인이 될 수 있음
    - 가비지 컬렉터(Garbage Collector)에 의해 관리 됨

 

 

 

 

 

 

 

✳ 예제코드

// 메서드: 동작/행위 : 자동차의 동작/기능
// 생성자(Constructor) 메서드: 클래스에서 제일 먼저 실행, 자동차 조립/시동걸기
// 소멸자(Desctructor) 메서드: 클래스에서 제일 마지막에 실행, 자동차 폐차/시동끄기
using System;

namespace 생성자_메서드_소멸자
{
    public class Car
    {
        // 필드
        private string color;
        // 생성자
        public Car()
        {
            color = "검정";
            Console.WriteLine("{0}색 자동차를 조립합니다.", color);
        }
        public Car(string color)
        {
            this.color = color; // this.필드 = 매개변수;
            Console.WriteLine("{0}색 자동차를 조립합니다.", color);
        }
        // 메서드
        public void Go()
        {
            Console.WriteLine("{0}색 자동차가 달립니다.", color);
        }
        // 소멸자: GC 엔진 알아서 소멸시킴
        ~Car()
        {
            Console.WriteLine("{0}색 자동차를 폐차합니다.", this.color);
        }
    }
    class 생성자_메서드_소멸자
    {
        static void Main()
        {
            // Car 클래스의 인스턴스 생성
            Car car = new Car(); // 생성
            car.Go(); // 호출

            // 폐차: 시점을 알 수 없다. GC 엔진이 알아서 실행

            // 매개변수가 있는 생성자를 호출
            Car whiteCar = new Car("하얀");
            whiteCar.Go();

            Car blueCar = new Car("파랑");
            blueCar.Go();
        }
    }
}
반응형

 

 

 

아래 글은 C# 네임스페이스(namespace) 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 33단원 네임스페이스 452 ~ 459페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 33. 네임스페이스]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

 

 

https://www.youtube.com/watch?v=dRRSGy9Tad8 

 

 

 

✳ 네임스페이스(Namespace)

 

  • 클래스명의 중복 방지 <- 네임스페이스의 가장 큰 사용 이유
  • 클래스를 계층적으로 관리
  • 회사마다 회사명을 Top 네임스페이스로 구성

 

 

 

✳ System 네임스페이스

 

  • System.Console.WriteLine();
    - System 네임스페이스 안에 있는
     -> Console 이름의 클래스 안에 있는
      => WriteLine 이름의 메서드

 

 

✳ 이외 네임스페이스의 사용 이유 및 특성

 

  • 클래스 및 기타 형식(Type)을 구조화
  • 클래스 이름과 기타 형식의 이름이 충돌하지 않도록 방지
  • 표준 namespace는 대부분 System으로 시작
    - System, System.Text, System.Data ....

  • 사용 가이드라인
    - 대문자로 시작: 닷넷의 모든 API는 대문자로 시작
    - 회사명 또는 브랜드 사용

  • 필요하다면 복수형 이름도 상관 없음
    - System.Collections

  • 네임스페이스와 클래스 이름을 동일한 것으로 사용 금지
    - 낫넷 API 탐색기 적극 활용

 

 

 

 

✳ 예제코드

//[?] 네임스페이스: 클래스 등의 사용자 정의 형식의 이름 충돌 방지 및 관련 기능끼리 묶어서 관리
using System;

namespace Foo
{
    public class Car
    {
        public void Go() => Console.WriteLine("[1] Foo 네임스페이스의 Car 클래스 호출");
    }
}

namespace Bar
{
    public class Car
    {
        public void Go() => Console.WriteLine("[2] Bar 네임스페이스의 Car 클래스 호출");
    }
}

class NamespaceNote
{
    static void Main()
    {
        Foo.Car fooCar = new Foo.Car();
        fooCar.Go(); // [1] Foo 네임스페이스의 Car 클래스 호출
        Bar.Car barCar = new Bar.Car();
        barCar.Go(); // [2] Bar 네임스페이스의 Car 클래스 호출
    }
}
반응형

'프로그래밍언어 & 프레임워크 > C#' 카테고리의 다른 글

C# 메서드(Method)와 매개변수(Parameter)  (0) 2021.06.06
C# 소멸자(Destructor)  (0) 2021.06.05
C# 개체(Object) 만들기  (0) 2021.06.03
C# 널(Null)  (0) 2021.06.02
C# 컬렉션(Collection)  (0) 2021.06.01

 

 

아래 글은 C# 개체(Object) 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 32단원 개체 만들기 441 ~ 451페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 32. 개체 만들기]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

https://www.youtube.com/watch?v=N9EgE6bKV_A 

 

 

 

✳ 개체(Object)

 

- 설계도인 클래스로부터 만들어진 하나의 인스턴스(실체, 구성요소)

 

 

 

 

 

✳ 클래스와 개체(Object)

 

 

  • 설계도로부터 만들어진 하나의 개체
  • 설계도로부터 인스턴스화 된 하나ㅏ의 개체를 Object라고 한다.

 

* 개체 생성을 위해서는 클래스에 대한 이해 꼭 필요

 

 

✳ 클래스

 

  • 데이터 보관 관점
    - 하나의 이름으로 여러 개의 데이터 형식을 여러 개 보관해 놓는 그릇 역할에 어떠한 기능 추가해 함께 묶어서 관리

 

 

✳ 클래스의 의미

 

 

  • 현실 세계의 자동차(개체)를 만들어내는 설계도(클래스)의 의미
  • 프로그램 세계의 데이터 저장공간(필드)과 기능(메서드)을 하나의 이름(클래스명 / 개체명)으로 관리
  • 클래스는 관련있는 메서드 및 데이터의 그룹
  • 클래스는 컨테이너(Container) 역할
    -> 클래스의 인스턴스인 개체는 하나의 완성된 단위

 

 

 

✳ 클래스(Class)와 개체(Object)의 비교

 

클래스(Class) 개체(Object)
 - 개체를 생성해 주는 틀  - 어떤 클래스의 인스턴스
 - 개체들의 특성들을 기술  - 개체마다 각각의 상태 보유
 - 개념적, 가상적  - 물리적, 실제적
 - 프로그램 텍스트상에서만 존재  - 실행 시에만 존재
 - 디자인 단계에서의 관심사  - 실행 단계의 관심사

 

 

 

 

 

✳ 개체(Object, 객체)

 

 

  • 클래스의 인스턴스
  • 자동차 설계도: 클래스
  • 만들어진 하나의 자동차: 개체(Object)

 

 

 

✳ 개체(Object) 생성 순서

 

 

 

  1. 메모리 할당
    - 힙(Heap)에 메모리를 할당하기 위해서는 new 키웓드를 사용
    * new: 참조 연산자
  2. 생성자를 통한 개체 초기화
    - 클래스의 이름과 괄호 기호를 사용


    ex) Date 클래스의 인스턴스(실체) 생성 => when 개체 생성
    -> Date when = new Date();

 

 

 

✳ 개체(Object) 라이프사이클

 

  • 개체 생성 시기
    - new 연산자를 이용한 메모리를 할당하고 개체를 생성
    - 생성자를 이용해 메모리 상의 개체 초기화
  • 개체 사용 시기
    - 개체에 대한 메서드, 멤버 호출 / 접근
  • 개체 소멸 시기
    - 개체에게 할당된 메모리는 실행 환경으로 회수
    - 메모리 해제
    - 소멸 시기가 비결정적임
    - Garbage Collector(GC)가 개체 소멸을 관장한다.

 

 

✳ 클래스(Class) 라이프 사이클

 

 

  • 할당(Allocation)
    - Managed heap 메모리 공간에 CLR에 의해서 개체를 위한 메모리 할당
  • 인스턴스화(Instantiation)
    - 클래스의 구조에 맞게 메모리 초기화
    - 클래스의 생성자(Constructor)가 호출 됨

  • 해제(Deallocation)
    - 가비지 수집기 (Garbage Collector)가 사용되지 않는 개체를 소멸
    - 경우에 따라서는 IDisposable 인터페이스를 구현하여 Dispose 메서드를 구현 할 수 있음

 

 

✳ 정적(Static) 멤버와 인스턴스(Instance) 멤버

 

 

  • 정적(Static) 멤버: Static 키워드가 붙은 멤버
    - 정적 필드
    - 정적 메서드
    - 접근
    ex) "클래스명.멤버명"
  • 인스턴스 멤버
    - 클래스내에서 Statiic 키워드가 붙지 않은 멤버
    - 클래스의 인스턴스 생성 후 멤버에 접근
    - Static 키워드 제거
    - 접근
      -> 클래스 개체 = new 클래스();
      -> "개체.멤버명"

 

 

✳ 클래스(Class)

 

  • 데이터(멤버 변수; 필드)와 메서드(기능; 함수)를 결합

  • 접근 권한의 통제
    - 메서드는 public, 외부로부터 접근이 가능
    - 데이터(멤버)는 public, protected, interval, private
  • 상속(Inheritance)
    - 상속은 클래스간의 관계
    - 기존의 클래스를 상속 받아 새로운 클래스를 만든다.
    - 단일 상속 및 다중상속 가능(Interface에 의해)

  • 인터페이스(Interface)
    - 단지 operation 만으로 구성되어져 있음
    - 실제 구현을 가지지 않음

 

 

 

 

 

✳ 개체생성 예제코드

using System;

namespace 개체
{
    //[1] 클래스 생성
    public class MyClass
    {
        public void MyMember()
        {
            Console.WriteLine("클래스의 인스턴스인 개체가 실행됩니다.");
        }
    }

    public class 개체
    {
        public static void Main()
        {
            //[2][1] 클래스 사용: 클래스의 인스턴스를 생성해서 개체를 만든다.
            MyClass my = new MyClass();
            //[2][2] 개체(인스턴스)명.멤버명으로 클래스의 멤버를 호출
            my.MyMember();
        }
    }
}
반응형

'프로그래밍언어 & 프레임워크 > C#' 카테고리의 다른 글

C# 소멸자(Destructor)  (0) 2021.06.05
C# 네임스페이스(Namespace)  (0) 2021.06.04
C# 널(Null)  (0) 2021.06.02
C# 컬렉션(Collection)  (0) 2021.06.01
C# 제네릭(Generic) 사용하기  (0) 2021.05.31

아래 글은 C# 널(Null) 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

 

📃 참고자료

 

  • C# 교과서(길벗 출판사) - 29단원 널(null) 다루기 382 ~ 389페이지
  • 유튜브 채널 VisualAcademy [C# 교과서 마스터하기 29. 널(null) 다루기]
  • 닷넷코리아 (https://www.dotnetkorea.com/)

 

 

 

 

https://www.youtube.com/watch?v=yj-mCQv8C94 

 

 

 

✳ 널(null) 한 줄 정의

 

 

- 아무것도 없음을 의미하는 리터럴, 개체가 아무것도 참조하지 않음을 null참조라 합니다.

 

 

 

 

✳ 널(null)과 널 참조 예제코드

using static System.Console;

class NullDemo
{
    static void Main()
    {
        int i = 0;              // 값형(Value Type)
        string s = null;        // 참조형(Reference Type)
        s = "안녕하세요.";
        string empty = "";      // 빈값(Empty)은 null과는 다름

        WriteLine(i);           // 0
        WriteLine(s);           // null -> "안녕하세요."
        WriteLine(empty);       // ""
    }
}

 

- 참조(Reference)형식은 C언어 포인터와 비슷합니다.

 

* null: 아무런 가치가 없음. 참조형 변수에 아무런 값을 설정하지 않습니다.

 

 

 

 

✳ 이외 다양한 예제코드가 있는 링크

 

https://github.com/gilbutITbook/006890/tree/master/DotNet/DotNet/29_Null

 

gilbutITbook/006890

C# 교과서. Contribute to gilbutITbook/006890 development by creating an account on GitHub.

github.com

 

 

  • Nullable<T> 구조체
  • ?. 연산자
  • ?? 연산자[널 병합 연산자(Null Coalescing Operator)]

 

 

링크에서 위 3가지 외에도 다양한 예제코드가 설명가 함께 담겨 있습니다.

반응형

'프로그래밍언어 & 프레임워크 > C#' 카테고리의 다른 글

C# 네임스페이스(Namespace)  (0) 2021.06.04
C# 개체(Object) 만들기  (0) 2021.06.03
C# 컬렉션(Collection)  (0) 2021.06.01
C# 제네릭(Generic) 사용하기  (0) 2021.05.31
C# 문자열(String) 다루기  (0) 2021.05.27

+ Recent posts