C#

C#문법-16 : 속성과 static 클래스, 메소드, 필드, 속성

알통몬_ 2019. 4. 25. 13:00
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 

지난 포스팅에서는 클래스 상속에 대해 공부했습니다.

2019/04/25 - [C#] - C#문법-15 : 클래스 상속

이번 포스팅에서는 static 키워드와 속성 대해 공부합니다.

속성이란 + 예제

using System;

namespace workspace_csharp
{

// 속성은 전용 필드의 값을 get(읽거나) set(쓰거나, 계산하는) 유연한 매커니즘을 제공하는 멤버.
// 공용 데이터 멤버인 것처럼 속성을 사용할 수 있지만, 실제는 '접근자' 라는 특수한 메소드.
// 속성을 사용하게 되면 클래스가 구현 or 검증 코드를 숨기고 동시에 값을 가져오고, 설정하는
// 방법을 노출할 수 있습니다.
// get 속성 접근자는 속성 값을 반환하는데 사용하고
// set 속성 접근자는 새 값을 할당하는데 사용합니다.
// 접근자는 각기 다른 접근 제한을 가질 수 있습니다.
// value 키워드는 set 접근자가 할당하는 값을 정의하는데 사용됩니다.
// 속성은 get 접근자만 사용할 수도(read only), set 접근자만 사용할 수도(write only) 있습니다.

class Properties
{

private string _name;

// get, set 블록 안에는 메소드 블록에 코드를 선언하듯, 많은 코드가 들어가도 됩니다.
// 단, get은 가장 마지막에 속성 타입에 맞는 return이 필요합니다.
public string Name
{
get
{
return this._name;
}
set
{
this._name = value;
}
}


//read only로 속성을 선언할 때 선언을 한 줄로 끝낸다면 => 기호를 사용할 수도 있습니다.
private string _id;
//아래는 read only 속성입니다. 이 경우 return 키워드를 생략합니다.
// 이런 선언을 식 본문 정의 라고 하며
// 식 본문 정의로 선언된 멤버를 식 본문 멤버라고 합니다.
public string getId => this._id;

// get, set 이 모두 선언된 속성도 식 본문 정의를 사용할 수 있습니다.
// 위에 있는 Name 프로퍼티를 식 본문 정의로 바꿔보면
public string Name2 {
get => this._name;
set => this._name = value;
}
// 이렇게 좀 더 간편하게 변경할 수 있습니다.


// 자동으로 속성 구현하기
// 경우에 따라서 get, set 속성 접근자에서 필드에 값을 할당하거나 값을 가져오기만 하면
// 되는 경우가 있습니다.
// 이런 경우 자동 구현 속성을 사용하면 편합니다.
public string Name3 {get; set;}
public string Id3 {get; set;}

public static void Main(string[] args)
{
Properties properties = new Properties();
properties.Name = "박성균"; // set 접근자를 통해 값이 할당됩니다
System.Console.WriteLine("get 접근자를 통해 값을 가져옵니다." + properties.Name);

properties.Name2 = "박성균2";
System.Console.WriteLine("식본문 정의 => " + properties.Name2);

Properties data = new Properties{Name3 = "박성균3"};
// 자동으로 구현된 속성을 모두 사용할 필요는 없습니다.
//Properties data = new Properties{Name3 = "박성균3", Id3 = "20190425001"};
System.Console.WriteLine("자동으로 속성 구현하기 => " + data.Name3);
System.Console.WriteLine("자동으로 속성 구현하기 => " + data.Id3);
}
}

}

여기까지 속성에 대해 알아보았습니다.


static

using System;

namespace workspace_csharp {
public static class StaticClass {
// static 클래스는 몇 가지 특징이 있습니다.
// 1. 정적 멤버만 포함할 수 있습니다.
// 2. 인스턴스화 즉, 객체를 생성할 수 없습니다.
// 3. 봉인되어 있습니다. -> 상속할 수 없습니다. 부모 클래스가 될 수 없습니다.
// 4. 인스턴스 생성자를 포함할 수 없습니다.
// public StaticClass(string name) {} // 이런 생성자를 가질 수 없습니다.
//
//
public static void Method() {
System.Console.WriteLine("static method called!");
}

public static string _name;

public static string Name {
get => _name;
set {
if(value != null) {
_name = value;
} else {
_name = "Unknown";
}
}
}
}

public class StaticKeyword {
//static 하지 않은 클래스는 일반 멤버와 정적 멤버를 모두 가질 수 있습니다.
public static void Method()
{
System.Console.WriteLine("static method called!");
}

public static string _name;

public static string Name
{
get => _name;
set
{
if (value != null)
{
_name = value;
}
else
{
_name = "Unknown";
}
}
}
static void Main(string[] args)
{
// 정적 멤버들을 호출하거나 접근할 때는 클래스이름.멤버 로 호출합니다.
// 따로 인스턴스를 생성해서 호출하거나 접근하지 않습니다.
StaticClass.Method();
System.Console.WriteLine(StaticClass.Name);
StaticClass._name = "정적필드";
System.Console.WriteLine(StaticClass.Name);
StaticClass.Name = "정적속성";
System.Console.WriteLine(StaticClass.Name);
System.Console.WriteLine("=--------------=");

StaticKeyword.Method();
System.Console.WriteLine(StaticKeyword.Name);
StaticKeyword._name = "정적필드";
System.Console.WriteLine(StaticKeyword.Name);
StaticKeyword.Name = "정적속성";
System.Console.WriteLine(StaticKeyword.Name);
}

}
}

이상입니다. 감사합니다.

다음 포스팅에서는 제네릭에 대해 공부합니다.

반응형