인스턴스 멤버는 클래스 안에서는 자유롭게 사용할 수 있지만,
실제로 사용하려면 인스턴스를 만든 후에 접근해야 한다.
static을 붙인 것이 정적 멤버.
인스턴스 생성 없이 바로 사용 가능하다.
| 특징 | Mesh Renderer | Skinned Mesh Renderer |
|---|---|---|
| 사용 목적 | 정적인 오브젝트 | 동적인 애니메이션 오브젝트 |
| 변형 가능성 | 정점(Vertex) 고정 | 본(Bone) 애니메이션으로 변형 가능 |
| 성능 | 가벼움 (GPU 부하 적음) | 무거움 (실시간 연산 필요) |
| 호환성 | 대부분의 셰이더와 호환 가능 | 본과 정점 변형을 처리하는 셰이더 필요 |
| 데이터 구조 | 기본 메시 | 본(Bones), 정점 가중치(Weights) 포함 |
본 데이터 처리 문제:
정점 변형과 셰이더:
성능 최적화:
클래스 : class 키워드로 생성한 것
개체 : 클래스를 new 키워드를 사용해서 새로운 이름으로 만든 것
class ObjectNote
{
public class Counter
{
public void GetTodayVisitCount()
{
Console.WriteLine("오늘 1234명이 접속");
}
}
class Object
{
static void Main()
{
Counter counter = new Counter();
counter.GetTodayVisitCount();
}
}
}
인스턴스 메서드 : static 키워드가 붙지 않은 메서드. 호출하려면 클래스의 인스턴스를 생성하여 개체를 만들어야 한다.
public class MyMath
{
public void Sum(int x, int y)
{
int sum = x + y;
Console.WriteLine($"합계 : {sum}");
}
}
> MyMath myMath = new MyMath();
> myMath.Sum(3,5);
합계 : 8
익명 형식 : 클래스를 선언하지 않고 개체 만들기. 특정 클래스 없이 이름 하나로 여러 속성을 모아 관리할 때 유용하다. 익명 형식을 만들 때 각 데이터 형식은 자동으로 유추해서 만든다.
> var hong = new { Name = "백승수", Age = 21 };
> $"이름 : {hong.Name}, 나이 : {hong.Age}"
"이름 : 백승수, 나이 : 21"
static 키워드가 붙은 멤버(정적 멤버)에 접근할 땐 클래스이름.멤버이름; 형태로 접근하고,
안 붙은 멤버(인스턴스 멤버)에 접근할 땐 클래스의 인스턴스를 생성하고 생성된 개체 이름.멤버이름; 형태로 접근한다.
static이 붙으면 클래스 내의 여러 메서드에서 해당 클래스 변수를 공유해서 사용할 수 있다.
using System;
class My { }
class Your
{
public override string ToString()
{
return "새로운 반환 문자열 지정";
}
class ToStringMethod
{
static void Main()
{
My my = new My();
Console.WriteLine(my);
Your your = new Your();
Console.WriteLine(your);
}
}
}
1. 클래스 선언
class My { }
My 클래스는 아무 멤버도 없는 단순한 클래스입니다.ToString() 메서드를 재정의하지 않았기 때문에 기본 구현이 사용됩니다.2. Your 클래스와 ToString() 재정의
class Your
{
public override string ToString()
{
return "새로운 반환 문자열 지정";
}
}
Your 클래스는 ToString() 메서드를 override하여 기본 동작을 변경했습니다.Your 객체를 문자열로 변환하려고 하면, "새로운 반환 문자열 지정"이 출력됩니다.Main() 메서드에서 두 개의 객체를 생성합니다:My 클래스 객체: 기본 ToString() 구현을 사용.Your 클래스 객체: ToString() 메서드를 재정의했으므로 재정의된 동작을 사용.Console.WriteLine()은 객체를 문자열로 출력하려고 할 때 ToString() 메서드를 호출합니다.클래스의 인스턴스들도 배열에 넣을 수 있다.
자료형 var로 하면 선언부 줄일 수 있다.
닷넷은 System, System.Linq, System.Generic 등 많은 네임스페이스를 제공한다.
namespace 네임스페이스이름
{
// 클래스 등의 정의가 들어옴
}
네임스페이스는 프로그램 규모가 커질 때 클래스 이름이 충돌하는 것을 방지하도록 클래스를 모아서 관리하는 개념이다.
네임스페이스를 달리하면 이름이 동일한 클래스를 하나의 프로젝트에서 사용할 수 있다.
namespace AllCar
{
namespace MyCar {}
namespace YourCar {}
}
네임스페이스는 중첩하여 사용할 수 있다.
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();
Bar.Car barCar = new Bar.Car();
barCar.Go();
}
}
사용 예제. 실제로 프로그램을 만들 땐 각 클래스를 다른 파일로 관리하는게 좋다.
네임스페이스 사용하려면 using으로 선언해놔야됨.
using System;
using MyNamespace;
using AllCar.MyCar; // 계층형 네임스페이스
using Fe = AllCar.Ferrari; // 별칭 붙이기
필드: 클래스 내에서 선언된 변수 또는 배열.
클래스 내에 선언된 필드는 자동으로 해당 형식의 기본값으로 초기화된다.
액세스 한정자의 종류