using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//객체지향 -> 은닉성
class Knight
{
public int hp;
}
static void Main(string[] args)
{
Knight knight = new Knight();
knight.hp = 100;
//실수로 hp를 고쳐버리는 상황
knight.hp = 40;
//코드가 길어지면 길어질 수록, 누가 hp를 고쳤는지 찾기가 굉장히 힘들어진다.
}
}
}
1. set함수 쓰는 이유 - 은닉성
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//객체지향 -> 은닉성
class Knight
{
public int hp;
public int GetHp()
{
return hp;
}
public void SetHp(int _hp)
{
this.hp = _hp;
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
knight.SetHp(100);
}
}
}
빙빙 돌아서 값을 넣어준다
2. set함수 쓰는 방법
public int hp로 해도, protected int hp로 해도 다 hp에 100이 잘 들어감
해보니 잘 됨.
3. 보호해야 할 변수를 protected로 변경
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//객체지향 -> 은닉성
class Knight
{
protected int hp; //아무나 접근할 수 없게 public에서 protected로 교체
public int GetHp()
{
return hp;
}
public void SetHp(int _hp)
{
this.hp = _hp;
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
knight.SetHp(100);
}
}
}
4. get함수 쓰는 이유
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//객체지향 -> 은닉성
class Knight
{
protected int hp; //아무나 접근할 수 없게 public에서 protected로 교체
//set함수 (= setter)
public void SetHp(int _hp)
{
this.hp = _hp;
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
knight.SetHp(100);
int h = knight.hp; //hp에 빨간 줄
Console.WriteLine(knight.hp); //hp에 빨간 줄
//int h = knight.GetHp();
//Console.WriteLine(knight.GetHp());
}
}
}
hp를 가져와서 쓰려고 해도 쓸 수가 없다
protected로 되어있기 때문.
protected 되어 있는 hp를 쓰려면 어떻게 해야할까?
1. public hp로 바꾼다 (은닉성에 문제O)
2. get함수를 만들어서 return 된 값을 가져온다 (은닉성에 문제X) -> 왜냐하면 변수가 여전히 protected 이기 때문
5. get함수 쓰는 법
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//객체지향 -> 은닉성
class Knight
{
protected int hp; //아무나 접근할 수 없게 public에서 protected로 교체
//get함수 (= getter)
public int GetHp()
{
return hp;
}
//set함수 (= setter)
public void SetHp(int _hp)
{
this.hp = _hp;
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
knight.SetHp(100);
//get함수의 return 값 (=100)을 가져와서 변수 h에 집어넣는다.
int h = knight.GetHp();
Console.WriteLine(knight.GetHp());
}
}
}
변수 1개에 함수 2개씩이나 붙는다고? (get set)
그럼 변수 100개면, 함수 200개가 붙어야 되나?????
변수 1개당, 함수 1개로 줄일 순 없을까?????
6. 통합형 get set - 프로퍼티 라고도 부른다(= C# 방법)
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//객체지향 -> 은닉성
class Knight
{
protected int hp; //아무나 접근할 수 없게 public에서 protected로 교체
//통합형 get set - 프로퍼티라고도 부른다(= C# 방법)
public int Hp
{
get
{
return hp;
}
set
{
//value : SetHp(int _hp)함수의 매개변수 _hp 역할
hp = value;
}
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
//set함수의 value에 100을 집어넣는다.
knight.Hp = 100;
//Hp함수의 get의 return값인 100을 가져오기
int h = knight.Hp;
}
}
}
public int Hp프로퍼티의 set에 값이 잘 들어갔다
public int Hp프로퍼티의 get의 return 값으로 인해 int h 변수에 값이 잘 들어갔다
7. set을 지우고 쓰는 경우
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//객체지향 -> 은닉성
class Knight
{
//set을 쓰고싶지 않다면, 보호 할 변수에 값을 대입해놓으면 대입 할 필요가 없으므로 get 안써도 된다.
protected int hp = 100;
//통합형 get set - 프로퍼티라고도 부른다(= C# 방법)
public int Hp
{
get
{
return hp;
}
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
//Hp프로퍼티의 get의 return값인 100을 가져오기
int h = knight.Hp;
}
}
}
8. set에 private를 붙이는 경우
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//객체지향 -> 은닉성
class Knight
{
protected int hp;
//통합형 get set - 프로퍼티라고도 부른다(= C# 방법)
public int Hp
{
get
{
return hp;
}
private set
{
//value : SetHp(int _hp)함수의 매개변수 _hp 역할
hp = value;
}
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
//set의 value에 100을 집어넣는다.
knight.Hp = 100; //빨간 줄
//Hp프로퍼티의 get의 return값인 100을 가져오기
int h = knight.Hp;
}
}
}
set을 private set으로 설정 할 경우, 외부에서 접근이 불가능하다.
그러므로 knight.Hp = 100; 에서 knight.Hp에 빨간 줄이 뜬다.
public int Hp 프로퍼티는 public이라 접근이 가능하지만
set이 하필 private set이라 접근 불가능하기 때문
이렇게 하면 더 이상 외부에서는 hp 값을 바꿀 수 없게 된다. (영원히 hp=100)
hp값을 바꾸려면 내부에서 값을 바꿔줄 수 밖에 없다(보안O)
9. 내부에서 값을 바꾸는 방법(=보안O)
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//객체지향 -> 은닉성
class Knight
{
protected int hp;
//통합형 get set - 프로퍼티라고도 부른다(= C# 방법)
public int Hp
{
get
{
return hp;
}
private set
{
//value : SetHp(int _hp)함수의 매개변수 _hp 역할
hp = value;
}
}
void Test()
{
//내부에서 hp값을 바꾸는 방법
Hp = 200;
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
}
}
}
10. 자동구현 프로퍼티
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//객체지향 -> 은닉성
class Knight
{
protected int hp;
//자동 구현 프로퍼티
public int Hp
{
get; set;
}
public int GetHp()
{
return hp;
}
public void SetHp(int value)
{
hp = value;
}
}
static void Main(string[] args)
{
Knight knight = new Knight();
//SetHp(int value)의 value에 100을 집어넣는다.
knight.SetHp(100);
//GetHp()함수의 return hp의 값인 100을 가져와서 변수 h에 대입
int h = knight.GetHp();
}
}
}
11. 프로퍼티 초기화
using System;
using System.Collections.Generic;
namespace Csharp
{
class Program
{
//객체지향 -> 은닉성
class Knight
{
protected int hp;
//프로퍼티 초기화 : C# 7.0부터 가능한 프로퍼티
public int Hp { get; set; } = 100;
}
static void Main(string[] args)
{
Knight knight = new Knight();
//set에 넣는다
knight.Hp = 200;
//get의 return 값을 가져와서 변수 int hp에 넣는다
int hp = knight.Hp;
}
}
}
'● > 섹션 7. 유용한 문법' 카테고리의 다른 글
06.Lambda(람다) (0) | 2021.07.14 |
---|---|
05.event(이벤트) (0) | 2021.07.14 |
04.델리게이트(delegate) (0) | 2021.07.14 |
02. abstract / interface (0) | 2021.07.14 |
01.Generic 일반화 (0) | 2021.07.13 |