레이블이 객체인 게시물을 표시합니다. 모든 게시물 표시
레이블이 객체인 게시물을 표시합니다. 모든 게시물 표시

2015년 10월 13일 화요일

자바스크립트(ECAMScript5) 객체의 상속

 자바스크립트(ECMAScript 5) 객체의 공용 멤버와 공용 메소드는 다음과 같이 만드는 것이 일반적인 것 같다.

var A = function(name) {
   console.log("constructor A.");
   this.name = name; //공용 멤버
}
A.prototype = {
   who: function() { //공용 메소드
       console.log("I'm "+this.name);
   },
};

즉 공용 멤버는 생성자 함수 안에서 this 키워드로 만들어지고 공용 메소드는 prototype 객체 안에 정의한다.

 이제 이렇게 생성된 객체 A를 상속해서 새로운 객체 B를 정의하는 방법을 알아보자. 상속이란 기존 객체의 모든 공용 멤버를 복사하여 그대로 사용하면서 거기에 새로운 멤버나 메소드를 추가하는 방식으로 객체를 재사용하는 방법이다. 여러 방법 중에서 ECMAScript5 에서 도입된 Object.create() 함수를 사용하는 일반적인 방법은 다음과 같다.

var B = function(name, age) {
   console.log("constructor B.");
   A.call(this, name); // (1)공용멤버를 상속(복사)한다.
   this.age = age; // 새로운 멤버 추가
}
B.prototype = Object.create(A.prototype); //(2)공용메소드를 상속(복사)
B.prototype.constructor = B; //(3)생성자를 복원한다.
B.prototype.who2 = function() { // 새로운 메소드 추가
   console.log("I'm "+this.age+" years old.");
}

위에서 보면 세 가지 단계가 필수적이다.

(1) 공용 멤버를 상속(복사)하기 위해서 생성자 함수 내부에서 A.call() 함수나 A.apply()함수를 호출하여 공용 멤버들을 복사하는 단계
(2) 공용 메소드들을 복사하기 위해서 Object.create() 함수를 호출하는 단계
(3) 생성자를 복원하는 단계

만약 상속받는 객체의 생성자 함수의 인자들과 원 객체의 생성자 함수 인자들이 동일하다면 A.apply() 함수를 이용하여 인자 전체를 넘긴다.

A.apply(this, arguments);

그렇지 않고 일부만 선택적으로 사용한다면 예제와 같이 A.call()함수를 사용할 수 있다.



2015년 5월 30일 토요일

파이썬의 클래스(class) 정의 및 객체 생성

 파이썬은 클래스를 지원하므로 객체 지향적인 프로그래밍을 할 수 있다. 사실 지금까지 다뤄온 기본 자료형도 다 클래스이다. 클래스는 새로운 자료형을 정의하는 것이고 객체(object)는 클래스의 인스턴스(instance, 클래스가 구체화된 것)를 의미한다.

클래스는 다음과 같이 정의한다.

class 식별자:
클래스 본체

보통 클래스의 식별자는 대문자로 시작한다. 예를 들어 Person, Robot, Car, Point 등이다. 클래스 본체는 이 클래스에 속하는 변수와 함수를 정의하게 된다. 특별히 클래스에 속한 변수들을 필드(field), 클래스에 속한 함수들을 일반 함수들과 구분하기 위해서 메소드(method)라고 부르며 이 둘을 통칭하여 속성(attribute)라고 한다.

이 용어들에 대해서는 숙지해 두는 것이 좋다.

  • 필드 (field) : 클래스에 내장된 변수
  • 메쏘드 (method) : 클래스에 속하는 함수
  • 속성 (attribute) : 필드와 메쏘드를 통칭하여 속성이라 한다.

가장 간단한 형태의 클래스를 다음과 같이 정의해 보자.

class Robot:
pass

이 클래스는 보면 알겠지만 본체가 없다. 이 클래스의 인스턴스를 생성하려면 다음과 같이 하면 된다.

>>> asimo = Robot()

이제 asimo 는 Robot 클래스의 객체가 되었다. 이와 같이 어떤 클래스의 객체(인스턴스)를 생성하려면 다음과 같이 한다.

변수명 = 클래스명()

마치 함수를 호출하는 것과 유사하다.


2015년 5월 11일 월요일

C++의 클래스(class) 객체의 생성

 이전 포스트에서 예로 들었던 다음과 같은 간단한 Rect 클래스가 선언되었다고 하자.
// 클래스 선언부
class Rect {
   public:
       int width, height;
       int getArea();
};
// 클래스 구현부
int Rect::getArea() {
   return width*height;
}


이것을 가지고 실제로 객에를 구현하는 방법에 대해 알아보자.


객체의 생성



 클래스가 선언되었다면 이제는 그것을 이용하여 실제 사용할 객체(object)를 생성할 수 있다.
Rect rect1;


이것을 실행하면 rect1 이라는 Rect 클래스를 구현한 객체가 생성되며 이것을 클래스의 객체, 혹은 인스턴스(instance)라고 칭한다. 클래스의 인스턴스의 이름은 일반적인 변수 규칙에 따른다.


 인스턴스가 생성되었다면 public 멤버들은 닷(.) 접근자로 접근할 수 있다. 인스턴스의 이름 바로 뒤에 닷을 찍고 멤버의 이름을 써주면 된다. 예를 들면 다음과 같다.


rect1.width = 10;
rect1.height = 15;
int area1 = rect1.getArea();
첫 번째 줄과 두 번째 줄은 멤버 변수 width 와 height 의 값을 10과 15로 설정하는 부분이고 세 번째 줄에서 getArea() 멤버 함수를 호출하여 지정한 값으로부터 면적을 계산하는 것이다. 결과값으로 area1 변수는 150 값을 가지게 될 것이다.
 클래스 Rect를 이용하여 얼마든지 새로운 객체를 생성할 수 있다. 마치 클래스 선언은 도장과 같고 객체 생성은 도장을 찍는 것과 같다. 얼마든지 객체를 생성할 수 있다.
Rect rect2, rect3, rect4;
rect2.width = rect2.height = 12;
rect3.width = rect3.height = 13;
rect4.width = rect4.height = 14;
이렇게 선언하고 값을 지정한 경우 rect2.getArea() 함수값과 rect3.getArea(), rect4.getArea() 함수값은 각각 어떤 값을 반환할 것인지 추측해 보자.

객체의 멤버 접근



 앞에서 언급한 대로 인스턴스를 이용하여 멤버를 접근할 때는 닷(.)을 사용한다.


Rect myRect, yourRect;
myRect.width = 10;
myRect.height = 20;
yourRect.width = 30;
yourRect.height = 40;
이때 myRect 와 yourRect 의 width 변수는 각각 완전히 별개의 변수이다. height 변수도 마찬가지로 서로 다른 변수이다. 클래스의 인스턴스가 생성되면 별도의 메모리에 멤버변수가 저장될 곳이 할당된다. 그리고 myRect.getArea() 함수가 내부적으로 접근하는 변수는 myRect에 할당된 width 와 height 이다. yourRect.getArea()도 yourRect 에 내부적으로 할당된 변수를 이용한다.





c{c++},n{c0018}