1) 코드의 재사용성
: 메서드를 사용하면 동일한 작업을 반복해서 구현하지 않아도 됨. 필요할 때 메서드를 호출하여 작업 수행 가능
2) 모듈화
: 메서드를 사용하여 코드를 작은 단위로 분리하고 관리. 각 메서드는 특정한 기능을 수행하므로 코드의 구조가 더욱 명확해짐
3) 가독성과 유지보수성
: 메서드를 사용하면 코드가 간결해지고 가독성이 향상 됨. 또한, 코드 수정이 필요한 경우 해당 메서드만 수정하면 되므로 유지보수가 용이
4) 코드의 중복 제거
: 반복적인 작업을 메서드로 묶어서 사용하면 코드 중복을 방지
5) 코드의 추상화
: 메서드를 통해 작업 단위를 추상화하고, 메서드 이름을 통해 해당 작업이 어떤 역할을 하는지 파악 가능
접근제한자 반환형 메서드이름(매개변수) { 메서드 코드 }
public int Sum(int a, int b)
{
return a + b;
}
접근제한자 void 메서드이름(매개변수) { 메서드 코드 }
public void PrintHello()
{
Console.WriteLine("Hello");
} // 반환 값이 없을 때는 void
2) 리턴 타입(Return Type)
: 메서드가 반환하는 값의 데이터 타입 지정. 반환 값이 없을 경우 void를 사용
3) 메서드 이름(Method Name)
: 메서드를 호출하기 위해 사용하는 이름
4) 매개변수(parameters)
: 메서드에 전달되는 입력 값. 필요한 경우 0개 이상의 매게 변수를 정의할 수 있음
5) 메서드 실행에 코드(Method Body)
: 중괄호 { } 안에 메서드가 수행할 작업을 구현
namespace Study_C_
{
internal class Program
{
static int AddNumbers(int a, int b)
{
return (a + b);
}
static float AddNumbers(float a, float b)
{
return (a + b);
}
static int AddNumbers(int a, int b, int c)
{
return a + b + c;
}
static void Main(string[] args)
{
// 오버로딩 실습
int sum1 = AddNumbers(10, 20);
float sum2 = AddNumbers(10.5f, 21.5f);
int sum3 = AddNumbers(10, 20, 30);
}
}
}
struct Person
{
public string Name;
public int Age;
public void PrintInfo()
{
Console.WriteLine("Name : {0}, Age : {1}", Name, Age);
}
}
Person person1 = new Person();
person1.Name = "John";
person1.Age = 25;
person1.PrintInfo(); // Name : John, Age : 25
struct MyStruct
{
public int Value;
}
// new 없이 생성
MyStruct struct1;
struct1.Value = 5; // 필드를 사용하기 전에 초기화해야 함
// 기본값으로 생성
MyStruct struct2 = new MyStruct(); // struct2.Value는 0
void PrintMessage()
{
Console.WriteLine("Hello, World!");
}
struct Point
{
public int X;
public int Y;
}
class MyClass
{
public:
virtual void Display() // 가상함수 처리할 부모의 함수
{
std::cout << "Base Class" << std::endl;
}
};
class Derived : public MyClass
{
public:
void Display() override // 오버라이딩할 자식의 함수
{
std::cout << "Derived Class" << std::endl;
}
};
struct MyStruct
{
int x;
void Display()
{
std::cout << x << std::endl;
}
};
struct MyStruct
{
public int x;
public void Display()
{
Console.WriteLine(x);
}
}
public class MyClass
{
public void Greet(string name = "Guest")
{
Console.WriteLine($"Hello {name}");
}
// 오류 발생: 디폴트 인자가 있는 메서드와 동일한 시그니처로 인해 충돌
// public void Greet()
// {
// Console.WriteLine("Hello Guest");
// }
}
public class MyClass
{
const int DefaultAge = 25; // 상수로 선언된 기본값
public void Greet(int age = DefaultAge)
{
Console.WriteLine($"Age: {age}");
}
}
public void Greet(string name = "Guest", int age = 25)
{
Console.WriteLine($"Hello {name}, age {age}.");
}
// 호출
Greet(age: 30); // 오류: 중간 인자를 생략하고 마지막 인자를 지정하는 것은 불가능
#include <iostream>
using namespace std;
// Base 구조체
struct Animal
{
string name;
// 가상 함수: 파생 구조체에서 재정의 가능
virtual void Speak()
{
cout << name << " is making a sound." << endl;
}
// 가상 소멸자: 동적 할당된 객체를 안전하게 소멸시키기 위해 필요
virtual ~Animal() {}
};
// Derived 구조체 (Animal을 상속)
struct Dog : public Animal
{
Dog(const string& dogName)
{
name = dogName;
}
// 가상 함수 재정의 (override)
void Speak() override
{
cout << name << " says Woof!" << endl;
}
};
// 또 다른 파생 구조체 (Animal을 상속)
struct Cat : public Animal
{
Cat(const string& catName)
{
name = catName;
}
// 가상 함수 재정의 (override)
void Speak() override
{
cout << name << " says Meow!" << endl;
}
};
int main()
{
// Animal 포인터를 사용하여 Dog 및 Cat 객체를 가리킴
Animal* myDog = new Dog("Buddy");
Animal* myCat = new Cat("Whiskers");
// 가상 함수를 통해 다형성 구현
myDog->Speak(); // Buddy says Woof!
myCat->Speak(); // Whiskers says Meow!
// 메모리 해제
delete myDog;
delete myCat;
return 0;
}
1) 상속
2) 가상 함수
3) 다형성(Polymorphism)
4) 가상 소멸자
5) 실행 결과
Buddy says Woof!
Whiskers says Meow!