[TIL-251223] 객체지향의 4대 특징

데비·2025년 12월 23일

본과정

목록 보기
13/79

오늘 배운 내용

- 객체지향의 4대 특징

  • 캡슐화(Encapsulation)
  • 상속(Inheritance)
  • 추상화(Abstraction)
  • 다형성(Polymorphism)

캡슐화(Encapsulation)

  • 프로그램 내에서 객체가 동작하기 위한 데이터(필드)와 동작(메서드)를 객체 자신이 가질 수 있는 성질
  • 은닉성 : 외부에는 필요한 정보만 공개한다. (private)
// 캡슐화
class Car
{
    // 객체가 가지는 데이터 
    float _moveSpeed;  // 이동 속도					  
    bool _onHeadLight; // 헤드라이트 점등 여부			// 필드 : 클래스 "Car"의 속성
    
    // 객체가 가지는 동작
    void MoveFront()   // 앞으로 이동
    {
    }
													// 메서드 : 클래스 "Car"의 기능 및 동작 
    void OnHeadLight() // 헤드라이트 점등
    {
    }
}
  • 프로퍼티(Property)
    • 은닉성 지원
public class Game
{
	private int _playerId = 5;
	// 원본 데이터를 공개하지 않고
    // 읽을 때는 공개적으로 하고 쓸 때는 외부에서 불가능하게 하려할 때
    
	public int PlayerId		  // getter와 setter로 이루어진 함수
	{
		get					  // 값을 읽겠다 : getter
    	{
    		return _playerId;
    	}
    	private set			  // 값을 쓰겠다 : setter
    	{					  // private를 사용하면 외부에선 사용이 불가능하고
    		_playerId = value // 내부에서는 사용이 가능하다.
    	}
	}
}
  • 자동구현 프로퍼티
public float MoveSpeed {get; private set;}

- 인스턴스(Instance)

  • Class는 사용자 정의 자료형이다.
// 인스턴스의 메모리 주소	 인스턴스
	Player player = new Player
// Player : 사용자 정의 클래스 (참조)타입
// player : 변수명이자 메모리 주소

// new : 메모리에 무언가 할당할 때 쓰는 키워드
  • 즉 Player라는 클래스(설계도) 참조타입을 Heap메모리에 할당 할것인데, 클래스(설계도) 기반으로 생성된 실질적인 객체 = 인스턴스(new Player)를 Heap 메모리에 주소값(player가 가르키는 주소)을 할당한다.

- 생성자

  • 인스턴스가 생성될 때 호출되는 (특수한)함수
public 구조체명()
{
	Console.WriteLine("생성자 호출");
}
  • 인스턴스의 new 할당이 될때 생성자를 호출하고 객체를 생성한다.
  • 데이터를 초기화할 때 사용한다
  • 다른 객체와 참조할 준비가 됐는지 확인할 때

상속(Inheritance)

  • 상속을 사용하게 되면, 공통점을 묶어 Base Class 즉, 부모 클래스로 두고, 여기서 클래스를 파생시켜 중복된 코드를 줄이고, 간결하게 작성할 수 있게 된다.
// 상속
public class Monster  // Base Class (부모 클래스)
{
}
	  // 자식 클래스 : 부모클래스
public class Slime : Monster 
{
}
	  // 자식 클래스 : 부모 클래스
public class Goblin : Monster
{
}

- Protected

  • Class는 보통 private과 public을 사용하지만, 상속일 때는 protect를 사용하여 외부에서는 불가능하지만 상속관계에서는 사용 가능하게 해준다는 뜻으로 사용이 가능하다.

- 오버라이딩(Overriding)

  • 부모 클래스가 가진 함수를 자식 클래스가 상속 받아서 자신의 동작으로 재정의 하는것 (virtual과 override)
public class Monster
{
	public virtual void Skill()  // virtual 을 붙여 가상 함수로 만들어줌
    {
    	Console.WriteLine("스킬 사용");
    }
}

public class Slime : Monster
{
	public override void Skill()	// override로 재구성 했을 때
    {
		Console.WriteLine($"{Name} : 점액질 발사");
    }
}

public class Goblin : Monster
{
	public void Skill()		// override로 재구성 하지않았을 때 
    {
    	Console.WriteLine($"{Name} : 할퀴기")
    }
}
// 실행하면 부모 클래스를 상속받아 자신의 동작으로 재구성한 
// 슬라임 클래스는 "슬라임 : 점액질 발사"를 출력하고,
// 재구성 하지 않은 고블린 클래스는 부모 클래스의 "스킬 사용"을 그대로 사용한다.

- Sealed

  • 상속의 상속을 막을 때, 해당 자식 객체가 최하위로 설정 하려할 때는 Sealed를 붙여준다. (내가 쓴 코드를 다른 사람이나 팀원이 상속할때 의도를 해치지않고 실수를 줄이도록 도와주는 코드)
public sealed class Goblin : Monster
{
}

- 오버로딩(Overloading)

  • 같은 이름으로 다른 동작을 가진다. (반환형과 인자를 달리하지만 같은 이름으로 함수를 선언하는것)
public void Attack()
{
	Console.WriteLine($"{Name} : {AttackValue} 공격력으로 공격);
}

// 오버로딩
public void Attack(int damage)
{
	Console.WriteLine($"{Name} : {damage} 공격력으로 공격);
}

- 캐스팅(업캐스팅, 다운캐스팅)

public void Run()
{
    // 상위 객체로 업캐스팅
    Monster mon = new Boss("boss");

	if (mon is Boss) // Monster형으로 선언된 변수 mon은 Boss다
	{
    (mon as Boss).Shouting();  // 다운 캐스팅
    }
}
// is 는 캐스팅 단계에서 참거짓을 판별해준다.
// as 는 다운 캐스팅을 할 때 사용한다.

추상화(Abstract)

  • 다른 객체가 상속받을 뼈대를 만들 때 사용. 프로그램에서 필요한 기능들만 간소화 시키는 것.(추상 클래스는 인스턴스(new할당)생성이 불가능 하다.)
public abstract class Monster
{
}
// 부모 클래스로써 시능은 가져가서 사용할수 있지만
// 인스턴스로는 생성이 불가능하다
  • 주의할 점
public abstract void Walk(); // 추상 메서드로 사용했을 때는

public override void Walk()  // override 로 재구현 해줘야 하며,
{
	Console.WriteLine("강아지가 네 발로 걸어요");
}
// 가상 함수와는 다르게 함수 이름까지만 선언하고
// 세부 구현은 상속받은 자식 클래스에서 
// 추상 메서드를 세부 구현을 해줘야한다.

다형성(Polymorphism)

  • 다형성은 이름과 같이 객체의 속성이나 기능이 상황에 따라 여러가지 형태를 가질 수 있는 성질이다.

0개의 댓글