2025. 3. 15. 01:41ㆍprogramming/C#
1. 캡슐화(Encapsulation): 주 목적은 '데이터 은닉'이다. 민감한 데이터를 private로 감춰서 public의 setter, getter 메소드로만 private로 감춘 데이터에 접근&변경할 수 있다. 즉, read-only, write-only한 선택적 접근을 제어할 수 있게 된다. ==> public보다 보안성이 증가, 민감한 데이터 안전하게 컨트롤
class 은행계좌 {
private int 잔액; // 외부에서 접근할 수 없게 private으로 설정
public void 입금(int 금액) {
잔액 += 금액; // 입금 기능은 제공하지만, 잔액은 직접 수정할 수 없게 함
}
public void 출금(int 금액) {
if (잔액 >= 금액) {
잔액 -= 금액;
} else {
Console.WriteLine("잔액이 부족합니다.");
}
}
public int 잔액조회() {
return 잔액; // 잔액을 조회할 수만 있도록 함
}
}
- 잔액 필드는 private으로 숨겨서 외부에서 직접 접근할 수 없다. / 입금, 출금, 잔액조회 메서드를 통해서만 접근할 수 있다.
2. 상속(Inheritance): "기존 클래스를 바탕으로 새로운 클래스를 만드는 것"으로, 부모 클래스(기존 클래스)의 속성과 메서드를 자식 클래스(새로운 클래스)가 물려받아 재사용하거나, 필요에 따라 오버라이딩할 수 있습니다. 중복 코드를 줄이고, 코드의 재사용성을 높일 수 있다.
class 동물 {
public void 먹다() {
Console.WriteLine("먹고 있어요.");
}
}
class 개 : 동물 {
public void 짖다() {
Console.WriteLine("멍멍!");
}
}
class 고양이 : 동물 {
public void 야옹하다() {
Console.WriteLine("야옹!");
}
}
- 부모 클래스(Parent Class) = 슈퍼클래스(Superclass)
- 자식 클래스(Child Class) = 서브클래스(Subclass)
보통 "슈퍼클래스", "서브클래스"라는 용어를 많이 쓴다고 함.
3.다형성(Polymorphism): "하나의 인터페이스로 여러 가지 구현을 할 수 있다". 쉽게 말하면, 같은 이름의 메서드나 클래스가 각 슈퍼 클래스마다 다르게 동작할 수 있다는 거죠. 상속받은 메소드를 동일하게 호출하여 다른 작업을 수행할 수 있게 함. 예를 들어, 동물이라는 클래스가 있을 때, 울다()라는 메서드를 정의하고, 이 메서드는 고양이와 개에서 다르게 동작할 수 있음.
class 동물 {
public virtual void 울다() {
Console.WriteLine("동물이 울어요!");
}
}
class 개 : 동물 { //개가 동물을 상속받음
public override void 울다() {
Console.WriteLine("멍멍!"); //동물의 울다 메소드
}
}
class 고양이 : 동물 { //고양이가 동물을 상속받음
public override void 울다() {
Console.WriteLine("야옹!"); //동물의 울다 메소드
}
}
class Program
{
static void Main(String[] args)
{
동물 animal = new 동물();
개 dog = new 개();
고양이 cat = new cat();
animal.울다(); //동물이 울어요!
dog.울다(); // 멍멍!
cat.울다(); // 야옹!
}
}
//동물의 '울다 메소드'가 각 하위 클래스에서 다르게 작동
//개에서는 '멍멍!', 고양이에서는 '야옹!'을 출력
** virtual 키워드는 부모 클래스의 메서드가 자식 클래스에서 override를 통해 재정의될 수 있도록 허용하는 역할을 합니다. 만약 virtual이 없다면 부모 클래스의 메서드는 기본적으로 override할 수 없다.
즉, 메서드를 자식 클래스에서 변경할 수 있도록 하려면 virtual을 붙여야 함!
**override는 부모 클래스에서 정의된 메서드를 자식 클래스에서 새롭게 구현(재정의)하는 것을 의미하는 키워드
**만약 override 없이 그냥 같은 이름의 메서드를 만든다면, 부모 클래스의 메서드를 덮어쓰는 것이 아니라, 새로운 메서드가 추가되는 것이라서 다형성이 적용되지 않는다.
4. 추상화(Abstraction): 추상화는 "복잡한 구현을 숨기고, 필요한 기능만 제공하는 것". 즉, 사용자가 객체를 다룰 때 복잡한 세부 사항은 몰라도 되고, 필요한 부분만 알면 되도록. 보통 abstract 클래스를 사용해 기능을 미리 정의하고, 실제 구현은 상속받은 클래스에서 override 합니다.
abstract class 동물 {
public abstract void 울다(); // 울다 메서드는 구체적인 구현 없이 정의만 해놓음
}
class 개 : 동물 {
public override void 울다() {
Console.WriteLine("멍멍!"); //울다 메서드의 구체적인 기능 내용은 서브 클래스에서 정의
}
}
class 고양이 : 동물 {
public override void 울다() {
Console.WriteLine("야옹!"); //울다 메서드의 구체적인 기능 내용은 서브 클래스에서 정의
}
}
동물 클래스는 울다() 메서드를 추상화해 놓았고, 구체적인 울음소리는 개나 고양이 클래스에서 구현.
'programming > C#' 카테고리의 다른 글
[C# 시작 전 필수] 객체지향(OOP)이란? (2) | 2025.03.15 |
---|---|
[C# 시작 전 필수] 객체지향의 '접근 제한자' (0) | 2025.03.14 |