250x250
Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

minjea.dev의 코딩블로그

[c#] 클래스 본문

코딩강좌/c#

[c#] 클래스

minjea.dev 2022. 4. 9. 12:00
728x90

객체

일단 클래스를 배우기 전에 여러분은 객체 지향 프로그래밍(Object Oriented Programming, OOP)에 대하여 알아 두셔야할 필요가 있습니다. 객체 지향 프로그래밍을 알려드리기 전에, 객체에 대하여 알아야 합니다

객체란 우리 주변에 모든 물체를 객체라 할수 있습니다. 여러분이 지금 이 블로그를 보고 있는 전자기기나, 책, 혹은 키보드, 마우스, 칫솔, 베개 등을 객체라 할수 있습니다.

또한 모든 객체는 각각 속성(attribute)과 행동(behavior)을 가지고 있습니다. 속성이란, 컴퓨터를 예로 들자면, 기기 이름, 운영체제, 혹은 컴퓨터 모니터의 면적 등이 모두 속성이 될수 있습니다. 그럼 행동은 무엇일까요? 행동은 동물을 예로 들자면, 음식을 먹거나, 움직이는 것들이 행동이라고 할수 있습니다.

이런 개념을 프로그래밍에 적용한 것을 객체지향 프로그래밍이라 하고, 객체지향 프로그래밍이 가능한 언어를 객체지향 프로그래밍 언어라고 부릅니다. 당연히 객체지향 프로그래밍이 가능한 c#도 객체지향 프로그래밍 언어에 속합니다.

근데 도데체 왜 객체지향을 사용할까요? 그 이유는 기본 자료형으로만은 무언갈 만들어내는데 한계가 생기기 때문입니다. 기본 자료형만으로는 당연히 한계가 생깁니다.

클래스

그럼 한번 클래스를 만들어 봅시다. 다음과 같은 문법으로 클래스를 생성할수 있습니다. (원래는 class 키워드 앞에 접근제한자라고 하는 특별한 무언가가 붙지만, 나중에 알아보기로 하고 지금은 그냥 넘어가기로 해요 :) )

아래는 클래스를 선언한 예제입니다.

class Human {
    string name;
    int age;
    string gender;
    
    public void Eat() {
        Console.WriteLine(name+"(이)가 먹습니다");
    }
    
    public void Walk(int meter) {
        Console.WriteLine(name+"(이)가 "+meter+"미터를 걸었습니다.");
    }
}

이 코드는 Human 클래스를 정의하고, 안에 속성과 행동을 정의한 예제입니다. c#에서는 속성을 필드(field)로, 행동을 메서드(method)라고 부릅니다. 일단, 메소드와 필드에 대하여 알아보기 전에, 변수에 이 클래스를 대입해야 하는데요, 그럼 이 클래스를 어떻게 변수에 대입할수 있을까요?

이럴때는 new 연산자를 사용할수 있습니다. new 연산자는, 마이크로소프트의 설명을 그대로 이용하자면, new 연산자는 새로운 인스턴스를 만드는 연산자입니다. (출처) 그런데 인스턴스가 무엇일까요? 인스턴스란, 붕어빵을 만드는 틀이 있다고 하면, 그 틀을 가지고, 실체화된 진짜 "붕어빵"을 만들면, 그 붕어빵이 인스턴스가 됩니다.

즉, new 연산자를 이용하면 Human의 인스턴스를 생성할수 있습니다. 다음 코드는 woojin이라는 인스턴스를 만든 예제입니다.

// 위 Human 클래스 코드에 그대로 이어쓰세요
Human woojin = new Human();

그런데, 왜 woojin 변수 앞에 Human을 붙여주는 걸까요? 그것은 바로 클래스도 하나의 타입이기 때문입니다. 클래스를 이용하면 개발자는 자신이 원하는 타입을 정의할수 있게 되는 것이죠. 따라서, 우리가 int 형 변수를 선언할때, 변수명 앞에 int를 붙인 것처럼 말이죠. 따라서, 자신이 클래스를 통해 만든 "타입"형 변수를 선언할때도, 변수명 앞에 자신이 만든 클래스명을 붙여줘야 하는 겁니다.

그럼 이제 필드와 메서드에 대하여 알아봅시다.

필드
필드는 Human 클래스에서, name, age, gender 같은것들이 필드입니다(Eat는 메서드라는 것입니다)

필드에 값을 대입하거나, 값을 가져올때는 다음과 같이 할수 있습니다

인스턴스.필드명 = 값; // 값 대입
[필드타입과 일치하는 타입] 변수명 = 인스턴스.필드명; // 값 가져오기

그럼 위 내용을 그대로 사용한 예제를 보여드리겠습니다. 아래 코드를 봐 주세요

// 이 공간을 Human 클래스 선언문으로 변경해주세요
Human woojin = new Human();
woojin.name = "우진"; // 값 대입
woojin.age = 100; // 값 대입
woojin.gender = "Men"; // 값 대입

string name = woojin.name; // 값 가져오기
int age = woojin.age; // 값 가져오기
string gender = woojin.gender // 값 가져오기

이제 좀 이해가 되셨나요? 그런데, 이 코드를 실행하면 에러가 발생합니다. 왜 그럴까요? Human 클래스의 필드는 현재 접근이 불가능한 상태이기 때문입니다. 아까 짠 Human 클래스 선언문을 보시면 다음과 같이 되어 있을 겁니다.

class Human {
    string name;
    int age;
    string gender;
    
    public void Eat() {
        Console.WriteLine(name+"(이)가 먹습니다");
    }
    
    public void Walk(int meter) {
        Console.WriteLine(name+"(이)가 "+meter+"미터를 걸었습니다.");
    }
}

그런데 이 코드는 아래 코드와 동일합니다.

class Human {
    private string name;
    private int age;
    private string gender;
    
    public void Eat() {
        Console.WriteLine(name+"(이)가 먹습니다");
    }
    
    public void Walk(int meter) {
        Console.WriteLine(name+"(이)가 "+meter+"미터를 걸었습니다.");
    }
}

여기서 private는 접근제한자라는 것인데, 이 private가 붙은 필드나 메서드는 클래스 내부에서만 접근이 가능하고, 그 외(외부)에서는 접근이 불가능하게 하는 역할을 합니다(접근제한자는 다음 시간에 자세히 배우게 될 겁니다). 따라서, 이 필드는 외부에서 접근이 불가능한 상태였기 때문에 아까 인스턴스 필드에 접근해서 값을 대입하려고 할 때 오류가 발생했던 겁니다. 따라서, 이 필드를 공개 상태로 변경해야 값을 대입하거나, 값을 받아올수 있는 것이죠.

그러면 어떻게 필드를 공개로 변경할수 있을까요? 바로 public 키워드를 사용하면 됩니다. public 키워드도 접근제한자로써, 클래스 내부와 외부에서 모두 접근이 가능하게 하는 역할을 합니다. 따라서 Human의 선언부분을 다음과 같이 변경해 주시면 코드가 잘 작동할 겁니다.

class Human {
    public string name;
    public int age;
    public string gender;
    
    public void Eat() {
        Console.WriteLine(name+"(이)가 먹습니다");
    }
    
    public void Walk(int meter) {
        Console.WriteLine(name+"(이)가 "+meter+"미터를 걸었습니다.");
    }
}


메서드

메서드는 행동을 표현하는 것으로써, 다른 프로그래밍 언어에서는 함수, 또는 서브루틴, 프로시저라고 불립니다.(여기서 함수는 중학교때 배운 함수를 생각하시면 됩니다)

c#에서 메서드를 정의하는 방법은 다음과 같습니다. (다만 수학 함수와 달리 메서드는 값을 반환하지 않을수도 있을수도 있습니다.)

반환타입 메서드명(타입 매개변수명) {
    본문;
    return 리턴값;
}

void 메서드명(타입 매개변수명) {
    본문;
}

또한 아까 말씀드린 것처럼 public을 반환타입 앞에 써주셔야 외부에서 접근이 가능합니다. 또한 메서드를 가져오는 코드는 다음과 같습니다.

인스턴스명.메서드명();

이걸 이용하여 아까 선언한 Human의 인스턴스인 woojin에서 Walk메서드를 가져오는 코드입니다

woojin.Walk(10);

위 코드를 보시면 Walk 메서드에 10이라는 int형 값을 전달했습니다. 이것은 무엇일까요? 이것은 메서드의 인자라고 합니다. 이렇게 넘긴 인자는 Walk의 매개변수 meter에 대응되어 사용이 가능합니다. 따라서, 위 코드에서는 Walk 메서드에 10이라는 값을 전달한 것입니다(메서드에 인자에는 타입만 일치한다면 어떠한 값이든 전달이 가능합니다.).

 

이렇게 오늘은 클래스의 필드와 메서드에 대하여 알아보았습니다. 다음 시간에는 생성자,종료자를 배우면서 this까지 한번 보는 시간을 가지겠습니다.

728x90