λ„€μž„μŠ€νŽ˜μ΄μŠ€λž€

λ°˜μ‘ν˜•
SMALL

 

πŸ’‘λ„€μž„μŠ€νŽ˜μ΄μŠ€(Namespace)λŠ” 클래슀, μΈν„°νŽ˜μ΄μŠ€, λ©”μ„œλ“œ λ“±μ˜ 이름 μΆ©λŒμ„ λ°©μ§€ν•˜κ³  μ½”λ“œλ₯Ό μ²΄κ³„μ μœΌλ‘œ 정리할 수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” κ°œλ…μž…λ‹ˆλ‹€.
μ‰½κ²Œ 말해, 이름이 같은 ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œκ°€ μžˆμ„ λ•Œ ꡬ뢄할 수 μžˆλ„λ‘ ν•˜λŠ” '이름 곡간'μž…λ‹ˆλ‹€.

λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ μ—­ν• 

  1. 이름 좩돌(Name Collision) λ°©μ§€
    • μ—¬λŸ¬ κ°œλ°œμžκ°€ 같은 μ΄λ¦„μ˜ 클래슀λ₯Ό λ§Œλ“€λ”λΌλ„, λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό λ‹€λ₯΄κ²Œ ν•˜λ©΄ 좩돌이 λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  2. μ½”λ“œ 관리 및 가독성 ν–₯상
    • κ΄€λ ¨λœ ν΄λž˜μŠ€λ‚˜ λ©”μ„œλ“œλ₯Ό κ·Έλ£Ήν™”ν•˜μ—¬ μ½”λ“œλ₯Ό μ²΄κ³„μ μœΌλ‘œ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. 라이브러리 및 ν”„λ ˆμž„μ›Œν¬μ—μ„œ ν•„μˆ˜μ 
    • C#μ—μ„œ μ‚¬μš©ν•˜λŠ” λ‹€μ–‘ν•œ 라이브러리(System, System.Collections λ“±)도 λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•΄ κ΄€λ¦¬λ©λ‹ˆλ‹€.

λ„€μž„μŠ€νŽ˜μ΄μŠ€ 예제

λ‹€μŒμ€ CompanyA와 CompanyBμ—μ„œ 같은 μ΄λ¦„μ˜ Employee 클래슀λ₯Ό λ§Œλ“€μ—ˆμ„ λ•Œ, λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ μΆ©λŒμ„ λ°©μ§€ν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€.

λ„€μž„μŠ€νŽ˜μ΄μŠ€ 없이 같은 μ΄λ¦„μ˜ ν΄λž˜μŠ€κ°€ μžˆμ„ 경우

class Employee 
{
    public void PrintInfo() 
    {
        Console.WriteLine("νšŒμ‚¬ A의 μ§μ›μž…λ‹ˆλ‹€.");
    }
}

class Employee // 였λ₯˜ λ°œμƒ! 클래슀 이름이 쀑볡됨
{
    public void PrintInfo() 
    {
        Console.WriteLine("νšŒμ‚¬ B의 μ§μ›μž…λ‹ˆλ‹€.");
    }
}

λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ 좩돌 λ°©μ§€

using System;

namespace CompanyA
{
    class Employee
    {
        public void PrintInfo()
        {
            Console.WriteLine("νšŒμ‚¬ A의 μ§μ›μž…λ‹ˆλ‹€.");
        }
    }
}

namespace CompanyB
{
    class Employee
    {
        public void PrintInfo()
        {
            Console.WriteLine("νšŒμ‚¬ B의 μ§μ›μž…λ‹ˆλ‹€.");
        }
    }
}

class Program
{
    static void Main()
    {
        // λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ 클래슀 ꡬ뢄
        CompanyA.Employee empA = new CompanyA.Employee();
        CompanyB.Employee empB = new CompanyB.Employee();

        empA.PrintInfo(); // 좜λ ₯: νšŒμ‚¬ A의 μ§μ›μž…λ‹ˆλ‹€.
        empB.PrintInfo(); // 좜λ ₯: νšŒμ‚¬ B의 μ§μ›μž…λ‹ˆλ‹€.
    }
}

using ν‚€μ›Œλ“œλ₯Ό ν™œμš©ν•œ λ„€μž„μŠ€νŽ˜μ΄μŠ€ 단좕

μ½”λ“œμ—μ„œ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό 맀번 μž…λ ₯ν•˜λŠ” 것이 번거둜울 경우, using ν‚€μ›Œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ μ½”λ“œ 가독성을 높일 수 μžˆμŠ΅λ‹ˆλ‹€.

using System;
using A = CompanyA.Employee;
using B = CompanyB.Employee;

class Program
{
    static void Main()
    {
        A empA = new A();
        B empB = new B();

        empA.PrintInfo();
        empB.PrintInfo();
    }
}

μœ„ μ½”λ“œμ—μ„œλŠ” CompanyA.Employee와 CompanyB.Employee 쀑 μ–΄λ–€ 것을 μ‚¬μš©ν• μ§€ μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— 컴파일 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

βœ”οΈ 이럴 λ•ŒλŠ” using ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ˜, 클래슀 이름이 κ²ΉμΉ  경우 직접 λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό λͺ…μ‹œν•΄μ•Ό ν•©λ‹ˆλ‹€.

using System;
using A = CompanyA.Employee;
using B = CompanyB.Employee;

class Program
{
    static void Main()
    {
        A empA = new A();
        B empB = new B();

        empA.PrintInfo();
        empB.PrintInfo();
    }
}

A와 BλΌλŠ” 별칭(Alias)을 μ„€μ •ν•˜μ—¬, μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μœ μ§€ν•˜λ©΄μ„œ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό λͺ…ν™•ν•˜κ²Œ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ‚¬μš© 사둀

C#μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ λΌμ΄λΈŒλŸ¬λ¦¬λ“€λ„ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•˜μ—¬ κ΄€λ¦¬λ©λ‹ˆλ‹€.

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int>(); // System.Collections.Generic λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ‚¬μš©
        numbers.Add(1);
        numbers.Add(2);

        Console.WriteLine(numbers.Count); // 2 좜λ ₯
    }
}

βœ”οΈ List<int> ν΄λž˜μŠ€λŠ” System.Collections.Generic λ„€μž„μŠ€νŽ˜μ΄μŠ€μ— ν¬ν•¨λ˜μ–΄ 있기 λ•Œλ¬Έμ— using System.Collections.Generic;을 μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.
βœ”οΈ using System;은 κΈ°λ³Έ μž…μΆœλ ₯ κΈ°λŠ₯(Console λ“±)을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•©λ‹ˆλ‹€.

 

λ„€μž„μŠ€νŽ˜μ΄μŠ€(Namespace)와 μžλ°”μ—μ„œμ˜ νŒ¨ν‚€μ§€(Package)의 차이

λ„€μž„μŠ€νŽ˜μ΄μŠ€κ°€ C#μ—μ„œ μ½”λ“œμ˜ 논리적 κ·Έλ£Ήν™”λ₯Ό λ‹΄λ‹Ήν•œλ‹€λ©΄, Javaμ—μ„œλŠ” νŒ¨ν‚€μ§€(Package)κ°€ μœ μ‚¬ν•œ 역할을 ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 두 κ°œλ…μ€ λͺ‡ κ°€μ§€ 차이점이 μžˆμŠ΅λ‹ˆλ‹€.

νŒ¨ν‚€μ§€(Package)λž€? (Java)

βœ… 클래슀λ₯Ό κ·Έλ£Ήν™”ν•˜κ³ , μ‹€μ œ 파일 μ‹œμŠ€ν…œ(폴더 ꡬ쑰)κ³Ό 연동
βœ… package ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•˜λ©°, μ ‘κ·Ό μ œμ–΄(public, private λ“±) 및 배포에도 영ν–₯
βœ… νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•˜λ©΄ import 문을 톡해 λ‹€λ₯Έ νŒ¨ν‚€μ§€μ˜ 클래슀λ₯Ό 뢈러올 수 있음

 

package companyA; // νŒ¨ν‚€μ§€ μ„ μ–Έ

public class Employee {
    public void printInfo() {
        System.out.println("νšŒμ‚¬ A의 μ§μ›μž…λ‹ˆλ‹€.");
    }
}

νŒ¨ν‚€μ§€λ₯Ό μ„ μ–Έν•˜λ©΄, ν•΄λ‹Ή ν΄λž˜μŠ€λŠ” companyA 폴더 μ•ˆμ— μœ„μΉ˜ν•΄μ•Ό ν•˜λ©°, λ‹€λ₯Έ νŒ¨ν‚€μ§€μ—μ„œ μ‚¬μš©ν•˜λ €λ©΄ importκ°€ ν•„μš”ν•©λ‹ˆλ‹€.

λ„€μž„μŠ€νŽ˜μ΄μŠ€(Namespace) vs νŒ¨ν‚€μ§€(Package) 차이점

ꡬ뢄 λ„€μž„μŠ€νŽ˜μ΄μŠ€ (C#) νŒ¨ν‚€μ§€ (Java)
μ—­ν•  μ½”λ“œ λ‚΄λΆ€μ—μ„œ 이름 좩돌 λ°©μ§€ 및 논리적 κ·Έλ£Ήν™” 클래슀 νŒŒμΌμ„ κ·Έλ£Ήν™”ν•˜κ³  μ‹€μ œ 폴더 ꡬ쑰와 연동
μ‚¬μš© 방법 namespace CompanyA { } package companyA;
파일 μ‹œμŠ€ν…œκ³Όμ˜ 관계 파일 μ‹œμŠ€ν…œκ³Ό 직접적인 μ—°κ΄€ μ—†μŒ 폴더 ꡬ쑰와 μΌμΉ˜ν•΄μ•Ό 함
λ‹€λ₯Έ μ½”λ“œμ—μ„œ μ‚¬μš© using CompanyA; import companyA.Employee;
λ°°ν¬μ™€μ˜ μ—°κ΄€μ„± μ½”λ“œ λ‚΄μ—μ„œλ§Œ 영ν–₯ νŒ¨ν‚€μ§€ κ²½λ‘œκ°€ 클래슀의 물리적 μœ„μΉ˜λ₯Ό κ²°μ •ν•˜λ©°, 배포에도 영ν–₯

 

C#의 λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” μ½”λ“œ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©λ˜λ©°, 파일 κ΅¬μ‘°μ™€λŠ” 관계없이 클래슀 κ°„ 이름 μΆ©λŒμ„ λ°©μ§€ν•˜κ³  논리적인 그룹을 ν˜•μ„±ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€. 반면, Java의 νŒ¨ν‚€μ§€λŠ” 폴더 ꡬ쑰와 직접 μ—°κ²°λ˜λ©°, 클래슀의 물리적 μœ„μΉ˜μ™€ 배포에도 영ν–₯을 λ―ΈμΉ˜λŠ” κ°œλ…μž…λ‹ˆλ‹€.

즉, λ„€μž„μŠ€νŽ˜μ΄μŠ€λŠ” 논리적 관리, νŒ¨ν‚€μ§€λŠ” 물리적 κ΄€λ¦¬μ˜ 차이가 μžˆλ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

λ°˜μ‘ν˜•
LIST