5. 클래스와 객체

이규성·2023년 10월 5일
0

TIL

목록 보기
5/106

10/5 OOP, 클래스, 객체를 공부

OOP(Object Oriented Programing)

객체 지향 프로그래밍이라는 의미이며 C#이 이에 해당하는 언어이다.

객체란 눈에 보이는 모든 것이 해당할 수 있으며 심지어는 생각, 날씨 등도 객체가 될 수 있다. 쉽게 이해하거나 정의내리긴 어렵지만 간략하게 객체들은 각각 상태(state)와 행동(behavior)을 지니고 있다. 자동차를 예로 들자면 자동차의 색, 속도 등이 상태가 될 수 있고, 속도를 올리거나 브레이크를 밟거나 하는 등의 동작은 행동이 될 수 있다.

C# 프로그래밍에선 상태는 데이터(변수)로, 행동은 메소드(함수)로 표현할 수 있다. 즉 객체는 데이터와 메소드로 이루어져있다는 말과 같다. 예를 들어 붕어빵이라는 객체를 만들기 위해서는 붕어빵 틀이 필요하고, 그 틀을 클래스라고 표현할 수 있다. 클래스라는 틀이 있으면 붕어빵이라는 객체를 계속해서 만들어낼 수 있다는 말이다.

객체 지향의 특징

  • 캡슐화
    데이터와 코드를 외부에서 알 수 없게 감추는 것
    외부에서는 필요한 정보만 알 수 있다.
  • 추상화
    객체들의 공통적인 특징을 추려내는 것
    불필요한 부분은 제외하고 중요한 부분에 중점을 두어 간략화하는 것
  • 상속
    클래스 간에 상위 하위 개념이 존재하며, 하위 클래스는 상위 클래스를 활용할 수 있다.
    클래스를 재사용하여 반복적인 코드들을 줄일 수 있다.
  • 다형성
    프로그램 언어의 각 요소(상수, 변수, 식, 오브젝트, 함수, 메소드)들이 여러가지 타입을 가질 수 있다.

class

데이터의 개수가 많아진다면 일일이 코드를 입력하기 어려워진다. 공통된 부분들을 추려서 '추상화'하여 class를 생성하면 코드가 불필요하게 길어지지 않고 수정도 용이해진다.

class의 형태

[접근 제한자] class test <- class의 이름
{
    // 필드, 메소드(함수) 등
}

ex) 캐릭터의 정보로 class를 생성해보자

string userName1 = "Chad";
string job1 = "전사";
int level1 = 50;

string userName2 = "MelonG";
string job2 = "마법사";
int level2 = 23;

string userName3 = "Dtail";
string job3 = "도적";
int level3 = 100;

위의 캐릭터 개수는 세개지만 만약 백개가 넘어간다면 일일이 코드를 입력하기엔 무리다.

class Character
{
		string userName; // 캐릭터의 이름을 나타내는 필드
		string job;     // 캐릭터의 직업을 나타내는 필드
		string level;   // 캐릭터의 레벨을 나타내는 필드

		public void IntroduceCharacter()  // 메소드(함수)를 만들어서 실행
		{
				Console.WriteLine("제 이름은 " + userName + " 입니다 ");
		}
}

class`로 틀은 만들었으나 '객체'가 없어서 실행되지 않는다.

Character myCharacter = new Character(); // Character class로 myCharacter 객체를 생성함

myCharacter.userName = "chad";        // class 내부의 필드 데이터들을 초기화 시킴
myCharacter.job = "전사";                 객체.필드 = 데이터
myCharacter.level = 20;

myCharacter.IntroduceCharacter();      // class 내부의 메소드를 호출함

class Character
{
		string userName;
		string job;
		string level;

		public void IntroduceCharacter()
		{
				Console.WriteLine("제 이름은 " + userName + " 입니다 ");
		}
}

위의 코드는 예문이었으나 에러가 발생했다. 아래는 검색을 통해 원인을 분석한 뒤 수정한 코드이다.

Character myCharacter = new Character();
myCharacter.userName = "chad";
myCharacter.job = "전사";
myCharacter.level = 20;

myCharacter.IntroduceCharacter();


class Character
{
    public string userName; // public으로 접근 제한자를 지정하여 해결함
    public string job;
    public int level;      // 데이터 형식이 정수인데 string이었던 것을 수정함

    public void IntroduceCharacter()
    {
        Console.WriteLine("제 이름은 " + userName + " 입니다.");
    }
}
// 출력: 제 이름은 chad 입니다.

접근 제한자를 지정하지 않으면 기본 보호 수준(접근 수준)이 private제한자이다. 이것은 class내부에서만 접근이 가능하다. 모든 곳에서 접근이 가능한 public 제한자를 class내부 필드 앞부분에 입력하여 외부에서 필드의 데이터를 초기화할 수 있게 되었다.

Feedback

에러의 원인을 분석하고 수정하는 과정에서 성취감과 즐거움을 느낀다.
계속해서 모르는 개념과 단어들이 추가되고 있다. 복기를 통해 빠르게 익숙해지는 것이 관건인 듯싶다.

0개의 댓글