본문 바로가기

기타/객체지향 토막글

속성, 메소드, 생성자 - 수필객체지향

+ 속성
속성을 찾는 일은, 보이지는 않지만 생물이 생존하는데 꼭 필요한 적혈구등의 요소를 현미경으로 관찰하는 생물학자와 같아야 한다.

속성은 객체 고유의 특징을 정의 할 수 있는 단어로 드러낸 것이다. 예를 들어 자동차에는 ‘움직일때의 빠르기’라는 속성을 속에 품고 있다. 만약 자동차를 객체로 모델링 한다면 기본적으로 ‘움직일때의 빠르기’라는 속성이 스며들어 있기 때문에 이 속성을 정의 할 수 있는 단어로 밖으로 드러내야 할 것이다. ‘움직일때의 빠르기’는 ‘속도’ 라는 단어로 정의 된다. 그래서 자동차 객체 모델링을 통해 ‘속도’라는 속성이 문서나 프로그램을 통해 드러나게 될 것이다.

객체의 속성을 찾는 일은 객체 안에 숨겨진 고유 특징을 찾아내는 일이기 때문에, 그 객체에 대해 잘 알고 있어야 한다. 그리고 그 객체의 중요하고 핵심적인 특징만 밖으로 추출할 수 있어야 한다.

그래서 속성을 찾아내는 일은 객체를 잘 ‘관찰’ 하고 객체의 주요 특징을 밖으로 ‘추상화’ 하는 사고 능력이 요구된다.

[삽화]

+ 메소드

메소드는 행동이라고 표현하고 기능이라고도 표현한다. 그런데 메소드의 의미는 그 객체가 다른 객체에게 제공하는 기능의 의미에 가까우므로 다른 객체에게 제공하는 ‘기능’으로 정의하는 것이 더 좋을 것 같다.

메소드는 객체 고유의 기능 또는 행동을 정의 할 수 있는 단어로 드러내고, 그 기능과 행동을 코드로 구현한 결과물이다.

메소드는 객체의 속성을 변경하는 통로이다. 객체지향의 효과를 얻고 객체지향의 관례를 따르면 속성은 외부로부터의 접근이 차단되어 있고 메소드를 통해서만 접근이 가능해야 한다. 그래서 메소드는 객체의 속성을 변경하는 통로가 된다.

만약 자동차의 속도를 증감 해야 하는데, 자동차 부품에 무리를 주지 않고 증감하려면 꼭 ‘속도 증감 제어 장치 메소드’를 통하게끔 구현이 되어 있다. ‘속도 증감 제어 장치’에는 자동차 객체의 속도를 객체 설계자 의도대로 변경하는 로직이 구현 되어 있다. 자동차의 속도라는 속성은 오직 ‘속도 증감 제어 장치’ 메소드에 의해서만 통제된다. 그래서 자동차 객체의 무결성, 안전성을 자동차 객체 사용자에게 보장할 수 있다.

메소드는 다른 객체와 상호작용하는 통로이다. 객체지향 세계는 객체와 객체간의 관계가 성립하고, 객체들끼리 주고 받는 메시지로 프로그램이 작동되고 결과물이 완성됨을 확인 할 수 있다. 객체들끼리 메시지를 주고 받는 도구가 메소드이다. 메소드를 통해 객체들끼리 상호 작용한다.

객체의 속성이 은밀하고 수동적이라면 메소드는 적극적이고 능동적이다. 다른 객체에게 ‘내가 제시한 기능을 쓰시오’라고 드러내놓고 노출하기 때문에 적극적이고, 객체들끼리 메시지를 주고 받으면서 자신이 속하는 프로그램의 결과물을 좌지우지하기 때문에 능동적이다.

객체의 메소드를 찾고 구현하는 일은 역시 객체 안에 숨겨진 고유 기능과 행동을 찾아내는 일이기 때문에, 그 객체에 대해 잘 알고 있어야 한다. 그리고 그 객체의 중요하고 핵심적인 기능과 행동만 밖으로 추출할 수 있어야 한다.

그래서 메소드를 찾아내고 구현하는 일은 객체를 잘 ‘관찰’ 하고 객체의 주요 기능과 행동을 밖으로 ‘추상화’ 하는 사고 능력이 요구된다.

[삽화]

+ 생성자

생성자는 식물이 씨앗을 벗고 발아하는 것과 병아리가 알을 깨고 부화하는 바로 그 순간에 해야하는 일과 같다. 생성자는 객체가 처음 생성될때 호출되는 메소드이다.

- 실행 클래스
public static void main( String[] args ) throws Exception {
    …..
    ExObject exObject = new ExObject(); // 1
    …...
}

- 예제 클래스
public class ExObject {
    public ExObject () { // 2
        // 객체 생성시 해야할 일
    }
    …..
}

위의 코드처럼 주석1, 실행 클래스가 예제 클래스를 생성하면, 주석2, 객체의 생성자가 호출 된다. 생성자는 객체가 최초에 생성될때 호출되는 곳이기 때문에, 객체가 처음 생성되었을 때 객체가 특별한일을 해야 한다면 생성자를 통해 편리하게 구현할 수 있다. 예를들어 병아리가 처음 세상에 나왔을 때 해야하는 일이 어미닭으로부터 먹이를 먹는 일이라면 생성자에 먹이 먹는 로직을 추가하면 된다.

객체가 처음 생성 되었을 때 해야하는 일이 있다면 생성자를 통해 편리하게 구현할 수 있다. 그리고 경우에 따라 여러 생성자가 필요하다면, 생성자의 ‘인자값’을 다르게 주어 같은 이름의 여러 생성자/메소드를 호출하는 객체지향의 ‘오버로딩’ 기법을 이용할 수 있다. 그래서 원하는 생성자를 호출할 수 있다. 또한 만약 생성자가 필요 없다면 생성자 코드를 아예 구현 하지 않아도 좋은데 이때 컴파일러는 기본적으로 아무 인자도 없는 ‘디폴트 생성자’를 기본적으로 구현하고 있다.

- 생성자 오버로딩 예제-실행 클래스
public static void main( String[] args ) throws Exception {
    …..
    ExObject exObject1 = new ExObject(); // 1
    ExObject exObject2 = new ExObject(“인자1”); // 2
    ExObject exObject3 = new ExObject(“인자1 “, “인자2”); // 3
    …...
}

- 생성자 오버로딩 예제-예제 클래스
    public class ExObject {
        public ExObject() { // 디폴트 생성자, 없어도 컴파일러에서 기본적으로 생성함
        }

        pulbic ExObject(String message1) {
            System.out.println(message1);
        }

        pulbic ExObject(String message1, String message2) {
            System.out.println(message1 + message2);
        }
    }


덧) 아직 고쳐쓰기가 덜 되었고, 삽화가 부족함을 이해해 주시길 바라며, 향후 책에 쓰일 원천 자료이기 때문에 펌은 불허, 링크 환영 합니다. 조언 부탁드립니다. ^ ^;