brunch

You can make anything
by writing

C.S.Lewis

by 내가 사는 세상 Dec 05. 2023

개체지향 - 시작하며

목차

0. 서론

1. 개체지향의 필요성 - 구조체의 한계

2. 개체지향의 핵심 7가지 성질

3. 개체만들기 Quick Start

4. 생성자 : 개체 만들기 초기설정




0. 서론


 사람은 많은 것을 개체로 인식한다. 도로에 달리는 자동차 하나하나, 식탁에 놓여있는 반찬 하나하나를 인식하듯 말이다. 이런 직관적인 인식을 프로그래밍에도 적용시키면 코드 짜기가 쉬워질 것 같아 개체지향이 등장했다.




1. 개체지향의 필요성 - 구조체의 한계


 물론 코딩 언어의 부모격인 C언어에도 이와 비슷한 역할을 하는 것이 있다. 바로 구조체이다. 이는 사용자 정의 데이터 형식인데, 쉽게 말해, 나만의 자료형을 만드는 것이다.


#include <stdio.h>

// 구조체 정의

struct Point {

    int x;

    int y;

    // 함수가 들어가진 못함 ㅠ

};


int main() {

    // 구조체 변수 생성

    struct Point p1;

    // 멤버에 값 할당

    p1.x = 10;

    p1.y = 20;

    // 값 출력

    printf("Point coordinates: (%d, %d)\n", p1.x, p1.y);

    return 0;

}


 하지만 구조체에는 데이터만이 그룹지어 있을 뿐이다. 해당 개체가 필요로하는 동작(함수로 구현)은 없다. 굳이 구현하자면 해당 구조체를 인자로 받는 별도의 함수를 만들뿐이다. 즉, 상태(멤버변수)와 동작(멤버함수)를 모두 담고 있는 개체가 필요해진 것이다.




2. 개체지향의 핵심 7가지 성질(핵심특징 4 + 부수적 특징 3)


1. 캡슐화(encapsulation) : 상태(변수)와 동작(함수)를 하나의 개체에 모아둠, 정보 은닉(data hiding)

2. 상속(inheritance) : 부모 클래스를 물려받아 확장시킨 자식 클래스 : 코드 중복 방지 : 재사용성

3. 다형성(polymorphism) : 하나의 명령이 다른 상황에서 다르게 동작하는 것 : late binding : overriding

4. 추상화(abstraction) : 개체 속에 있는 실제 데이터, 함수 구현 방법에 종속 X


5. 연관(association)(vs 상속) : 구성품을 조립해서 개체 만들기 : 컴포지션, 집합으로 구분

6. 컴포지션(composition) : 구성품만으로는 의미 X

7. 집합(aggregation) : 구성품만이 의미 O




3. 개체만들기 Quick Start


 개체를 만드기 위해선 설계도가 필요하다. 이를 클래스라고 부른다. 클래스는 개체(인스턴스)를 만들기 위한 명세서 같은 것이다. 클래스는 붕어빵틀, 개체는 실제 붕어빵이다. 개념은 복잡하니 우선 간단한 개체를 하나 만들어보자. 



// JavaScript에서 클래스 정의

class Animal {

  // 생성자 메서드

  constructor(name, sound) {

    this.name = name // this는 나 자신(개체)을 말함

    this.sound = sound;

  }

  // 메서드

  makeSound() {

    console.log(`${this.name}이(가) ${this.sound} ~`);

  }

}

// 클래스 인스턴스 생성

const cat = new Animal('고양이', '야옹');

cat.makeSound();




# Python에서 클래스 정의

class Animal:

    # 생성자 메서드

    def __init__(self, name, sound):

        self.name = name // self 는 나 자신(개체)을 말함

        self.sound = sound

    # 메서드

    def make_sound(self):

        print(f"{self.name}이(가) {self.sound}~")

# 클래스 인스턴스 생성

dog = Animal('개', '멍멍')

dog.make_sound()




// Java에서 클래스 정의

class Animal {

    // 필드

    String name;

    String sound;

    // 생성자

    Animal(String name, String sound) {

        this.name = name;    // this는 나 자신(개체)을 말함

        this.sound = sound;

    }

    // 메서드

    void makeSound() {

        System.out.println(name + "이(가) " + sound + "~");

    }

}

// 클래스 인스턴스 생성과 사용

public class Main {

    public static void main(String[] args) {

        Animal cow = new Animal("소", "음메");

        cow.makeSound();

    }

}




4. 생성자 : 개체 만들기 초기설정


 클래스 내 멤버변수는 언제 만들어질까? 특정 멤버변수를 대상으로 하는 대입 연산을 처음 할 때이다. 그래서 멤버변수에 값이 대입되기전에 해당 멤버변수를 호출하면 에러가 나타난다. Animal의 name을 정하지도 않았는데, 이를 호출하면 고양이인지 개인지 소인지 모르기 때문에 에러가 나는 것이다.


 이를 방지하기 위해 생성자 사용한다. 생성자를 사용하면 기본적인 변수 설정이 이루어지므로, 개체 생성후 곧바로 멤버변수를 호출해도 에러가 안난다. 생성자 호출이 끝나는 시점이 개체 생성이 완료되는 시점이다. 개체의 초기세팅을 끝낸 것이다.



 

위의 예제에서 생성자만 따로 떼어내서 보면 다음과 같다.

javascript에선

 constructor(name, sound) { ~~~ }


Python에선

def __init__(self, name, sound):

    ~~~


Java에선

 Animal(String name, String sound) {

        this.name = name;    // this는 나 자신(개체)을 말함

        this.sound = sound;

    }




참고자료


POCU : COMP2500 개체지향 프로그래밍 및 설계 (Java)

윤성우 : 윤성우의 열혈 파이썬 중급편

keyword
매거진의 이전글 컴퓨터 구조 - 메모리 - RAM
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari