[C#] Ch 03. 클래스(Class)와 상속
1. 클래스(Class)
클래스(Class)는 객체 지향 프로그래밍의 핵심 요소 중 하나로, 관련된 변수(필드)와 메소드를 그룹화하여 새로운 데이터 유형을 정의하는 데 사용된다.✔
클래스는 객체(Object)의 설계도 역할을 하며, 이를 가지고 인스턴스를 생성하여 수행하게 된다.
public class Dog{
private string name;
public string Name{
get{return name;}
set{name = value;}
}
public void Sound(){
Console.WriteLine($"{name}이 짖습니다.");
}
}
public class Program{
public static void Main(){
Dog dog = new Dog();
dog.name = "단지";
dog.Sound();
}
}
위에서는 Dog라는 클래스를 선언하여 설계도를 만들어 준다. 실질적인 구현은 아래 Program 클래스의 Main함수에서 Dog라는 형식의 객체를 생성하여 사용하게 된다.
이처럼 클래스를 사용하게 되면 코드 구조화 및 재사용성이 용이해지며, 복잡한 문제도 각 부분을 모듈화하여 처리할 수 있게 된다.
1-1. 생성자
클래스의 생성자란 객체를 초기화 하기 위한 일련의 처리 내용을 의미하며, 이를 통해 인스턴스가 생성되었을 때, 기본적인 객체의 형태를 만들 수 있다.✔
public class Dog{
public Dog(){ //반환 형식이 없다.
--- //객체 초기화 내용을 구현하면 된다.
}
}
이 뿐만 아니라 생성자 또한 오버로딩이 가능하여 아래 예시와 같이 각기 다른 형태의 파라메터에 대한 결과물을 만들 수 있다.
public Dog(){
'''
}
public Dog(string name, string color){
'''
}
1-2 this 키워드
this 키워드는 현재 객체를 참조하는 데 사용되는 특수한 키워드이다. this를 사용하여 현재 클래스의 멤버(필드, 속성, 메소드)에 접근하거나 호출할 수 있다.✔
this 키워드는 다음과 같이 사용된다.
1. 필드와 매개변수 이름이 충돌하는 경우
public class Dog{
private string name;
public void SetName(string name){
this.name = name;
} // 매개변수 name이 this를 통해 클래스 내부 필드에 값을 저장.
}
2. 생성자에서 다른 생성자를 호출할 때.
public class Dog{
private string name;
private int age;
public Dog(string name) : this(name, 1){
'''
}
public Dog(string name, int age){
this.name = name;
this.age = age;
}
}
위 처럼 하나의 생성자가 다른 생성자를 호출할 때 this 키워드를 사용할 수 있다. 중복 코드를 방지하고 초기화 로직을 재사용할 수 있다.
3. 인스턴스 메소드 내에서 현재 객체 참조하기.
public class Dog{
private int age;
public void addAge(){
this.age++; // 'age' 필드 증가(this 생략 가능)
}
}
인스턴스 메서드 내부에서 현재 객체에 대한 참조가 필요한 경우 this 키워드를 사용하여 해당 객체의 멤버에 엑세스 할 수 있다.
** 4. 확장 메서드 선언(Extension Method) **
public static class StringExtensions{
public static bool IsPalindrome(this string str){
// 문자열이 회문인지 확인하는 로직 구현
}
}
string text = "level";
bool isPalindrome = text.IsPalindrome();
확장 메서드(Extensions Method)는 외부 클래스의 기능을 확장하기 위해 정적 클래스 내부에서 정의가 된다. 첫 매개변수로 this 키워드와 함께 확장 대상 개체가 전달된다.
2. 상속(Inheritance)
상속은 객체 지향 프로그래밍의 핵심 개념 중 하나로, 한 클래스가 다른 클래스의 속성과 메서드를 가져오는 기능을 말한다.✔
이를 통해 코드 재사용성을 높이고, 프로그램의 구조를 더욱 체계적으로 만들 수 있다.
상속 관계에서 기본 클래스는 “부모 클래스” 또는 “기반 클래스”라고 하며, 상속 받는 클래스는 “자식 클래스” 또는 “파생 클래스”라고 한다.
public class Animal{
public string Name{ get; set; }
public void Sound(string name){
Console.WriteLine($"{Name}이 짖습니다.");
}
}
public class Dog : Animal{
public void Eat(){
Console.WriteLine($"{Name}이 밥을 먹습니다.");
}
}
public class Program{
public static void Main(){
Dog dog = new Dog();
dog.Name = "단지";
dog.Eat();
dog.Sound();
}
}
Animal이라는 기본 클래스를 선언하였으며, Name이라는 속성과 Sound라는 메소드를 정의하였다. Dog 클래스가 Animal 클래스를 상속하여 Eat 메소드를 정의하였다. 따라서 “dog” 인스턴스는 Animal 클래스의 Sound와 Dog 클래스의 Eat 메소드 모두를 사용할 수 있다.
상속은 코드의 재사용성을 증진시켜주며, 실제 세계의 개체 관계를 보다 자연스럽게 모델링할 수 있도록 돕는다.
하지만 복잡한 상황에서 남용하면 코드 유지보수가 어려워질 수 있으므로 적절히 사용해야 한다.
부모 클래스에서 받은 메소드를 그대로 사용하기 싫다면 재정의하면 된다.
2-1. 오버라이딩(Overriding)
오버라이딩이란 부모 클래스의 메소드를 파생 클래스에서 재정의하는 것을 의미한다.✔
public class Animal{
public string Name{get; set;}
public virtual void Initiate(){
Console.WriteLine("나는 부모 클래스 입니다");
}
}
public class Dog : Animal{
public override void Initiate(){
Console.WriteLine("나는 Dog 클래스 입니다");
}
}
public class Cat : Animal{
public override void Initiate(){
Console.WriteLine("나는 Cat 클래스 입니다");
}
}
override 키워드를 작성해주며 다형성을 용이하게 한다.
댓글남기기