'아주대'에 해당되는 글 2건

  1. 2007/05/29 자취하고 싶으신 분 (2)
  2. 2006/11/19 C++에서 Visiblity와 Accessibility (6)

자취하고 싶으신 분

Posted by 진영 Life.log : 2007/05/29 09:53
제가 예정대로라면 아마 다음학기에 수원에 있지 않을 예정이어서,

 지금 살고 있는 원룸을 비워야 합니다.

 하지만 =_= 원룸주와 동향 출신이란걸 빌미로 샤바샤바해서 값싸게 계약한 집이라서...

돌아와서 이만한 방을 구하는 것이 조금 걱정 되는군요...

그래서 혹시 한터에 원룸에 살고 싶으신 분이 있으면,
 
제가 수원을 떠나있는 6개월 정도 제 방에서 살아보시면 어떨까 하고 글을 씁니다.
 
군대 다녀와서 복학하는데 집이 없는 분이라던지,
 
기숙사에 있다가 자취하고 싶은데 이래저래 부담되시는 분 등등 환영합니다.
 
일단 제 방은 현재 보증금 300에 22만원으로 계약되어있는데,
 
만약 살고 싶으신 분이 계신다면

제가 계약 연장을 해서 보증금 없이 -_-

6개월동안 월세(22) 관리비(2) 기타(전기, 가스, 인터넷)만 내고 사시면 됩니다.

뭐 아시는 분은 아시겠지만 -_-; 집은 반지하입니다.

하지만 -_- 상당히 이쁘다고 생각합니다. 신축이라 깨끗하기도 하고요.

앞에는 무려 -_- 공원 비슷한 놀이터도 있습니다.

집주변은 조용한 편이고, 방은 혼자살기에는 과분한 크기이고, -_-

제가 추구하는 커다란 화장실도 가지고 있습니다.

추가로 냉장고, 에어컨, 세탁기, 가스렌지는 빌트인(built-in)입니다.(집에 딸려있다는 거죠.)

물론 6개월만 사시는거면 자취 용품 구입하는게 어느정도 부담이 되실텐데 -_-..

걱정없이 어차피 돌아올꺼 제가 사용하고 있는 자취용품 전부 놓고가겠습니다.

옷수납장, 책상2개, 의자, 시계, 거울, 침대, 행거, 취사용품 등등 많습니다.

그냥 몸만 있으면 바로 살 수 있는 수준.... 아래는 사진입니다. -_-;

포샵 이런거 안 썼으니 -_- 저 모양 그대로라고 아시면 될 것입니다.

이미 와 본 사람들은 다들 좋다고 칭찬하는 집이니 자취 고려해보신 분은 제게 연락해주세요.
장담컨데 이 정도면 매우 좋은 조건입니다. 그러니까 저도 계속 살려고 하는 거죠.

리플이나 전화 환영!!

o1oㅡ473oㅡ4235

태그 : 아주대, 자취, 한터

C++에서 Visiblity와 Accessibility

Posted by 진영 Info.log : 2006/11/19 17:29

갑자기 필요해진 기술 포스팅입니다.

오늘은 언젠가는 포스팅 하려고 생각해두던,
C++의 Member Access Control에 대해서 드디어!! 포스팅 해볼까 합니다.

일단 다들 아시듯,
C++의 컴파일러는 Member Access Control을 위해서 두가지의 조건정하고,
이를 기반으로 이 모두를 만족해야 멤버의 접근을 허용합니다.
이것은 바로 Visiblity와 Accessibility인데요.
여기서 Visibility는 다들 아시는 멤버가 가지는 scope입니다.
이건 너무나 기초적이고, 직관적으로 이해하는데 어려움이 없으니 이야기를 하지 않고 accessiblity에 대해 이야기를 해보도록 하죠.
뭐 기본적으로 class와 관련된 accessiblity의 지원을 위해서 c++은 public과 protected, 그리고 private를 지원합니다.
각각의 기능 역시 널리 알려진 정보이니 특별히 언급하지는 않겠습니다.
다만 이것들을 사용하면서 복잡한 상속관계에서 이들의 접근에 모호한 점이 많아 지므로 이에 대해 정리해보도록 하겠습니다.
이를 잘 이해하기 위해서는 상속의 명확한 이해가 요구되는데, 이가 명확히 이해되었다는 전제하에 accessiblity의 지원은 매우 단순하고 간단한 정도의 이해만이 요구됩니다.
일단 처음 객체지향을 배울때 주로 잘 못 생각하게 되는 상속의 실질적인 모양세입니다.


네 이런 형식의 모양이 바로 A를 상속한 자식 클래스 B의 모습인데요, 저렇게 표현한 이유는 서로 중복되는 이름을 가지는 부모 클래스 A의 인스턴스 변수나 오버로딩된 메서드들이 사라지는 것이 아니라, 자식 클래스 B에 그대로 담겨 있다는 것을 나타내기 위해서입니다.

네 그럼 이걸 기반으로 다음의 예제를 살펴보죠.(예제는 아주대학교 이정태교수님의 수업자료에서 참조했습니다.)

class BaseClass
{
protected:
     int x;
private:
     int y;
public:
     BaseClass (int a, int b) { x = a; y = b;}
     void setX (BaseClass a) { x = a.x;}
     void setY (BaseClass b) { y = b.y;} 
     void printXY ( ) { std::cout << x << "  " << y << std::endl;}
};
class DerivedClass : protected BaseClass
{
public:
     DerivedClass (int a, int b) : BaseClass (a,b){ }
     void setXY (BaseClass a, DerivedClass b) {
	  //x = a.x;     // error, a is not DerivedClass type and x is protected
	  //y = b.x;    //error, y is private 
     }
};
int main( )
{
     BaseClass b1(1,2),b2(3,4),b3(5,6);
     DerivedClass d1(10,20),d2(30,40),d3(50,60);
     //std::cout << b1.x << std::endl;   // error , x is not accessible here
     b3.setX(b1); b3.setY(b2); b3.printXY ( );
     //d3.setXY (d1,d2);   // error d1 cannot be converted to BaseClass
     //d3.printXY ( );       // error, printXY is protected in DerivedClass
     return 0;
}


이 코드의 경우에는 DerivedClass가 BaseClass를 protected로 상속을 했을 때의 모습을 보여줍니다. 일단 부모 클래스에서의 여러 분기와 상속시의 protected등등으로 많은 생각을 하여서 변수를 사용해야 할 것 같지만, 이는 보기보다 매우 단순합니다.
C++의 경우에는 업캐스팅등의 효과적인 지원을 위해서 상송관계를 위의 그림처럼 부모 객체를 자식 객체가 가진 하나의 인스턴스로 생각합니다. 따라서 principle of substitution을 만족시키는 경우의 대체시에도 그저 자식 객체 안쪽에 들어있는 부모 객체를 사용함으로써 가능한 것입니다.
이런 특징 때문에 상속을 할때에도 public과 protected, 그리고 private를 지원하게 되는 것인데, 이는 자식 객체 내에서 상속받은 부모 객체 자체를 어떤 형식의 인스턴스로 생각하는가에 관한 것입니다. 이는 부모 객체 내부에서 존재하는 인스턴스 변수와 메서드들에 관한 public과 protected, 그리고 private 형식 지정자와는 완전히 독립적인 것으로 일단은 상속된 부모 객체에 접근하기 위한 accessiblity를 지정합니다.
괜히 말이 어렵게 쓰여진 것 같기도 한데 간단하게 위의 예제로 살펴보겠습니다.

void setXY (BaseClass a, DerivedClass b) {
     //x = a.x;     // error, a is not DerivedClass type and x is protected
     //y = b.x;     // error, y is private
}

우선 이부분에서는 어떤 것이 문제일까요?
일단 이 부분의 문제는 우선 x를 사용한 자신의 부모 클래스의 접근은 자신이 가진 내부 인스턴스인 부모class의 접근은 언제나 허용(설령 private 상속이더라도...)되고, 그 이후 BaseClass에서 x가 public으로 정의되었으므로, 이를 상속받은 클래스인 DerivedClass가 접근 하는 것이 허용됩니다. 하지만 아래에서 보여주는 y의 사용은 y가 private로 정의되어 있으므로, 상속받은 클래스 일지라도 불가능합니다.
이와는 다르게 a.x의 경우에는 완전히 외부에서 접근하는 것으로 인식되어서, 일단 DerivedClass형 객체인 a에서 protected형 인스턴스로 생각되어지는 BaseClass형 객체에 대한 접근이므로, a.x에서 x의 형식과 상관없이 DerivedClass까지의 접근 자체가 거부되는 것입니다. b.x의 경우에는 public형 인스턴스 변수에 대한 접근이니 문제가 없죠.

int main( )
{
     BaseClass b1(1,2),b2(3,4),b3(5,6);
     DerivedClass d1(10,20),d2(30,40),d3(50,60);
     //std::cout << b1.x << std::endl;   // error , x is not accessible here
     b3.setX(b1); b3.setY(b2); b3.printXY ( );
     //d3.setXY (d1,d2);   // error d1 cannot be converted to BaseClass
     //d3.printXY ( );       // error, printXY is protected in DerivedClass
     return 0;
}

여기서는 어떨까요?
우선 b1.x에 대한 접근은 위의 a.x와 같이 DerivedClass형 객체인 b1에서 protected형 인스턴스로 생각되어지는 x에 대한 접근 자체가 거부되는 것입니다.
아래의 d3.setXY(d1, d2) 에서는 BaseClass a 파라메터로의 d1의 대입이 요구되는데, 그러기 위해서는 d1 객체에서 인스턴스로 생각하고 있는 상속된 BaseClass의 정보 부분에의 접근이 요구됩니다. 하지만 위에서 상속시에 protected로 명시되어 있기 때문에, 외부에서 이에 대한 접근이 허용되지 않고, 따라서 대입이 불가능 하게 됩니다.
d3.printXY ( ) 에서는 "d3 객체에서 인스턴스로 생각하고 있는 상속된 BaseClass"의 메서드에 접근해야하기 위한 구분이므로 d3에서 먼저 BaseClass 정보로의 접근이 먼저 요구되는데 이때 protected형 인스턴스에 접근한 것과 같은 의미가 되어서 거부되게 되고, 따라서 printXY의 형과 관계없이 BaseClass의 도달 과정에서 accessiblity를 만족시킬 수 없게 됩니다.

장황하게 늘여 썼지만 Visiblity와 Accessibility는 컴파일 타임에 결정되는 문제이기 떄문에, 매우 단순한 과정을 거쳐서 서로에게 접근하게 되는 것입니다. 위에서 언급했듯 부모 클래스의 정보는 자식 클래스에서도 그대로 instance처럼 유지된다는 사실을 잊지 않는다면, 아마 Visiblity와 Accessibility 문제로 머리 아플 일이 많이 줄어들게 될 것입니다.

 «이전 1  다음»