객체
객체란 클래스에서 정의한 것을 토대로 메모리에 할당된 실체(인스턴스)이다.
클래스란? 멤버 변수와 메서드를 가지고 있는 틀
인스턴스란? 소프트웨어 세계에 구현된 실체
생성자
생성자란 객체가 생성될 때 호출되는 초기화 메서드이다.
- 생성자의 이름은 클래스의 이름과 같다
- 생성자는 public으로 정의되어야 하며 리턴값이 없다.
- 아래는 승도님 예시
using System;
using UnityEngine;
public class Character
{
// static, 접근 제한자
public static int Num { get; private set; }
public string Name { get; private set; }
public Character(string name) // 생성자
{
this.Name = name;
Num++;
}
}
public class Test : MonoBehaviour
{
private void Start()
{
// 객체 생성
Character deff = new Character("Deff");
Character dev = new Character("Dev");
Debug.Log(deff.Name); // Deff
Debug.Log(dev.Name); // Dev
Debug.Log(Character.Num); // static 접근 => 2 출력
}
}
접근제한자
접근제한자는 클래스, 필드, 메서드 등의 접근 가능한 범위를 지정해주는 변수이다.
접근제한자를 활용하여 객체 지향 프로그래밍에서의 캡슐화를 진행할 수 있다.
종류는 다음과 같다.
- public : 어디서든 접근 가능
- internal : 동일 어셈블리 내에서 접근 가능
- private : 클래스 내부에서만 접근 가능
- protected : 클래스 내부 & 자식 클래서에서 접근 간으
- protected internal : 어셈블리 외부에서는 protected, 내부에서는 internal로 동작
- private protected : 동일 어셈블리 내의 상속받은 클래스에서만 접근 가능
[C#] Internal Class
비주얼 스튜디오를 사용하면서 궁금증이 생겼다. 새 스크립트를 생성하면 Program 클래스가 다음과 같이 internal class 로 생성이 된다.직접 코드를 작성할 때엔 public이나 private로 선언하여 쓰는
jeongeunji1127.tistory.com
한정자
한정자는 클래스나 인터페이스, 메서드 등을 선언할 때 구성요소들의 성격을 결정하는 키워드이다.
메서드를 예시로 보자
메서드는 [접근제한자] [한정자] [리턴 타입] [메서드 명] 다음과 같이 선언된다.
이 때 한정자가 static, const, readonly인지, abstract,virtual, override인지 등에 따라 해당 메서드의 성격이 바뀐다.
- static
-> 클래스의 인스턴스를 생성하지 않고 이름을 통해서 직접 접근이 가능
-> 어떤 인스턴스에서 static 멤버를 수정하면 모든 인스턴스에 반영됨
-> 메모리 영역에 저장되어 프로그램이 종료될 때까지 메모리 상에 남아있음
-> 많이 사용하면 프로그램 성능에 문제가 된다
- const: 상수 변수를 정의할 때 사용. 초기화 시에만 값을 할당할 수 있다.
- readonly: 선언 시 또는 생성자 내에서만 값을 할당할 수 있는 필드. 재정의할 수 없다.
- abstract: 구현이 없으며 자식 클래스에서 구현해야 하는 멤버 선언.
- virtual: 자식 클래스에서 재정의할 수 있는 메서드.
- override: 부모 클래스의 virtual 또는 abstract 멤버를 재정의.
- sealed: 자식 클래스에서 더 이상 재정의할 수 없게 하는 메서드.
예시
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 클래스는 "차"라는 추상적인 개념을 구성하는 클래스이다.
모든 차는 제조사(Make), 모델 명 (Model) , 제작 연도 (Year) ,
그리고 이 정도들을 콘솔창에 띄어줄 메서드 DisplayInfo를 가지고 있다.
Car 클래스를 통해 새로운 객체를 생성하면, 생성된 객체들은 Car 클래스에서 정의한 속성과 메서드를 가지고 있게 된다.
car1과 car2는 Car 클래스로부터 생성된 새로운 객체이고
각각 제네시스와 현대 차를 정의하고 있다.
2. 위 코드에서 car1.DisplayInfo()와 car2.DisplayInfo() 부분을 보자.
같은 메서드를 실행하지만 각각 다른 객체로부터 정의된 메서드기 때문에
메서드 호출 시 다른 결과가 나온다.
car1.DisplayInfo() -> Car Make : Genesis, Model : G70, Year : 2020
car2.DisplayInfo() -> Car Make : Hyundai, Model : Sonata, Year : 2022
-> 클래스의 경우 값 타입이 아닌 참조형 타입이라
메모리 공간을 할당 받기 전에는 해당 클래스에 있는 내용에 접근할 수 없다!
3. 만약 위 코드에 어떠한 메서드를 추가하고 아래와 같이 사용한다고 생각해보자.
Car.SomeMethod();
이 SomeMethod에는 static 한정자가 붙어 있을 까?
정답은 "사용한다"이다.
Program 클래스에서 메서드를 호출하는 부분은
static void Main(string[] args){}
다음과 같이 static으로 선언되어있다.
따라서 Program 클래스 외부의 클래스인 Car에 정의된 SomeMethod를 호출하려면
SomeMethod 메서드에 static 한정자가 붙어있어야 한다.
'Study > 개념 정리' 카테고리의 다른 글
[Study] 콜백, delegate, event (0) | 2024.07.03 |
---|---|
[Study] 객체지향 프로그래밍 (0) | 2024.07.02 |
[Study] 응집도 & 결합도 (0) | 2024.05.27 |
[Study] 동기 & 비동기 (0) | 2024.05.27 |
[Study] 아크탄젠트 (0) | 2024.05.08 |