반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발꿈나무

[C# 교과서] 15. C# 활용(9) - 개체 만들기 본문

C# 기초

[C# 교과서] 15. C# 활용(9) - 개체 만들기

HYOKYE0NG 2022. 1. 19. 08:45
반응형
개체 만들기

 

개체(오브젝트)는 설계도인 클래스에서 만든 인스턴스(실체, 구성 요소) 하나를 의미

 

클래스와 개체

class 키워드로 생성한 것을 클래스라고 하며, 이러한 클래스를 new 키워드를 사용하여 새로운 이름으로 만든 것을 개체라고 한다.

using System;

//[1] ClassCode 이름의 클래스(Class) 만들기
public class ClassCode
{
    // Empty
}

class ClassAndObject
{
    static void Main()
    {
        //[2] 특정 클래스로부터 objectCode1, objectCode2 이름의 개체(Object) 만들기
        ClassCode objectCode1 = new ClassCode();
        Console.WriteLine(objectCode1.GetHashCode());
        var objectCode2 = new ClassCode();
        Console.WriteLine(objectCode2.GetHashCode());
    }
}

objectCode1과 objectCode2 변수는 개체이다.

사용하는 클래스는 ClassCode로 동일하지만, 이 클래스로 만든 개체들은 서로 다른 인스턴스이다.

모든 개체는 GetHashCode() 메서드를 호출하여 고유의 키 값을 제공받을 수 있다.

 

 

 

클래스의 인스턴스인 개체 생성하기

using System;

namespace ObjectNote
{
    //[1] 클래스 생성
    public class Counter
    {
        //[2] 메서드(인스턴스 멤버) 생성
        public void GetTodayVisitCount()
        {
            Console.WriteLine("오늘 1234명이 접속했습니다.");
        }
    }
    class ObjectNote
    {
        static void Main()
        {
            //[A] 클래스의 인스턴스 생성
            Counter counter = new Counter();
            //[B] 개체(인스턴스)이름.멤버이름으로 클래스의 멤버 호출
            counter.GetTodayVisitCount();
        }
    }
}

[1] 클래스를 생성할 때 정적 멤버와 인스턴스 멤버를 원하는 만큼 만들 수 있다.

[2] static이 빠진 형태로 메서드를 만들어 인스턴스 멤버인 인스턴스 메서드를 만들었다. 인스턴스 멤버의 경우

new 키워드를 사용하여 클래서의 인스턴스를 생성한 수 인스턴스.멤버; 형태로 호출해야 한다.

 

 

인스턴스 메서드

  • 클래스 내에 선언된 메서드 중에서 static 키워드가 붙지 않은 메서드를 인스턴스 메서드라고 한다.
  • 인스턴스 메서드를 호출하려면 new 키워드를 사용하여 클래스의 인스턴스를 생성하여 개체를 만들어야 한다.
using System;

namespace ClassMethod
{
    public class MyMath
    {
        //[1] 인스턴스 메서드 생성
        public void Sum(int x, int y)
        {
            int sum = x + y;
            Console.WriteLine($"합계: {sum}");
        }
    }

    public class ClassMethod
    {
        public static void Main()
        {
            //[2] MyMath 클래스의 인스턴스 생성
            MyMath myMath = new MyMath();
            //[3] 개체.인스턴스메서드이름 형태로 호출
            myMath.Sum(3, 5);
        }
    }
}

 

 

익명 형식

클래스를 선언하지 않고 개체를 만드는 방법을 익명 형식(anonymous type)이라고 한다.

using System;

class ObjectDemo
{
    static void Main()
    {
        //[1] 개체(Object) 만들기: 익명 형식(Anonymous Type)
        var hong = new { Name = "홍길동", Age = 21 };
        var park = new { Name = "박문수", Age = 30 };

        //[2] 개체 사용하기
        Console.WriteLine($"이름: {hong.Name}, 나이: {hong.Age}");
        Console.WriteLine($"이름: {park.Name}, 나이: {park.Age}");
    }
}

 

 

정적 멤버와 인스턴스 멤버

  • 정적 멤버: static 키워드를 붙임, 호출방법: 클래스이름.멤버이름;
  • 인스턴스 멤버: static 키워드를 붙이지 않음, 호출방법: new 키워드로 인스턴스 생성 후 인스턴스이름.멤버이름;
using System;

namespace StaticAndInstance
{
    //[1] 클래스 생성
    class SharedAndInstance
    {
        //[1][1] static(shared) 멤버
        public static void StaticMember() => Console.WriteLine("[1] Static Member");

        //[1][2] instance 멤버
        public void InstanceMember() => Console.WriteLine("[2] Instance Member");
    }

    class StaticAndInstance
    {
        static void Main()
        {
            //[2] 클래스 사용
            //[2][1] 정적 멤버 사용
            SharedAndInstance.StaticMember(); // 정적 멤버 => 클래스.멤버 형태

            //[2][2] 인스턴스 멤버 사용
            SharedAndInstance obj = new SharedAndInstance();
            obj.InstanceMember(); // 인스턴스 멤버 => 개체.멤버 형태
        }
    }
}

 

 

프로젝트에 클래스를 여러 개 사용하기

// ClassDemo 프로젝트 내의 ClassDemo.cs 파일
class ClassDemo
{
    static void Main()
    {
        //[!] 다른 클래스의 멤버 호출
        //[a] 스태틱 멤버 호출
        ClassOne.Hi();  // "안녕하세요." 출력
        ClassTwo.Hi();  // "반갑습니다." 출력

        //[b] 인스턴스 멤버 호출: 클래스의 인스턴스 생성 => 개체(객체)
        ClassTwo ct = new ClassTwo();
        ct.Hello();     // "또 만나요." 출력
    }
}


// ClassDemo 프로젝트 내의 ClassOne.cs 파일
using System;

//[1] ClassOne 클래스
public class ClassOne
{
    // 정적(static) 메서드: 클래스명.메서드명();
    public static void Hi()
    {
        Console.WriteLine("안녕하세요.");
    }
}


// ClassDemo 프로젝트 내의 ClassTwo.cs 파일
using System;

//[2] ClassTwo 클래스
public class ClassTwo
{
    // 정적(static) 멤버
    public static void Hi()
    {
        Console.WriteLine("반갑습니다.");
    }

    // 인스턴스(instance) 멤버: static 없는 인스턴스 메서드
    public void Hello()
    {
        Console.WriteLine("또 만나요.");
    }
}

 

 

ToString() 메서드 오버라이드

메서드의 기능을 재정의 하는 것을 메서드 오버라이드라고 한다.

using System;

namespace ToStringMethod
{
    class My { }

    class Your
    {
        //[!] ToString() 메서드를 다시 정의하여 새로운 문자열 출력
        public override string ToString()
        {
            return "새로운 반환 문자열 지정";
        }
    }

    class ToStringMethod
    {
        static void Main()
        {
            My my = new My();
            Console.WriteLine(my); // "My": 개체를 출력하면 기본은 클래스 이름이 출력

            Your your = new Your();
            Console.WriteLine(your); // "새로운 반환 문자열 지정"
        }
    }
}

기존의 ToString() 메서드는 변수 형식을 string으로 바꿔주는 기능을 했지만

오버라이드된 ToString() 메서드는 "새로운 반환 문자열 지정"이라는 문자열을 반환한다.

 

 

클래스 배열

클래스도 데이터 형식의 하나이므로 배열처럼 사용할 수 있다.

using System;

public class CategoryClass
{
    public void Print(int i) => Console.WriteLine($"카테고리 {i}");
}

class ClassArray
{
    static void Main()
    {
        //[1] 클래스 배열 생성
        CategoryClass[] categories = new CategoryClass[3];

        //[2] 각각의 요소에 인스턴스 생성
        categories[0] = new CategoryClass();
        categories[1] = new CategoryClass();
        categories[2] = new CategoryClass();

        for (int i = 0; i < categories.Length; i++)
        {
            categories[i].Print(i);
        }
    }
}

 

 

 

 

<Reference>

 

반응형
Comments