'Computer_language/C++'에 해당되는 글 7건
- 2009.01.12 oop 객체 지향 프로그래밍(Object Oriented Programming, OOP)
- 2009.01.12 C++ class에서 함수정의에 사용된 static [출처] C++ class에서 함수정의에 사용된 static|작성자 정천사
- 2009.01.12 Static Class 에 대한 정의
- 2009.01.12 정적 중첩 클래스
- 2009.01.12 각 상속 테스트
- 2009.01.12 Ubuntu에서, c, c++관련 컴파일러 설치 [출처] Ubuntu에서, c, c++관련 컴파일러 설치|작성자 용이
- 2009.01.12 나눈 값을 표현하는 방법 즉 double 크기의 표현 방법 (float 4비트 double 8비트)
Teodor Zlatanov
프로그래머, Gold Software Systems
2002년 1월
보다 나은 펄(Perl) 프로그래밍을 위한 완벽한 가이드를 제공하고 있다. 이번에는 객체 지향 프로그래밍(OOP, Object Oriented Programming)에 대해 설명한다. 객체 지향 프로그래밍이 무엇이고, 언제 쓰이며, 펄에서는 어떻게 작용하는지를 설명할 것이다.
객체 지향 프로그래밍(Object Oriented Programming, OOP)
OOP는 프로그래밍 방식 또는 문제를 해결에 쓰이는 일반적인 접근방식이다. 절차적 프로그래밍과 함수 프로그래밍 방식과는 연관성이 적고, 그들과 잘 맞지 않는다.
이 글에서는 펄에서 OOP와 함수적/절차적 프로그래밍의 기초를 다루겠다. 그리고 펄 프로그램과 모듈에서 OOP를 사용하는 방법을 설명하겠다. 이 글은 요약에 그칠것이라는 것을 명심하라. 펄 OOP의 모든 부분을 설명하는 것은 무리이다. 그와 같은 것을 다루는 책이 많이 나와있으며 이미 여러차례 다루어졌다.(참고자료).
OOP가 정확히 무엇인가?
OOP는 객체를 사용하여 문제를 해결하는 기술이다. 프로그래밍 용어에서 객체(object)란 속성(property)과 동작(behavior)이 문제 해결에 주요하게 작용하는 엔터티(entity)이다. 정의를 좀 더 자세하게 내려야 하겠지만, 오늘날의 컴퓨터 산업에서 OOP 접근방식의 엄청난 다양성 때문에 불가능하다.
펄 프로그래밍에서, OOP는 필수적인 것은 아니다. Perl version 5 이상 버전은 OOP를 장려하지만 필요한 것은 아니다. 모든 펄 라이브러리는 모듈이다. 적어도 OOP의 기초를 사용한다는 것을 의미한다. 게다가 대부분의 펄 라이브러리는 객체로서 구현된다. 모듈을 사용하는 사람은 특정 작동과 속성을 지닌 OOP 엔터티로서 그들을 사용해야 한다.
기본적인 OO 프로그래밍 언어 특징
일반적으로, OO 프로그래밍 언어에 있어서 기본적인 세 가지의 특징이 있다. 상속(inheritance), 다형성(polymorphism), 캡슐화(encapsulation)가 바로 그것이다.
펄은 상속을 지원한다. 상속(Inheritance)은 하나의 객체(child)가 시작 포인트(parent)로서 다른 것을 사용하고 그런다음 필요할 경우에 속성과 동작을 변경할 때 적용된다. 이러한 자식-부모 관계는 OOP에 있어서 필수적이다. 재사용(reuse)은 OOP의 이점 중 하나이며 프로그래머들도 이러한 특징에 만족한다.
상속에는 두 가지 유형이 있다. 단일 상속(Single inheritance)은 자식이 단 하나의 부모를 가져야 한다. 반면 다중 상속(multiple inheritance) 은 좀 더 자유롭다. 실제로 둘 이상의 부모를 보게 될 경우는 드물지만 펄은 다중 상속을 지원한다.
다형성(Polymorphism)은 한 객체를 다른 것처럼 보이도록 만드는 기술이다. 펄에서, 다형성은 완벽히 지원된다. 펄 프로그래머들은 상속된 동작을 변경하는 것보다는 객체 속성을 가진 일반적인 작동을 변경하는 것을 더욱 선호하기 때문에 빈번하게 사용되는 것은 아니다. 234 포트의 UDP 패킷 리셉션과 트랜스미션에, 80 포트의 TCP 패킷 리셉션에, 1024 포트의 TCP 패킷 트랜스미션을 위해 세 개의 IO::Socket::INET
객체를 만드는 코드를 기대한다는 것을 의미한다. 첫 번째 경우에는 IO::Socket::INET::UDPTransceiver
를, 두 번째의 경우 IO::Socket::INET::TCPReceiver
를, 세 번째의 경우 IO::Socket::TCPTransmitter
를 사용하는 코드를 기대하기 보다는 말이다.
OOP 순수주의자들은 모든것이 적절하게 구별되어 한다고 느끼지만, 펄 프로그래머들은 순수주의자가 결코 아니다. 그들은 OOP 규칙에 대해 융통성을 발휘하고 있다.
캡슐화(Encapsulation)는 객체 작성자가 액세스를 허용하기를 원치 않는다면 사용자에게 액세스를 불가능하게 하는 방식으로 객체 작동과 속성을 인클로징한다는 것을 의미한다. 그러한 방식으로 객체 사용자들은 하지 못하도록 정해진 일을 수행할 수 없으며, 액세스 할 수 없도록 지정된 것에 액세스 할 수 없다(Listing 1).
왜 OOP가 강력한 방식인가?
어떻게 OOP가 강력한 방식이 될 수 있었는지 생각해보자. OOP에는 절차적/함수 프로그래밍 (PP/FP)에 적용하기에 까다로운 여러 주요 개념들이 있다는 것을 알았다. 우선, 무엇보다도, PP나 FP 모두 상속이나 클래스 다형성 개념이 없다. PP와 FP에는 클래스가 없기 때문이다. PP와 FP에서 캡슐화는 존재한다. 하지만 단지 절차적 레벨에서 존재하는 것 뿐이다. 결코 클래스나 객체 속성으로서 존재하는 것은 아니다. 따라서 프로그래머는 호환되지 않는 방식들을 섞는 것보다 전체 프로젝트에 OOP를 고수하는 것이 낫다.
OOP는 절차적 프로그래밍 방식과 함께 잘 작동하지 않는다. 왜냐하면 OOP는 객체에 집중하고 절차 프로그래밍은 프로시져(procedure)에 기반하기 때문이다. 마치 메소드(method)와 같은 프로시져는 사용자에 의해 호출되는 함수이지만 그 둘 사이에는 차이점이 없다.
프로시져는 객체 데이터를 가지고 있지 않다. 그들은 매개변수 리스트에 있는 데이터로 전달되거나 범위내에서 데이터를 사용해야 한다. 프로시져는 호출 시 이것으로 전달된 모든 데이터나 글로벌 데이터에 액세스 할 수 있다. 메소드는 오직 그들의 객체 데이터에만 액세스 해야한다. 실제로, 메소드용 함수 범위는 메소드를 포함하고 있는 객체이다.
프로시져는 글로벌 데이터를 사용하여 찾는다. 단, 절대적으로 필요할 때만 수행되어야 한다. 글로벌 데이터를 사용하는 메소드는 가능하면 빨리 다시 작성되어야 한다. 프로시져는 다른 매개변수들을 가진 다른 프로시져들을 호출한다. 메소드는 단지 몇 개의 매개변수만을 가지고 있어야 하며 다른 프로시져들 보다 자주 다른 메소드들을 호출한다.
함수 프로그래밍(FP)은 여러가지 이유로 OOP와 잘 섞이지 않는다. 가장 중요한 이유는 FP는 문제를 해결하는 데 있어서 세부적인 함수 접근방식에 기반을 두고 있고, OOP는 개념을 표시하기 위해 객체를 사용한다. FP 프로시져들은 어느 곳에서나 사용될 수 있지만, OOP 메소드는 그것을 보유하고 있는 객체내에서만 사용될 수 있다.
이제는 펄이 OOP, FP, PP 방식들을 섞는 최상의 언어인지를 설명할 수 있다.
펄에서 OOP를 절차적/함수 프로그래밍과 섞는 방법
펄은 프로그래머가 원하는 무엇이든 할 수 있도록 하기위해 길이를 한없이 늘일 수 있다. 이는 Java와 C++ 같은 언어들과는 극명하게 대조된다. 예를 들어, 펄에서 프로그래머는 이전에 선언되지 않는 변수를 자동으로 만들수 있다.
따라서 펄은 여러 방법들을 남용하기에 적합한 언어이다. 내부 객체 데이터에 액세스하고, 클래스를 변경하고, 메소드를 재 정의하는 것이 모두 가능하다. 펄의 규칙은 프로그래머들이 코딩, 디버깅, 실행 효율성에 맞게 규칙을 파괴할 수 있다. 작업을 수행하는데 도움이 된다면 괜찮다. 따라서, 펄 그 자체는 프로그래머에게 베스트 프랜드가 될 수도 최악의 적이 될 수도 있다.
규칙을 위반하는 것임에도 왜 사람들은 OOP, FP, PP를 섞기를 원하는가? 다시 근본적인 문제로 되돌아가 보자. OOP, FP, PP는 무엇인가? OOP, FP, PP는 툴이고 모든 프로그래머들이 하는 첫 번째 작업은 그들의 툴을 이해하는 것이다. 만일 프로그래머가 해시를 소팅할 때 FP Schwartzian 변형을 사용하지는 못하는데 Sort::Hashtable
을 작성할 수 있거나 또는 Sys::Hostname
모듈의 재사용을 실패했지만 대신 시스템의 호스트네임을 얻기 위해 절차 코드를 작성한다면, 그 프로그래머는 시간, 노력, 돈을 낭비한 것이 되고, 코드 품질과 신뢰성도 깎인다.
프로그래밍 팀은 최상이라고 믿고 있는 툴에 만족할 수 있다. 이것은 그들에게 일어날 수 있는 최악의 일이다. 프로그래머는 효율성을 증대시키고, 더 나은 코드를 만들 수 있으며, 팀을 더욱 혁신적으로 만들수 있는 방법이 무엇이든지 그 방법을 섞을 수 있어야 한다. 펄은 이러한 태도를 인정하고 장려한다.
OOP의 효용성
OOP의 효용성을 이 글에서 설명하기에는 너무나 많다. 또한 앞서 언급했듯이 이 주제를 다루는 책들이 많이 있다.
OOP는 기본적인 클래스와 객체에 의존하기 때문에 OO 코드를 재사용한다는 것은 필요할 때 클래스를 임포팅한다는 것을 의미한다. 코드 재사용은 OOP를 사용하기 위한 가장 중요한 이유이고, OOP가 오늘날의 산업에서 중요성과 대중성을 얻을 수 있는 이유이다.
단점도 있다. 예를 들어, 이전 문제에 대한 솔루션이 현재 상황에도 이상적으로 적용되지 않을 수도 있고 형편없이 문서화 된 라이브러리는 이해하고 사용하기가 힘들어 오히려 다시쓰는 편이 더 나을 때도 있다. 시스템 아키텍트의 임무는 이러한 단점을 보완하는 것이다.
코드 품질은 OOP를 이용하여 향상된다. 캡슐화는 데이터 오염문제를 없애기 때문이다. 상속과 다형성은 새로 작성되어야 하는 코드의 복잡성을 줄인다. 코드 품질과 프로그래밍 혁신 사이에는 미묘한 균형이 있고 각 팀은 팀의 목적에 맞게 이것을 활용해야 한다.
OOP의 상속과 재사용은 코드의 일관성있는 인터페이스를 가능하게 한다. 모든 OO 코드가 일관성있는 인터페이스를 갖추어야 한다는 의미는 아니다. 프로그래머는 일반적인 아키텍쳐를 고수해야 한다. 예를들어, 확장이 가능하고 사용하기 매우 편리한 모듈식의 인터페이스를 통해 에러 기록을 위한 포맷과 인터페이스에 팀은 합의를 해야한다. 그때야 비로소 모든 프로그래머는 에러가 많은프린트 문장 대신 인터페이스를 사용한다.
적응성(adaptability)은 프로그래밍을 할 때 다소 막연한 개념이다. 개인적으로는 이것을 환경과 사용 변화의 수락과 예견으로 정의하고 싶다. 모든 소프트웨어는 진화하기 때문에 적응성은 중요하다. 잘 작성된 소프트웨어는 발전해야 한다. OOP는 모듈식의 디자인, 향상된 코드 품질, 일관성있는 인터페이스를 이용하여 새로운 오퍼레이팅 시스템이나 새로운 리포트 포맷이 핵심 아키텍쳐에 급진적 변화를 주어야하는 필요성을 감소시킨다.
펄에서 OOP 사용하기
믿거나 말거나 지만 :) 펄에서 OOP는 초급 이나 중급 레벨이 어렵지가 않다. 고급 레벨의 사용도 복잡하지 않다. 펄은 프로그래머들에게 몇 가지 제한을 둔다.
첫 번째 단계는 펄 패키지를 이해하는 것이다. 패키지는 C++ 과 Java 라이브러리에 있는 네임스페이스(namespace) 같은 것이다. 펄 패키지는 프로그래머에게 자문역할을 한다. 기본적으로 펄은 패키지들 간에 데이터 교환을 제한하지 않는다.
Listing 1. 패키지 이름, 패키지 바꾸기, 패키지들 사이에 데이터 공유, 패키지 변수
|
파일 범위의 어휘 변수인 $extra_sound
는 세 패키지 ("main", "Pig", "Cow")액세스 할 수 있다. 이 예제에서 같은 파일 안에서 모두 정의되었기 때문이다. 일반적으로 각 패키지는 각자의 파일 안에서 정의되고 어휘 변수들은 패키지에 속하게 된다. 따라서 캡슐화가 가능하다. ( "perldoc perlmod
"를 실행해보라.)
다음에는 패키지들을 클래스에 결부시켜야 한다. 펄에서의 클래스는 단지 형식적인 패키지이다. (그와는 반대로 객체는 bless()
함수로 특별하게 만들어졌다). 펄은 OOP 규칙을 융통성있게 적용하여 프로그래머는 규칙에 제약을 받지 않는다.
new()
메소드는 클래스 컨스트럭터용 이름이다. 클래스가 객체로 인스턴스화 될 때마다 호출된다.
|
Listing 2에 있는 코드를 Barebones.pm 파일에 놓고 디렉토리에서 다음을 실행시켜서 테스트 할 수 있다:
|
예를 들어, print 문을 new()
메소드 안에 두어 $classname
변수가 무엇을 포함하고 있는지를 볼 수 있다.
Barebones->new()
대신 Barebones::new()
을 호출하면 클래스 이름은 new()
로 전달되지 않을 것이다. 다시말해서, new()
는 컨스트럭터가 아닌 평범한 함수로서 작동한다.
Y$classname
가 왜 전달되어야 하는지 궁금할 것이다. bless {}, "Barebones";
라고 부르지 않는가? 상속이라는 것 때문에 이 컨스트럭터는 Barebones
에서 상속되는 클래스에 의해 호출되지만 Barebones
라고 하지는 않는다.
모든 클래스는 멤버 데이터와 new()
와는 다른 메소드를 필요로 한다. 이를 정의하는 것은 몇 개의 프로시져를 작성하는 것 만큼 쉽다.
|
이 코드를 다음을 이용하여 테스트 할 수 있다:
|
그러면 결과 '2'를 얻는다. 컨스트럭터는 두 번 호출되고 Barebones
객체 범위가 아닌 Barebones
패키지 범위로 한정된 어휘 변수($count
)를 수정한다. 객체 데이터는 객체 그 자체로 저장되어야 한다. 메소드가 호출될 때 마다 객체에 액세스 할 수 있는 이유는 객체로의 레퍼런스는 그러한 메소드에 전달된 첫 번째 매개변수이기 때문이다.
DESTROY()
와 AUTOLOAD()
같은 특정 메소드가 있는데 이것은 특정 조건에서 펄에 의해 자동으로 호출된다. AUTOLOAD()
는 동적 메소드 이름을 허용하는데 사용되는 메소드이다. DESTROY()
는 객체 소멸자(destructor) 이지만, 정말로 필요한 경우가 아니라면 사용하지 말아야 한다. 펄에서 소멸자를 사용하는 것은 C/C++ 프로그래머로서 자신을 생각하고 있다는 의미가 된다.
상속에 대해 살펴보자. 펄에서 이것은 @ISA
변수를 변경하여 수행된다. 클래스 이름 리스트를 그 변수에 할당하면 된다. 그것으로 충분하다. @ISA
에 무엇이든 둘 수 있다. 클래스를 Satan
의 자식으로 만들 수 있다. 펄은 상관하지 않는다.
|
이것은 펄 OOP의 기본이다. 다른 많은 언어들도 연구해야 한다. 이를 주제로 다룬 책들도 많다. 참고자료 리스트도 꼼꼼히 살펴보기 바란다.
h2xs
펄 클래스를 작성하고 문서 (POD) 스켈레톤(skeleton)을 작성할 툴이 있다면 더욱 행복해질 것 같지 않은가? 펄에는 이러한 종류의 툴이 있다: h2xs
.
"-A -n Module
" 플래그는 중요하다. 기억하기 바란다. 이것을 이용하여, h2xs는 유용한 파일로 가득찬 "Module" 이라는 스켈레톤 디렉토리를 만든다:
Module.pm
, 이미 작성된 스켈레톤 문서를 가진 모듈.Module.xs
, 모듈을 C 코드로 연결하는데 사용.MANIFEST
, 패키지용 파일 리스트.test.pl
, 스크립트를 테스트하는 스켈레톤.Changes
, 모듈의 변경 기록.Makefile.PL
, makefile 생성자(generator).
이 모든 파일을 사용할 필요는 없지만 이와 같은 것이 존재하고 있다는 것을 알아두는 것이 낫다.
- 1장 (코드 가이드라인), 2장 (코드 주석), 3장 (루프 신택스), 4장 (함수 프로그래밍): 보다 나은 프로그래밍으로 가는 길 시리즈.
- Object Oriented Perl: Damian Conway (Manning Publications, 2000).
- Perldoc.com.
- comp.object Object FAQ.
- Programming Perl, Third Edition: Larry Wall, Tom Christiansen, Jon Orwant (O'Reilly & Associates, 2000).
- developerWorks "Cultured Perl" 시리즈:
- 프로그래머의 Linux 지향 설정
- Perl로 애플리케이션 구성
- Perl을 이용하여 UNIX 시스템 관리 자동화하기
- 쉬운 Perl 디버깅 (US)
- "JAPH"
- Perl의 유전자 알고리즘
- One-liners 개론
- C와 Java 프로그래머를 위한 Perl
- Perl로 Excel 파일 읽기/쓰기
- "Programming Perl" the 3rd Edition
- Perl의 데이터 저장 기술 (US)
필자소개 Teodor Zlatanov는 보스턴 대학에서 컴퓨터 공학을 전공했다. 졸업 후 Perl, Java, C, C++를 사용하여 프로그램을 개발하였다. |
'Computer_language > C++' 카테고리의 다른 글
C++ class에서 함수정의에 사용된 static [출처] C++ class에서 함수정의에 사용된 static|작성자 정천사 (0) | 2009.01.12 |
---|---|
Static Class 에 대한 정의 (0) | 2009.01.12 |
정적 중첩 클래스 (0) | 2009.01.12 |
각 상속 테스트 (0) | 2009.01.12 |
Ubuntu에서, c, c++관련 컴파일러 설치 [출처] Ubuntu에서, c, c++관련 컴파일러 설치|작성자 용이 (0) | 2009.01.12 |
C++ class에서 함수정의에 사용된 static [출처] C++ class에서 함수정의에 사용된 static|작성자 정천사
| Computer_language/C++ 2009. 1. 12. 00:52C++에서 class 멤버 중 static으로 선언된 멤버는 그 class로 생성된 객체(인스턴스)가 몇개든 간에 한개만을 메모리할당을 하여 공유하여 사용한다.
위의 내용은 뭐... C++을 공부해본 사람들이라면 다 아는 내용이다.
그런데 여기서 사람들이 간혹 "class '선언'에 static" 만을 생각하고, "멤버함수의 '정의'의 static"을 모르고 지나가는 경우가 있다. 글 표현 능력이 없으므로 일단 보여주겠다.
#include <iostream> using namespace std; class CStaticTest { public: void test(void); }; int main(void) { CStaticTest a; CStaticTest b; cout << "a 인스턴스를 호출합니다." << endl; a.test(); cout << endl; cout << "b 인스턴스를 호출합니다." << endl; b.test(); return 0; } void CStaticTest::test() { static int a = 0; cout << a << endl; a = 1; } |
본인이 여기서 말하고 싶은것은 대부분 C++서적들이 class의 static 에 관한 내용을 맨 위에 문장
" C++에서 class 멤버 중 static으로 선언된 멤버는 그 class로 생성된 객체(인스턴스)가 몇개든 간에 한개만을 메모리할당을 하여 공유하여 사용한다."
으로 설명하고 있어 사용자에게 치명적인 오류를 불러 일으킬 수 있기 때문이다.
소스 내용을 보면 맴버 함수 test() '정의'에 static 변수가 선언 되어 있다. 그리고 각각의 객체 a, b로 선언되어 test()함수를 호출하고 있다. 이때 오해가 발생하는 것이다. "class 선언에 static 으로 선언된 멤버 변수가 아니니 단순히 C와 같이 함수에서만 사용되고...그러므로 객체에 따라 각각함수에 static 변수가 생성되겠군."...이다.
그러나 소스를 꼼꼼히 따져서 결과를 봐 보자....어떠한가? class 멤버 함수의 정의 내부에 선언된 static 또한 공유됨을 알 수 있다.
따라서 맨 위의 글을 조금 고친다면...
"C++에서 class( 멤버 변수, 멤버 함수의 선언 & 정의 )에 static 이 사용되면 그 class로 생성된 객체(인스턴스)가 몇개든 간에 한개만을 메모리할당을 하여 공유하여 사용한다."
가 정확하다라는 뜻이다.
(조금 위험한 생각이지만) C++에서 static 이 사용되면 무조건 공유된다. 라고 생각해 두는 것이 속 편한거 같다.
[출처] C++ class에서 함수정의에 사용된 static|작성자 정천사
'Computer_language > C++' 카테고리의 다른 글
oop 객체 지향 프로그래밍(Object Oriented Programming, OOP) (0) | 2009.01.12 |
---|---|
Static Class 에 대한 정의 (0) | 2009.01.12 |
정적 중첩 클래스 (0) | 2009.01.12 |
각 상속 테스트 (0) | 2009.01.12 |
Ubuntu에서, c, c++관련 컴파일러 설치 [출처] Ubuntu에서, c, c++관련 컴파일러 설치|작성자 용이 (0) | 2009.01.12 |
회사 에서 static 클래스로 구현하란다/// 그래서 인터넷에서 자료를 뒤져 이렇게 정리해 본다
내부 클래스란 무엇일까여? 클래스안에 또 클래스가 들어가 있는것을 말한다 . 왜이런 내부 클래스를 만드는 목적과 필요성에 대해 알아보자
내부클래스라는 것은 클래스 안에 또 클래스가 있는것을 말합니다
일단 내부 클래스에 어떤 놈들이 잇고 어떻게 사용되는지를 알아야 할것입니다 첫 번째로 정적 내부 클래스(Static Class)에 대해 알아보도록 하겟습니다
정적 내부 클래스라는것은 내부 클래스가 static 으로 정의 되어 있다는것입니다
내부 클래스는 외부 클래스의 멤버로보면 됩니다 / 이번놈은 static 이니까 static멤버!!!!!!!!! static 멤버만을 사용할수 잇습니다
static 멤버쓰는거 기억 하시나요?? 해당 클래스의 객체를 따로 생성하지 않아도 쓸수 잇습니다 내부 클래스도 마찬가지입니다
public class Example
{
static class InnerClass{
}
}
Example 클래스에 InnerClass 라는 static 멤버가 있습니다 이것을 다른 클래스 그러니까 Example 클래스의 외부에서 Example 클래스의
객체 없이도 다음과 같이 InnerClass클래스를 만들수 있습니다
public class Test
{
public static void main(String[] args{
Example.InnerClass test = new Example.InnerClass();
}
}
또 한가지 정적 클래스도 static 이기 때문에 static 변수와 메소드만 참조할수 잇습니다
public class Example {
static private int K =1;
private int T = 10;
static void display(){};
static class InnerClass{
public void printK(){
System.out.printIn(K);
System.out.printIn(T); // compile error
display();
}
}
}
테스트 소스 입니다
public class Example
{
static private int K=1;
static void display()
{
System.OUT.printIn("TEST 시작");
}
static class InnerClass
{
private int a =36;
public void printIn(K+a)
{
System.OUT.printIn(K+a);
display();
}
}
}
class Test
{
public static void main(String[] args)
{
Example.InnerClass test = new Example.InnerClass();
test.printIn();
}
}
==============================================================================
다음은 static method 에 대해 kldp 에 질의 응답한 내용을 발췌 하엿다
private static은 아마 메모리를 절약하거나 서로 다른 인스턴스에서 공통 접근 가능이 필요할때 쓰는게 아닐까 싶습니다
클래스 인스턴스는 각각 다른 메모리를 가지고 있는 상황에서 static한 필드나 메서드는 공용으로 쉽게 말하면 공유메모리와 같은 역할을 하게 되니까요.
물론 그에 따른 위험성도 존재 하겠지만 그렇게 쓰는 이유가 있겠죠. 설계의 관점에서.
속도의 측면에선 테스트를 안해봐서 잘 모르지만 큰 차이는 없을것 같네요. 오히려 final로 정의된게 속도에선 낫다는 이야기가 있으니까요.
만일 다른 객체지향 언어를 말씀하시는 거라면 거기에도 적용이 되는건지는 잘 모르겠네요. ㅡㅡㅋ
class 내의 static 함수는 그것이 private, public, protected 상관없이 숨어서 넘어가는 this pointer를 전달하지 말도록하는 것입니다.
그렇기 때문에 static member function 은 static 아닌 멤버 변수나 함수를 호출 할 수가 없습니다. 대신, 일반적인 c 의 callback 함수로 넘길때 유용하게 사용됩니다
C++을 기준으로 설명을 해 드리자면, (Java도 동일합니다)
클래스의 static member function은 개념적으로는 클래스의 static data member에만 접근 가능한 멤버함수임을 나타냅니다.
즉, 객체별로 설정되는 non-static data member에는 접근이 불가능합니다. non-static data member에 접근할 수 있으면 안되므로 당연히 this포인터(자바의 경우는 this 리퍼런스)를 static member function에서는 사용할 수 업습니다. 즉, 멤버함수의 인자로 this포인터가 넘어오질 않습니다.
따라서 일반적인 멤버함수보다는 인자 한개가 줄어드는 효과가 발생하여 빈번하게 호출되는 함수라면 약간의 성능향상이 있을 수 있습니다. 클래스 스코프에 들어가야 하는 순수함수(pure function) 즉, 내부상태를 가지지 않는, 입력값에 의해서만 출력이 결정되는 함수라면 static 멤버함수로 설계하는 것이 좋죠.
또한 static member function은 오버라이딩 불가합니다. this포인터가 넘어오질 않으므로 객체에 따라 다르게 설정되는 가상함수 테이블 역시 사용불가능하며, 결국 static member function은 컴파일타임에 정적으로 바인딩되게 됩니다. (결국 static member function은 virtual 함수가 될 수 없는 결과를 가져오지요)
따라서 일반적인 멤버함수보다는 인자 한개가 줄어드는 효과가 발생하여 빈번하게 호출되는 함수라면 약간의 성능향상이 있을 수 있습니다. 클래스 스코프에 들어가야 하는 순수함수(pure function) 즉, 내부상태를 가지지 않는, 입력값에 의해서만 출력이 결정되는 함수라면 static 멤버함수로 설계하는 것이 좋죠.
C++을 기준으로 설명을 해 드리자면, (Java도 동일합니다)따라서 일반적인 멤버함수보다는 인자 한개가 줄어드는 효과가 발생하여 빈번하게 호출되는 함수라면 약간의 성능향상이 있을 수 있습니다.
꼭 정적멤버함수만이 아니고 객체지향적으로 잘 설계된 클래스라면 C 언어에서처럼 함수의 인수로 데이타를 전달받는 것이 아니고 클래스의 멤버에 직접 접근하여 데이타를 가져올 수 있으므로 성능향상이 있게됩니다
또한 static member function은 오버라이딩 불가합니다. this포인터가 넘어오질 않으므로 객체에 따라 다르게 설정되는 가상함수 테이블 역시 사용불가능하며, 결국 static member function은 컴파일타임에 정적으로 바인딩되게 됩니다. (결국 static member function은 virtual 함수가 될 수 없는 결과를 가져오지요)
정적 멤버 함수에 가상함수 적용은 안되지만 오버라이딩 및 오버로딩 모두 자유롭게 할 수 있습니다. (C++ 기준)
[출처] Static Class 에 대한 정의 |작성자 이대리
'Computer_language > C++' 카테고리의 다른 글
oop 객체 지향 프로그래밍(Object Oriented Programming, OOP) (0) | 2009.01.12 |
---|---|
C++ class에서 함수정의에 사용된 static [출처] C++ class에서 함수정의에 사용된 static|작성자 정천사 (0) | 2009.01.12 |
정적 중첩 클래스 (0) | 2009.01.12 |
각 상속 테스트 (0) | 2009.01.12 |
Ubuntu에서, c, c++관련 컴파일러 설치 [출처] Ubuntu에서, c, c++관련 컴파일러 설치|작성자 용이 (0) | 2009.01.12 |
대신 이 정적 중첩클래스에서는 상위 클래스의 비정적 메서드나 비정적 변수를 참조할 수 없었습니다.
위와 같은 형태는 안되고 아래와 같은 형태로 사용할 수 있습니다.
프로그램 진입점인 main 메서드도 정적 중첩 클래스 내부에 위치할 수 있습니다.
대신, 이렇게 사용시에는
main 의 위치가 명시된 클래스 Test -> Test_ 를 실행시켜주어야 합니다.
마찬가지로, 콘솔창에서도
'Computer_language > C++' 카테고리의 다른 글
C++ class에서 함수정의에 사용된 static [출처] C++ class에서 함수정의에 사용된 static|작성자 정천사 (0) | 2009.01.12 |
---|---|
Static Class 에 대한 정의 (0) | 2009.01.12 |
각 상속 테스트 (0) | 2009.01.12 |
Ubuntu에서, c, c++관련 컴파일러 설치 [출처] Ubuntu에서, c, c++관련 컴파일러 설치|작성자 용이 (0) | 2009.01.12 |
나눈 값을 표현하는 방법 즉 double 크기의 표현 방법 (float 4비트 double 8비트) (0) | 2009.01.12 |
#include < iostream >
using namespace std;
class parent
{
public :
parent(){value = 0;}
void methodA(){cout << "methodA call!" << endl;}
protected :
void methodB(){cout << "methodB call!" << endl;}
private :
int value;
};
class child1 : public parent
{
public :
child1(){value_child1 = 1;}
void methodC(){cout << "methodC call!" << endl; methodB();} //부모로부터 상속받았기때문에 methodB에 접근허가
protected :
void methodD(){cout << "methodD call!" << endl;}
private :
int value_child1;
};
class child2 : protected parent
{
public :
child2(){value_child2 = 2;}
void methodE(){cout << "methodE call!" << endl; methodB();} //부모로부터 상속받았기때문에 methodB에 접근허가
protected :
void methodF(){cout << "methodF call!" << endl; }
private :
int value_child2;
};
class child3 : private parent
{
public :
void methodG(){cout << "methodG call!" << endl; methodB();} //부모로부터 상속받았기때문에 methodB에 접근허가
};
void main()
{
child1 childtest;
childtest.methodA();
//childtest.methodB(); //에러발생 protected 멤버 접근 불가
childtest.methodC();
//childtest.methodD(); //에러발생 protected 멤버 접근 불가
//cout << childtest.value << endl; //에러발생 private 멤버 접근 불가
//cout << childtest.value_child1 << endl; //에러발생 private 멤버 접근 불가
cout << endl;
child2 childtest2;
//childtest2.methodA(); //에러발생 protected로 상속받았기때문에 public 이더라도 사용할 수 없음
//childtest2.methodB(); //에러발생 protected 멤버 접근 불가
childtest2.methodE();
//childtest2.methodF(); //에러발생 protected 멤버 접근 불가
//cout << childtest2.value << endl; //에러발생 private 멤버 접근 불가
cout << endl;
child3 childtest3;
childtest3.methodG();
}
실행결과
methodA call! methodE call! methodG call! |
출처 : 직접작성 및 Teach Yourself C++ - Visual Studio.NET 2003을 기준으로 작성됨
'Computer_language > C++' 카테고리의 다른 글
C++ class에서 함수정의에 사용된 static [출처] C++ class에서 함수정의에 사용된 static|작성자 정천사 (0) | 2009.01.12 |
---|---|
Static Class 에 대한 정의 (0) | 2009.01.12 |
정적 중첩 클래스 (0) | 2009.01.12 |
Ubuntu에서, c, c++관련 컴파일러 설치 [출처] Ubuntu에서, c, c++관련 컴파일러 설치|작성자 용이 (0) | 2009.01.12 |
나눈 값을 표현하는 방법 즉 double 크기의 표현 방법 (float 4비트 double 8비트) (0) | 2009.01.12 |
Ubuntu에서, c, c++관련 컴파일러 설치 [출처] Ubuntu에서, c, c++관련 컴파일러 설치|작성자 용이
| Computer_language/C++ 2009. 1. 12. 00:49gcc,g++,glibc 컴파일러 설치
http://packages.ubuntu.com/hardy/ 에서 라이브러리 찾기
package list : http://packages.ubuntu.com/feisty/
:~$sudo apt-get install libc-dev : 컴파일러
:~$sudo apt-get install libc6-dev : glibc 설치
:~$sudo apt-get install gcc : gcc 컴파일러 설치
:~$sudo apt-get install g++ : g++ 컴파일러 설치
:~$sudo apt-get install libncurses5-dev :ncurese 설치
:~$sudo apt-get install libstdc++6
:~$sudo apt-get install build-essential : GNU C Library
:~$sudo apt-get install build-essential bin86 kernel-package
:gcc, make, g++
:~$sudo apt-get install libqt3-headers libqt3-mt-dev
:make Xconfig를 위해 필요
JDK 설치
:~$sudo apt-get install sun-java6-jdk
Eclipse 설치
:~$sudo apt-get install eclipse
:~$sudo apt-get install eclipse-cdt
:~$sudo apt-get install make : make 설치
[출처] Ubuntu Linux 에서, c, c++관련 컴파일러 설치|작성자 미스테리
'Computer_language > C++' 카테고리의 다른 글
C++ class에서 함수정의에 사용된 static [출처] C++ class에서 함수정의에 사용된 static|작성자 정천사 (0) | 2009.01.12 |
---|---|
Static Class 에 대한 정의 (0) | 2009.01.12 |
정적 중첩 클래스 (0) | 2009.01.12 |
각 상속 테스트 (0) | 2009.01.12 |
나눈 값을 표현하는 방법 즉 double 크기의 표현 방법 (float 4비트 double 8비트) (0) | 2009.01.12 |
%e
Signed value having the form [ – ]d.dddd e [sign]ddd where d is a single decimal digit, dddd is one or more decimal digits, ddd is exactly three decimal digits, and sign is + or –.
%E
double Identical to the e format except that E rather than e introduces the exponent.
%f
double Signed value having the form [ – ]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.
%g
double Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is used only when the exponent of the value is less than –4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.
%G
double Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).
출처 : MSDN
'Computer_language > C++' 카테고리의 다른 글
C++ class에서 함수정의에 사용된 static [출처] C++ class에서 함수정의에 사용된 static|작성자 정천사 (0) | 2009.01.12 |
---|---|
Static Class 에 대한 정의 (0) | 2009.01.12 |
정적 중첩 클래스 (0) | 2009.01.12 |
각 상속 테스트 (0) | 2009.01.12 |
Ubuntu에서, c, c++관련 컴파일러 설치 [출처] Ubuntu에서, c, c++관련 컴파일러 설치|작성자 용이 (0) | 2009.01.12 |