내일배움캠프 52일차 TIL - 객체와 한정자

권태하·2024년 7월 1일
0
post-thumbnail

확인 문제

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는 Make, Model, Year라는 필드값들과 DisplayInfo라는 메서드를 가지고 있는 Class를 나타냅니다.
car1과 car2는 Car클래스를 만들어 참조한 형태로 새로 만들어진 Car클래스에 접속하기 위한 참조값입니다.

모범 답:
이 코드에서 'Car' 클래스는 자동차의 정보를 나타내는 객체입니다.

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

내 답:
Car 클래스에 정의된 메서드를 사용하기 위해선 만들어진 Car 클래스에 접속하기 위한 참조값이 필요합니다. car1과 car2는 각각 다른 참조값을 알려주는 것입니다.

모범 답:
'car1'과 'car2'는 'Car' 클래스의 인스턴스이기 때문입니다. 클래스는 객체를 생성하기 위한 설계도나 틀이고, 실제로 작업을 수행하기 위해서는 이 틀을 기반으로 생성된 구체적인 인스턴스가 필요하다고 생각합니다.

3. 위 코드에 어떤 메서드를 추가하고 아래와 같이 사용했습니다.

Car.SomeMethod();

SomeMethod에는 static 한정자가 붙어있을까요? 그 이유는 무엇인가요?

내 답:
네 붙어있습니다. 참조값 없이 사용된 Car Class의 메서드이기 때문에 정적 메모리에 올려둔 상태라는 것을 추측할 수 있습니다.

모범 답:
네 붙습니다, 'Car.SomeMethod()'와 같이 클래스 이름을 통해 직접 호출되는 메서드에는 'static' 한정자가 붙어야합니다.
그 이유는 'static' 메서드는 클래스 자체에 속하며, 인스턴스가 아닌 클래스 이름을 통해 호출되기 때문입니다.

설명 문제

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

내 답:
객체는 실제 세계의 사물이나 개념을 모델링 한 것으로써 상태와 행동을 가집니다. 이를 속성과 메서드로 표현합니다.
클래스는 객체를 생성하기 위한 설계도로써, 어떠한 객체가 가지고 있을 속성과 메서드를 정의합니다.
즉, 클래스는 객체의 구조와 기능을 정의하고, 객체는 그 클래스의 실체가 됩니다.

모범 답:

  • 객체 : 설명할 때 인스턴스라는 단어가 꼭 들어가면 좋습니다.
    인스턴스마다 각자의 상태와 행동을 가지는데, 상태는 필드 & 행동은 메서드로 표현된다고 언급해주면 정확합니다.
  • 클래스 : 객체와 비교할 때는 클래스 vs 클래스의 인스턴스가 가지는 차이를 중점적으로 비교하여 이야기하면 좋습니다.

객체는 클래스의 인스턴스로, 실제로 메모리에 할당되어 동작하는 실체입니다. 객체는 클래스에서 정의된 속성과 메서드를 가지고 있습니다.
클래스는 객체를 생성하기 위한 설계도 같은 것입니다. 객체는 이 클래스를 기반으로 생성된 인스턴스입니다.

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

내 답:
생성자는 객체가 생성될 때 자동으로 호출되는 특별한 메서드입니다. 주요 목적은 객체를 초기화하는 것 입니다.

모범 답:

  • 설명은 객체를 초기화한다라는 것만 언급해주면 충분합니다.
  • C#은 생성자를 따로 구현하지 않아도 매개변수가 없는 기본 생성자를 사용할 수 있지만, 하나라도 생성자를 직접 구현하는 경우 이러한 기본 생성자의 지원이 중단된다는 것을 알고 있으면 좋습니다.
  • 생성자 구현에 대해, 추가적으로 오버로딩을 언급하여 여러 매개변수를 지원하는 생성자를 구현할 수 있다고 언급해주시면 좋습니다.

생성자는 클래스의 인스턴스가 생성될 때 호출되며, 객체를 초기화하는 데 사용됩니다.
이름은 클래스 이름과 같습니다.
매개변수를 다르게 하여 여러 개를 정의할 수 있습니다.
기본 생성자가 자동으로 제공되며, 필요에 따라 명시적으로 정의할 수 있습니다.

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

내 답:
접근제한자는 클래스 외부에서 접근하여 사용가능할지에 대해 정의해줍니다.
private - 클래스 외부에서 접근 불가능합니다.
public - 클래스 외부에서 접근 가능합니다.
protected - 클래스 내부와 클래스를 상속받은 자식 클래스에서 접근 가능합니다. 외부에서는 접근 불가능 합니다.

모범 답:

  • public, protected, private의 보호 수준의 차이를 비교하여 설명하면 좋습니다. internal의 경우 간단하게 언급하고 넘어가는 정도면 충분합니다.
  • protected와 private을 사용하는 이유에 대해 캡슐화은닉성을 같이 언급하여 설명해주시면 좋습니다.

public : 모든 곳에서 접근 가능
private : 같은 클래스 내부에서만 접근 가능
protected : 같은 클래스와 파생 클래스 내에서 접근 가능

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

내 답:
static 한정자가 붙은 필드, 메서드, 프로퍼티 또는 이벤트가 객체가 아닌 클래스 자체에 속함을 나타냅니다. static으로 선언된 멤버는 클래스 객체를 생성하지 않고도 직접 접근할 수 있습니다.

모범 답:

  • 클래스 수준 멤버라고 설명합시다.
  • 인스턴스와 독립적이기 때문에, 인스턴스가 여러 가지더라도 멤버를 저장하기 위한 메모리는 단 한 공간만 필요하다고 설명해주시면 좋습니다.

'static' 한정자는 클래스의 변수, 메서드, 속성이 클래스 자체에 속하도록 지정하는 것입니다.

실습 문제

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

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

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

namespace StaticFieldPractice
{
    public class Item
    {
        // TODO: Item의 개수를 저장하는 static 필드 선언 //
        public 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());
        }
    }
}
profile
스터디 로그

0개의 댓글

관련 채용 정보