스파르타 게임개발종합반(Unity)/기술 면접 대비 꾸준 실습

01. 객체와 한정자

테크러너 2024. 7. 1.

확인 문제

using System;

public class Car
{
    // 속성
    public string Make { get; set; }
    public string Model { get; set; }
    public int Year { get; set; }

    // 메서드
    public void DisplayInfo()
    {
        Console.WriteLine($"Car Make: {Make}, Model: {Model}, Year: {Year}");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Car car1 = new Car();
        car1.Make = "Genesis";
        car1.Model = "G70";
        car1.Year = 2020;
        car1.DisplayInfo();

        Car car2 = new Car();
        car2.Make = "Hyundai";
        car2.Model = "Sonata";
        car2.Year = 2022;
        car2.DisplayInfo();
    }
}

1. 위 예제 코드에서 `Car`는 무엇을 나타내나요? `car1`과 `car2`는 무엇을 나타내나요?

답변 : Car는 비유하자면 공장입니다. 다양한 종류의 car 객체들을 찍어냅니다. 그런 공장에서 다른 종류의 car1과 car2가 생산됩니다. 객체지향 프로그래밍에서 Car는 클래스, car1과 car2는 인스턴스라고 합니다.

 

2. 위 코드에서 `Car` 클래스에 정의된 메서드를 호출할 때 `car1`과 `car2`를 사용해야 하는 이유는 무엇인가요?

답변 : 메서드의 내용을 보면 Car를 만든 회사, 모델, 연식의 정보를 출력합니다. car1과 car2는 서로 다른 자동차 객체이기 때문에 각자의 정보로 출력해야 합니다.

 

3. 위 코드에 어떤 메서드를 추가하고 아래와 같이 사용했습니다. `SomeMethod`에는 `static` 한정자가 붙어있을까요? 그 이유는 무엇인가요?

Car.SomeMethod();

답변 : 해당 메서드는 인스턴스를 생성하지 않고도 호출했습니다. 이는 static 한정자가 붙어있어야 가능합니다.

 

 

설명 문제

1. 객체란 무엇인가요? 클래스와 어떤 연관이 있나요?

답변 : 객체는 실세계의 사물을 표현한 것입니다. 그리고 객체는 속성과 메서드를 가집니다. 속성은 데이터나 상태 등을 의미하고, 메서드는 객체가 수행할 수 있는 동작이나 기능을 의미합니다.
클래스는 이러한 객체를 생성하기 위한 틀입니다. 객체는 클래스를 기반으로 생성되는 인스턴스입니다.

 

2. 생성자에 대해 간단하게 설명해주세요.

답변 : 생성자는 인스턴스가 생성될 때 호출되는 특별한 메서드입니다. 주로 객체가 생성될 때 초기화 작업을 수행합니다. 생성자의 이름은 클래스의 이름과 동일하고, 반환 타입을 가지지 않습니다. 또한, 오버로딩이 가능합니다. 오버라이딩은 안됩니다.

 

3. 접근제한자란 무엇이며, 각각 어떤 차이가 있는지 비교해서 설명해주세요.

답변 : 접근제한자는 클래스, 메서드, 필드 등에 대한 접근 권한을 제어하는 데 사용되는 키워드입니다. 객체 지향 프로그래밍에서 캡슐화를 하기 위해 사용됩니다.
주요 접근 제한자는 public, private, protected, internal 등이 있습니다.

 

4. `static` 한정자에 대해 설명해주세요.

답변 : static 한정자는 클래스, 메서드, 필드 등에 적용될 수 있는 키워드로, 해당 멤버가 클래스의 인스턴스가 아닌 클래스 자체에 속하게 만듭니다. 그래서 인스턴스를 생성하지 않고도 접근할 수 있고, 모든 인스턴스가 static 멤버를 공유합니다.

 

static이 편하다고 생각되겠지만 static을 남발하면 문제점이 있습니다. static 멤버는 인스턴스에 종속되지 않고 클래스 자체에 속하기 때문에 객체지향적 설계 원칙을 위반하게 됩니다. 또한 프로그램 시작 시 메모리에 할당되어 계속 상주하기 때문에 메모리 관리가 어려워져서 메모리 사용 비효율성과 성능 저하 현상이 나타날 수 있습니다.

 

 

실습 문제

💡 [현재까지 생성된 Item의 개수를 추적해보기]

생성자를 통해 아이템을 생성할 때마다, 지금까지 생성된 아이템의 개수를 따로 저장하는 변수를 Item에 만들고 싶습니다.

Item : 아이템의 정보를 저장하는 클래스

using System;

namespace StaticFieldPractice
{
    public class Item
    {
        // TODO: Item의 개수를 저장하는 static 필드 선언 //
        
        //

        public string Name { get; set; }

        // 생성자 함수
        public Item(string name)
        {
            this.Name = name;
            // TODO: static 필드 값을 증가시키기 //
            
            // ******************************** //
        }

        
        public static int GetItemCount()
        {
            // 현재까지 생성된 Item 개수를 반환  //
            
            // ******************************** //
        }
    }

    class Program
    static void Main(string[] args)
        {
            // Item 인스턴스 생성
            Item item1 = new Item("Item1");
            Item item2 = new Item("Item2");

            // 생성된 Item 개수 출력
            Console.WriteLine("Total Items Created: " + Item.GetItemCount());
        }
    }
}

 

답변▼

더보기

메인에서 Item 개수를 메서드로 접근하기 때문에 itemCount는 private로 선언했음.

using System;

namespace StaticFieldPractice
{
    public class Item
    {
        // TODO: Item의 개수를 저장하는 static 필드 선언 //
        private static int itemCount;
        //

        public string Name { get; set; }

        // 생성자 함수
        public Item(string name)
        {
            this.Name = name;
            // TODO: static 필드 값을 증가시키기 //
            itemCount++;
            // ******************************** //
        }


        public static int GetItemCount()
        {
            // 현재까지 생성된 Item 개수를 반환  //
            return itemCount;
            // ******************************** //
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Item 인스턴스 생성
            Item item1 = new Item("Item1");
            Item item2 = new Item("Item2");

            // 생성된 Item 개수 출력
            Console.WriteLine("Total Items Created: " + Item.GetItemCount());
        }
    }
}
반응형

댓글