개발꿈나무
[C# 교과서] 16. C# 활용(10) - 네임스페이스, 필드 본문
네임스페이스
네임스페이스
- 네임스페이스는 프로그램 규모가 커질 때 클래스 이름이 충돌하는 것을 방지하도록 클래스를 모아서 관리하는 개념
- 인터넷 도메인 주소를 사용하여 웹사이트를 구분하듯, 네임스페이스를 달리하여 이름이 동일한 클래스를 하나의 프로젝트에서 사용할 수 있게 할 수 있다.
네입스페이스의 특징
- 서로 관련 있는 클래서, 구조체, 열거형 등의 형식과 또 다른 네임스페이스 등을 묶어 관리해주는 개념
- 클래스 이름이 중복되는 것을 방지
- 클래스를 계층형으로 묶어 관리 가능
- 네임스페이스는 패키지란 단어와 의미가 비슷하며, 관련 있는 형식의 묶음
네임스페이스 만들기
namespace 네임스페이스이름
{
//클래스 등의 정의가 들어옴
}
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(); // [1] Foo 네임스페이스의 Car 클래스 호출
Bar.Car barCar = new Bar.Car();
barCar.Go(); // [2] Bar 네임스페이스의 Car 클래스 호출
}
}
프로그램 규모가 커짐에 따라 클래스 이름이 동일하여 충돌이 발생할 수 있는데
이 때 도메인 이름 또는 제품 이름으로 네임스페이스를 만들어 클래스를 감싸주면 충돌을 방지할 수 있다.
네임스페이스가 적용된 클래스를 호출할 때는 네임스페이스.클래스; 형태를 사용한다.
using 지시문
namespace 키워드로 만든 네임스페이스를 특정 C# 파일에서 사용하려면 코드 위쪽에 using 지시문으로 해당 네임스페이스를 현재 파일에서 사용하겠다고 선언해야 한다.
using System;
using MyNamespace;
using AllCar.MyCar // 계층형 네임스페이스 저장
using 지시문을 사용하지 않고 전체 네임스페이스와 클래스 이름을 함께 사용할 수도 있다.
using System;
Console.WriteLine("using 사용");
System.Console.WriteLine("using 사용 안해요.");
using Korea.Seoul; // Korea.Seoul 네임스페이스의 클래스를 바로 사용 가능
using System;
using In = Korea.Incheon; // Korea.Incheon 네임스페이스를 In 네임스페이스로 별칭 붙여 사용
namespace Korea
{
namespace Seoul
{
public class Car
{
public void Run() => Console.WriteLine("서울 자동차가 달립니다.");
}
}
namespace Incheon
{
public class Car
{
public void Run() => Console.WriteLine("인천 자동차가 달립니다.");
}
}
}
namespace NamespaceDescription
{
class NamespaceDescription
{
static void Main()
{
//[1] 네임스페이스 전체 지정
Korea.Seoul.Car s = new Korea.Seoul.Car();
s.Run(); // 서울
Korea.Incheon.Car i = new Korea.Incheon.Car();
i.Run(); // 인천
//[2] 네임스페이스 선언부에 선언
Korea.Incheon.Car seoul = new Korea.Incheon.Car();
seoul.Run(); // 서울
//[3] 별칭을 사용해서 간결하게 사용
In.Car ic = new In.Car();
ic.Run(); // 인천
}
}
}
[1] 서로 다른 Car 클래스를 한 곳에서 사용할 때는 직접 네임스페이스 전체 이름을 지정해서 인스턴스 생성
[2] 네임스페이스 하나만 코드 위쪽에 using 지시문으로 선언해두면 네임스페이스 생략하여 클래스 사용 가능
[3] using 지시문에서 Korea.Incheon 네임스페이스를 In 이름의 별칭으로 선언하고, 이것으로 코드 내에서 줄여
표현하는 것도 가능
using을 이용한 사용자 정의 데이터 형식 구현하기
//[I] 네임스페이스 추가
using System;
namespace TypeDefinitionWithUsing
{
//[II] Gilbut.Education.CSharp.Lecture 형식을 Project 별칭으로 줄여서 사용
using Project = Gilbut.Education.CSharp.Lecture;
public class TypeDefinitionWithUsing
{
public static void Main(string[] args)
{
//[1] 기본 호출
Gilbut.Education.CSharp.Lecture l =
new Gilbut.Education.CSharp.Lecture();
Console.WriteLine(l);
//[2] using 지시문 사용 호출
Project p = new Project();
Console.WriteLine(p);
}
}
}
namespace Gilbut
{
namespace Education
{
namespace CSharp
{
public class Lecture
{
public override string ToString()
{
return "Lecture 클래스 호출됨";
}
}
}
}
}
[1]: 기본 방법을 사용하여 네임스페이스의 클래스 호출
[2]: 새로운 별칭을 만들고 코드 내에서 별칭을 사용하여 호출
필드 만들기
필드(Field)는 클래스의 부품 역할을 하는 클래스의 내부 상태 값을 저장해 놓는 그릇을 의미
필드
필드는 클래스 내에서 선언된 변수 또는 배열을 의미한다.
대부분 private 액세스 한정자(access modifier)가 붙고 클래스 내에서 데이터를 담는 그릇 역할을 하며 개체 상태(state)를 보관한다.
필드는 선언한 후 초기화하지 않아도 자동으로 초기화한다.
지역변수와 전역변수
C#에서 변수를 선언할 때는 Main() 메서드와 같은 메서드 내에서 선언하거나 메서드 밖에서, 즉 메서드와 동등한 레벨에서 변수를 선언할 수 있다.
- 전역변수: 메서드 밖에서 선언된 변수로 필드라고 부름
- 지역변수: 메서드 안에서 선언된 변수로 메서드가 종료되면 자동으로 소멸됨
using System;
class VariableScope
{
static string globalVariable = "전역 변수"; // 필드 또는 멤버 변수
static void Main()
{
//[1]
string localVariable = "지역 변수";
Console.WriteLine(localVariable);
//[2][1]
Console.WriteLine(globalVariable); // "전역 변수"
//[2][2]
Test();
}
static void Test() => Console.WriteLine(globalVariable); // "전역 변수"
}
필드 종류
- 변수(variable) 형식의 필드: 지역 변수와 마찬가지로 값을 대입하여 사용
- 상수(constant) 형식의 필드: 필드(변수)와 비슷하지만 한 번 값을 초기화한 후에는 다시 값을 재설정할 수 없음
- 읽기 전용(readonly) 형식의 필드: 읽기 전용 필드로 상수 형식의 필드와 역할이 비슷하지만 선언할 때 초기과시키지 않고 생성자로 초기화한다.
- 배열(array) 형식의 필드: 배열을 필드 레벨로 올린 개념으로, 값을 여러개 보관
- 기타, 개체(object) 형식의 필드: 기타 필드에는 모든 데이터 형식이 올 수 있음
필드 이니셜라이저를 사용하여 필드 초기화
클래스 내에 선언된 필드는 자동으로 해당 형식의 기본값으로 초기화된다.
필드 이니셜라이저는 필드를 선언과 동시에 초기화한다.
using System;
class Say
{
//[1] 필드(멤버 변수)
private string message = "안녕하세요."; // 필드 이니셜라이저
//[2] 메서드
public void Hi()
{
this.message = "반갑습니다.";
Console.WriteLine(this.message);
}
}
class FieldInitializer
{
static void Main()
{
Say say = new Say();
say.Hi();
}
}
[1]에서 필드는 변수와 달리 선언과 동시에 초기화하지 않으면 자동으로 기본값으로 초기화 된다.
배열 형식의 필드 사용하기
using System;
class Schedule
{
//[1] 필드에 배열 사용
private string[] weekDays = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
public void PrintWeekDays()
{
foreach (var day in weekDays)
{
Console.Write($"{day}\t");
}
Console.WriteLine();
}
}
class FieldArray
{
static void Main()
{
Schedule schedule = new Schedule();
schedule.PrintWeekDays();
}
}
액세스 한정자
클래스와 클래스의 멤버에는 액세스 한정자를 붙혀 접근권한을 설정할 수 있다.
멤버 보이기
- private: 액세스 한정자를 생략했을 때의 기본값으로 해당 클래스의 멤버는 해당 파일이나 클래스 영역에서만 사용
- public: 해당 클래스와 멤버에 제한 없이 외부에서도 접근 가능
액세스 한정자의 종류
- public: 멤버에 대한 접근 제한되지 않고 모든 곳에서 접근 가능
- private: 현재 클래스 내에서만 접근 가능
- protected: 현재 클래스 또는 현재 클래스를 상속하는 자식 클래스에만 접근 허가됨
- internal: 현재 프로젝트의 모든 클래스에 접근 허가됨
- protected internal: 현재 어셈블리(DLL 파일) 또는 현제 어셈블리에서 파생된 모든 클래스에 접근 허가됨
public과 private 액세스 한정자
using System;
namespace PublicAndPrivate
{
public class Car
{
// 메서드
public static void Hi() { Console.WriteLine("Hi"); }
private static void Bye() { Console.WriteLine("Bye"); }
// 필드
public static string name; // 이름
private static int age; // 나이
// private한 필드를 외부에 공개하고자할 때에는 public한 메서드로 공개
public static void SetAge(int intAge) { age = intAge; }
public static int GetAge() { return age; }
}
class PublicAndPrivate
{
static void Main()
{
//[1] public 멤버는 항상 접근 가능
Car.Hi();
//[2] private 멤버는 다른 클래스에서 접근 불가
//Car.Bye();
//[3] public 필드는 외부에서 접근 가능
Car.name = "RedPlus"; Console.WriteLine(Car.name);
//[4] public 메서드로 필드의 값을 설정(Set) 및 조회(Get)
Car.SetAge(21);
Console.WriteLine(Car.GetAge());
}
}
}
<Reference>
'C# 기초' 카테고리의 다른 글
[C# 교과서] 18. C# 활용(12) - 메서드와 매개변수 (0) | 2022.01.20 |
---|---|
[C# 교과서] 17. C# 활용(11) - 생성자, 소멸자 (0) | 2022.01.20 |
[C# 교과서] 15. C# 활용(9) - 개체 만들기 (0) | 2022.01.19 |
[C# 교과서] 14. C# 활용(8) - 알고리즘과 절차 지향 프로그래밍 (0) | 2022.01.19 |
[C# 교과서] 13. C# 활용(7) - LINQ (0) | 2022.01.18 |