목차
객체지향의 개념
객체지향 프로그래밍은 객체가 상호작용하는 방식으로 프로그램을 만드는 방법이다.
이런 객체지향 프로그래밍은 캡슐화, 다형성, 상속이라는 특성이 있다. 이 특성들을 가지고 있지 않으면 객체지향 언어라고 불릴 수 없을 만큼 중요한 특성이다. 내가 공부해온 책에서는, 또 하나의 특성, '합성'을 더해 객체지향을 말한다. 그런 객체지향의 특성을 나열해보자면
- 캡슐화
- 다형성
- 상속
- 합성
이 되겠다.
객체지향 프로그래밍을 하기 전에, 일단 객체가 무엇인지 알아야 객체지향적이 무엇인지 알고 프로그래밍을 할 수 있지 않겠는가?
먼저 객체가 무엇인지 알아보도록 하자
객체란?
일단 책에서 말하는 객체의 정의를 보고 알아가자.
'객체는 우리가 인식하는 모든 대상, 물체 등 객관적으로 인식할 수 있는 대상이다'
예를 들어, 우리가 공원을 걷다가 산책하고 있는 개 한 마리를 보았다. 그 때 '산책하던 개' 는 객체가 된다. 이 개에게는 눈, 코, 다리 등 속성(attribute)가 있고, 뛰기, 냄새 맡기, 자기 등 행위(behaviors)등을 갖고 있다.
그렇다면, 프로그래밍에서의 객체는 무엇일까? 현실 세계의 객체와 동일하게 이루어져 있다. 다만 어떤 대상의 속성(attribute) 을 데이터로, 행위(behaviors) 를 메서드(method) 로 나타낸다. 또, 프로그램에서의 객체는 '자율성'을 가진다. 우리의 예시 '개'를 다시한번 살펴보면, 개가 자기 자신에게 이름을 짓고, 눈 색깔을 바꾸는 등 현실 세계에서는 할 수 없는 일을 하는 모습을 볼 수 있다. 이 객체들이 상호작용하면서 하나의 프로그램을 만들어간다.
객체가 저렇게 생겼다는 것은 알겠는데, 그럼 어떻게 만들고 어떻게 생성해야 하는 걸까? 그 답은 '클래스(class)' 가 갖고 있다. 클래스는 객체의 기본적인 정보를 담아 놓은 '설계도'이다. 우리는 이 클래스를 작성해서 객체를 생성하는 것을 '인스턴스화' 한다고 말한다.
클래스에는 객체가 어떤 속성을 갖고 어떤 행위를 하는지 명시되어 있다. 조금 전 예로 들었던 '산책하던 개' 를 데려와서 한번 보자.
개 🐕 | |
---|---|
name | setname() |
eyescolor | getname() |
seteyecolor() | |
geteyecolor() |
위의 Dog클래스는 이렇게 정의 된다.
public class Dog{
//속성(atribute)
private String name;
private String eyescolor;
//메서드(method)
public void setname(String N){
this.name = N;
}
public String getname(){
return this.name;
}
public void seteyecolor(String color){
this.eyescolor = color;
}
public String geteyecolor(){
return eyescolor;
}
}
- 속성
클래스의 데이터는 속성(attribute)로 표현된다. 우리가 만든 Dog 클래스에서는 name, eyescolor등이 속성으로 정의되었다.
- 메서드
클래스의 메서드는 행위를 구현한다. 클래스가 인스턴스화 된 모든 객체는 이 메서드를을 포함하고 있다. 이런 메서드는 다른 객체로부터 메세지를 받아 응답을 줄 수 있으며, 객체가 해야 할 행동 등을 하게 만든다. - 메세지
메세지는 객체들이 서로 소통하는 수단이다. 예를 들어, Dog의 주인의 친구가 Dog의 이름을 알고 싶다고 한다. Dog에게 getname()에 메세지를 보내서 이름을 알아낼 수 있다. 이런 식으로 객체들은 서로 소통하며 프로그램을 구성해 나간다.
이 클래스를 핵심만 뽑아내어 모델링 한 그림이 있는데 바로 '클래스 다이어그램'이라는 그림이다. 우리의 예제 Dog를 가져와서 모델링 해보자.
위를 보면, 속성과 메서드가 분리되어 있고 속성은 '-'표시 '+'표시로 나타내어져 있다. 이는 클래스 내의 공개 여부에 따라 달라지는데, 이는 후에 설명하면서 알아가도록 할 것이다.
'OOP' 카테고리의 다른 글
추상클래스와 인터페이스 (2021.01.03) (0) | 2022.08.04 |
---|---|
생성자 (2020.11.12) (0) | 2022.08.04 |
오버로딩, 오버라이딩 (2020.10.23) (0) | 2022.08.04 |
상속 (2020.10.17) (0) | 2022.08.04 |
캡슐화 (2020.09.23) (0) | 2022.08.04 |