이 블로그는 애드센스 수익으로 운영되고 있습니다.
광고차단앱을 해제해주시면 블로그 운영에 큰 도움이 됩니다.

'Programing'에 해당되는 글 16건

  1. C++ STL 2013.03.25
  2. C++ 템플리트(template) 2013.03.25
  3. Java - 클래스(class)와 객체(object) 2013.03.20
  4. C++ static과 friend 2013.03.19
  5. Objective-C 08. Class 2012.08.14
  6. Objective-C 07. 상속 2012.08.14
  7. Objective-C 06.BOOL 2012.08.11
  8. Objective-C 04.While문 2012.08.09
  9. Objective-C 03.for문 2012.08.09
  10. Objective-C 02.Class 2012.08.07

C++ STL

from Programing/C++ 2013. 3. 25. 20:35

■ STL(Standard Template Library)


- 프로그래머가 자료구조와 알고리즘을 알지 못해도 사용할 수 있도록 한 라이브러리

- 표준 STL은 std namespace 안에 있다.


- 컨테이너(Container) : 특정한 타입의 원소(또는 객체)들을 담아 다루기 위한 객체

ex) list, vector, map, deque, multimap 등


- 반복자(Iterator) : 컨테이너 내부 원소를 순회할 수 있는 객체이며 컨테이너의 특정 위치를 나타냄

- 반복자에 사용되는 멤버함수

begin() : 컨테이너의 첫번쨰 위치를 가리키는 반복자

end() : 컨테이너의 마지막 위치를 가리키는 반복자를 반환하며

         이것은 컨테이너의 마지막 원소 ' 다음의 위치를 말한다.

- 반복자에 사용되는 연산자

* 연산자 : 지금 현재 위치의 원소를 반환

++ 연산자 : 다음 원소를 가리키는 역할

-- 연산자 : 이전 원소를 가리키는 역할

= 연산자 : 반복자가 참조하는 원소의 위치를 할당

==,!= 연산자 : 두 반복자가 같은 위치인지를 반환하는 연산자


- 알고리즘(Algorithm) : 컨테이너 객체의 원소를 다루기 위한 여러 알고리즘으로 검색, 정렬, 수정등의 역할


❉ STL : 컨테이너 + 반복자 + 알고리즘


■vector

- vector는 자신의 원소를 동적 배열을 이용하여 관리

- vector는 데이터 추가와 삭제는 빠르지만 삽입은 비교적 늦은


■vector와 list 멤버 함수

- size() : 원소의 개수를 반환하는 함수

- empty() : 컨테이너가 비었는지를 알려줌

- max_size() : 컨테이너가 가질 수 있는 최대 원소의 개수를 반환

- reserve() : 용량을 재할당하는 함수

- insert() :  반복자 위치에 데이터를 삽입

- push_back() : 큰 부분에 데이터를 추가

- pop_back() : 마지막 원소를 제거

- erase() : 반복자 위치의 원소를 제거

- clear() : 모든 원소를 제거

- resize() : 원소릐 개수를 변경

- sort() : 오름차순으로 정 렬


- 백터에 데이터 입력과[]연산자를 이용한 요소의 접근 

#include <iostream>

#include <vector>



using namespace std;



int main(int argc, const char * argv[])

{

    vector<int> Vector;

    

    for(int i = 0; i < 7 ; i++)

        Vector.push_back(i);  //

    

    for(int i = 0; i < Vector.size() ; i++)  //size()원소의 개수를 반환

        cout<<Vector[i]<<" ";


    Vector.clear();


    return 0;

}

결과:

0 1 2 3 4 5 6  




















- 반복자

 #include <iostream>

#include <vector>



using namespace std;



int main(int argc, const char * argv[])

{

    vector<int> Vector;

    vector<int>::iterator pos;

    

    for(int i = 8; i >= 0 ; --i)

        Vector.push_back(i);  //

    

    for(pos = Vector.begin() ; pos!=Vector.end() ; pos++)  //begin() 컨테이너의 첫번째 위치를 가리키는 반복자

        cout<<*pos<<" ";


    Vector.clear();


    return 0;

}

결과:

8 7 6 5 4 3 2 1 0 






















■list

- list는 이중 링크드 리스트(double linked list)

- <list> 헤더를 포함

- 원소를 검색, 처음부터 검색하게 되어 다른 vector에 비해 시간이 다소 걸림

- 빠른 삽입과 삭제는 vector보다 훨씬 빠르다.

- vector의 [] 연산자를 제공하지 않는다.


- 1~10까지 데이터 입력 및 제거 그리고 검색

 #include <iostream>

#include <list>



using namespace std;



int main(int argc, const char * argv[])

{

    int nNum;

    list<int> nLinkedList;

    

    for(int i = 0 ; i< 10 ; i++)

        nLinkedList.push_back(i);

    

    cout<<"리스트에 입력된 값은 다음과 같다"<<endl;

    list<int>::iterator pos;

    for(pos = nLinkedList.begin() ; pos != nLinkedList.end() ; pos++)

        cout<<*pos<<" ";

    

    cout<<endl<<"0~9까지의 값중에서 삭제할 값은?:"<<endl;

    cin>>nNum;

    

    for(pos = nLinkedList.begin() ; pos !=nLinkedList.end() ; pos++)

    {

        if(*pos == nNum)

        {

            nLinkedList.erase(pos);

            break;

        }

    }

    

    cout<<endl<<"삭제한 결과"<<endl;

    for(pos = nLinkedList.begin() ; pos != nLinkedList.end();pos++)

        cout<<*pos<<" ";

    

    nLinkedList.clear();

    

    return 0;

}

결과:

리스트에 입력된 값은 다음과 같다

0 1 2 3 4 5 6 7 8 9 

0~9까지의 값중에서 삭제할 값은?:

8


삭제한 결과

0 1 2 3 4 5 6 7 9 









































- 오름차순 내림차순 정렬

#include <iostream>

#include <list>



using namespace std;



int main(int argc, const char * argv[])

{

    list<int>nLinkedList;

    

    for(int i = 10; i>0 ; --i)

    {

        nLinkedList.push_back(i);

    }

    

    nLinkedList.sort();

    

    list<int>::iterator pos;

    for(pos = nLinkedList.begin(); pos!=nLinkedList.end();pos++)

        cout<<*pos<<" ";

    cout<<endl;

    

    nLinkedList.reverse();

    for(pos = nLinkedList.begin(); pos!=nLinkedList.end();pos++)

        cout<<*pos<<" ";

    cout<<endl;

    

    nLinkedList.clear();


    return 0;

}

결과:

1 2 3 4 5 6 7 8 9 10 

10 9 8 7 6 5 4 3 2 1 






























■알고리즘

- min_element() : 최소값을 검색하며 반복자 위치를 반환

- max_element() : 최대값을 검색하며 반복자 위치를 반환

- find() : 값으로 검색하며 있으면 반복자 위치를 반환하고 없으면 범위의 끝을 반환

- reverse() : 역순으로 배열

- sort() : 오름차순으로 정


- vector에 알고리즘 적용

 #include <iostream>

#include <vector>

#include <algorithm>



using namespace std;



int main(int argc, const char * argv[])

{

    int nSearch;

    vector<int> Vectors;

    

    vector<int>::iterator pos;

    

    Vectors.push_back(3);

    Vectors.push_back(7);

    Vectors.push_back(8);

    Vectors.push_back(10);

    Vectors.push_back(6);

    Vectors.push_back(1);

    Vectors.push_back(4);

    Vectors.push_back(2);

    

    for( pos = Vectors.begin() ; pos != Vectors.end() ; pos++)

        cout << *pos << " " ;

    

    cout << endl << "최소값 : " << *min_element(Vectors.begin(), Vectors.end()) << endl;

    cout << "최대값 : " << *max_element(Vectors.begin(), Vectors.end()) << endl;

    

    sort(Vectors.begin(), Vectors.end());

    

    cout << "정렬 : ";

    

    for( pos = Vectors.begin() ; pos != Vectors.end() ; pos++)

        cout << *pos << " " ;

    

    cout << endl << "찾을 값을 입력 :" ;

    cin >> nSearch;

    

    pos = find(Vectors.begin(), Vectors.end(), nSearch);

    if( pos != Vectors.end() )

        cout << "검색값이 있음" << endl;

    else

        cout << "검색값이 없음" << endl;

    

    cout << "내림차순으로 정렬" << endl; reverse(Vectors.begin(), Vectors.end());

    cout << "정렬 : ";

    for( pos = Vectors.begin() ; pos != Vectors.end() ; pos++)

        cout << *pos << " " ;


    return 0;

}

결과:

3 7 8 10 6 1 4 2 

최소값 : 1

최대값 : 10

정렬 : 1 2 3 4 6 7 8 10 

찾을 값을 입력 : 8

검색값이 있음

내림차순으로 정렬

정렬 : 10 8 7 6 4 3 2 1 
















































-list에 알고리즘 적용

 #include <iostream>

#include <list>

#include <algorithm>



using namespace std;



int main(int argc, const char * argv[])

{

    list<int> LinkedList;

    list<int>::iterator pos;

    

    int nSearch;

    

    LinkedList.push_back(10);

    LinkedList.push_back(7);

    LinkedList.push_back(3);

    LinkedList.push_back(1);

    LinkedList.push_back(12);

    LinkedList.push_back(5);

    LinkedList.push_back(2);

    for( pos = LinkedList.begin() ; pos != LinkedList.end() ;

        pos++) cout << *pos << " " ;

    

    cout << endl << "최소값 : " << *min_element(LinkedList.begin(), LinkedList.end()) << endl;

    cout << "최대값 : " << *max_element(LinkedList.begin(), LinkedList.end()) << endl;

    

    LinkedList.sort();

    

    cout << "정렬 : ";

    for( pos = LinkedList.begin() ; pos != LinkedList.end() ; pos++)

        cout << *pos << " " ;

    cout << endl << "찾을 값을 입력 : " ;

    cin >> nSearch;

    

    pos = find(LinkedList.begin(), LinkedList.end(), nSearch);

    if( pos != LinkedList.end() )

        cout << "검색값이 있음" << endl;

    else

        cout << "검색값이 없음" << endl;

    cout << "내림차순으로 정렬" << endl;

    

    reverse(LinkedList.begin(), LinkedList.end());

   

    cout << "정렬 : ";

    

    for( pos = LinkedList.begin() ; pos != LinkedList.end() ; pos++)

        cout << *pos << " " ;

    

    return 0;

}

결과:

10 7 3 1 12 5 2 

최소값 : 1

최대값 : 12

정렬 : 1 2 3 5 7 10 12 

찾을 값을 입력 : 7

검색값이 있음

내림차순으로 정렬

정렬 : 12 10 7 5 3 2 1 


,

C++ 템플리트(template)

from Programing/C++ 2013. 3. 25. 12:55

■템플리트

- 어떤 타입이라도 클래스 또는 함수 안에서 사용할 수 있게 하는 역할을 한다

- 타입을 찍어내는 틀

- 기본 형식

template<class T>

template<class T1, class T2>

- class는 일반적인 클래스 키워드가 아니라 사용자가 지정해야 할 데이터 형을 의 미

- 한 개의 형(type) 지정 예제


#include <iostream>


using namespace std;

template <class T>void Swap(T& a, T& b)

{

    T c = a;

    a = b;

    b = c;


}


int main(int argc, const char * argv[])

{

    int nVar1, nVar2;

    float fVar1, fVar2;

    nVar1 = 7;

    nVar2 = 12;


    fVar1 = 3.14f;

    fVar2 = 0.5f;

    

    Swap(nVar1, nVar2); 

    cout<<"nVar1:"<<nVar1<<'\t'<<"nVar2:"<<nVar2<<endl;

    

    Swap(fVar1, fVar2);

     cout<<"fVar1:"<<fVar1<<'\t'<<"fVar2:"<<fVar2<<endl;

    

    return 0;

}

결과:

nVar1:12 nVar2:7

fVar1:0.5 fVar2:3.14

 






























- 여러 개의 형(type)지정

#include <iostream>


using namespace std;

template <class T, class U, int i>void Func(T str)

{

    U buffer[i];

    strcpy(buffer, str);

    cout<<buffer<<endl;

}


int main(int argc, const char * argv[])

{

    Func<char* , char, 12>("C++");

    return 0;

}

결과:

C++



















■템플리트 클래스

- 클래스 안에서 사용하려는 형을 템플리트로 지정

- 템플리트를 사용하는 멤버 함수의 구현을 외부에 할 때에는 클래스에서 정의한 템플리트를 모든 함수의 구현 부분에 지정해야 한다.


- 클래스에서 한 개의 템플리트 형을 사용하는 경우


 


#include <iostream>


using namespace std;


template<class T> class A

{

private:

    T m_Var;

public:

    void Print();

    void Set(T Var);

    T Get(){return m_Var;}


};


template<class T>void A<T>::Set(T Var)

{

    m_Var = Var;

}


template<class T>void A<T>::Print()

{

    cout<<m_Var<<endl;

}


int main(int argc, const char * argv[])

{

    A<char> test1;

    A<int> test2;

    A<int*> test3;

    

    test1.Set('a');

    test1.Print();

    

    test2.Set(10);

    test2.Print();

    

    int k = 7;

    test3.Set(&k);

    cout<<*test3.Get()<<endl;

    


}

결과:

a

10

7









































- 클래스 안에서 두 개의 템플리트 형을 사용하는 경우


 


#include <iostream>


using namespace std;


template<class T, class U> class A

{

private:

    T m_Var1;

    U m_Var2;

public:

    void Print();

    void Set(T Var);

    void Set(U Var);



};


template<class T, class U>void A<T, U>::Set(T Var)

{

    m_Var1 = Var;

}


template<class T, class U>void A<T, U>::Set(U Var)

{

    m_Var2 = Var;

}


template<class T, class U>void A<T, U>::Print()

{

    cout<<m_Var1<<'\t'<<m_Var2<<endl;

}


int main(int argc, const char * argv[])

{


    A<int, char>test;

    test.Set(300);

    test.Set('a');

    test.Print();

    

    return 0;


}

결과:

300 a








































- 템플리트 클래스 객체가 포인터인 경우


 


#include <iostream>


using namespace std;


template<class T> class A

{

private:

    T m_Var;


public:

    void Print();

    void Set(T Var);

    T Get();



};


template<class T>void A<T>::Set(T Var)

{

    m_Var = Var;

}



template<class T>void A<T>::Print()

{

    cout<<m_Var<<endl;

}


template<class T>T A<T>::Get()

{

    return m_Var;

}


int main(int argc, const char * argv[])

{

    A<int> *pTest = new A<int>;

    pTest->Set(12);

    pTest->Print();

    delete pTest;


    return 0;


}

결과:

12






































- 템플리트 클래스 객체에 생성자가 있고 매개변수가 있는 경우


 


#include <iostream>


using namespace std;


template<class T> class A

{

private:

    T m_Var;


public:

    A(T Var):m_Var(Var) {}

    void Print();

    void Set(T Var);

    



};


template<class T>void A<T>::Set(T Var)

{

    m_Var = Var;

}



template<class T>void A<T>::Print()

{

    cout<<m_Var<<endl;

}



int main(int argc, const char * argv[])

{

    A<int> test(12);

    test.Print();

    

    A<int> *pTest;

    pTest = new A<int>(7);

    pTest->Print();

    delete pTest;


    return 0;


}

결과:

12

7








































- typedef를 템플리트에 활용


 


#include <iostream>


using namespace std;


template<class T> class A

{

private:

    T m_Var;


public:


    void Print();

    void Set(T Var);

    T Get();



};


template<class T>void A<T>::Set(T Var)

{

    m_Var = Var;

}



template<class T>void A<T>::Print()

{

    cout<<m_Var<<endl;

}



typedef A<int> intA;


int main(int argc, const char * argv[])

{

    intA test;

    test.Set(12);

    test.Print();

    

    return 0;


}

결과:

12




































- 템플리트에 기본 값을 적용


 #include <iostream>


using namespace std;


template <class T,int m = 12>class A

{

private:

    T* m_pBuffer;

public:

    A(){m_pBuffer =new T[m];}

    ~A(){delete [] m_pBuffer;}

    

    void Set(int nIndex, T Var)

    {

        m_pBuffer[nIndex] = Var;

    }

    

    void Print(int nIndex)

    {

        cout<<nIndex<<":"<<m_pBuffer[nIndex]<<endl;

    }

};


int main(int argc, const char * argv[])

{

    

    A<int> test1;

    test1.Set(0, 3);  //0번째 배열에 3 넣음

    test1.Print(0);   //0번째 배열을 출력

    

    A<int, 20> test2;

    test2.Set(19, 100);  //19번째 배열에 100 넣음

    test2.Print(19);     //19번쨰 배열을 출력


    return 0;

}

결과:

0:3

19:100




,

■클래스 

- 객체를 정의하는 기본 형식


■객체

- 클래스 메모리에 생성한 것

- 멤버(변수, 함수) 사용 가


■인스턴스(instance)와 객체(object)의 차이

- 입장 차이

클래스에서 객체는 인스턴스이다.

객체는 생성된 객체 그 자체를 의미한다.


■클래스 형식

- 형식

[접근 제어자] class 클래스명

{

[접근 제어자] 멤버 변수;

[접근 제어자] 멤버 함수;

}

- 접근제어자 : 외부에서 멤버에 접근할 수 있는 권한 설정 (private, protected, public, default)

private : 같은 클래스 안에서만 접근이 가능

protected : 같은 클래스안에서와 다른 패키지에서 상속되었을 때만 접근 가능

public : 제약 없이 사용 가능

default :접근제어자를 생략했을 때 기본 제어자이며 같은 패키지 안에서만 접근가능 


■클래스 생성과 사용 및 메서드 호출

- 생성 : new 키워드 사용


class A{...}

1)A test = new A();

2)A test

   test = new A();



- 메서드(method) 호출

클래스변수.메서드

test.Method


- ex


class A

{

int m_nVar//멤버변수

void Set(int nVar)

{

m_nVar = nVar;

}

void Print()

{

System.out.println(m_nVar);

}

}


public class ex01 {


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

A Test1 = new A();

Test1.Set(12);

Test1.Print();

A Test2 = new A();

Test2.Set(3);

Test2.Print();

}


}

결과:

12

3




































■객체 참조변수

- 의미 : 클래스를 선언하면 객체를 참조할 수 있는 객체 참조변수가 된다.

- 선언형식

class A{...}

A Test = new A();

1) A Ref = Test

2) A Ref;

    Ref = Test;


- ex


class A

{

int m_nVar//멤버변수

void Set(int nVar)

{

m_nVar = nVar;

}

void Print()

{

System.out.println(m_nVar);

}

}


public class ex01 {


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

A Test1 = new A();

Test1.Set(12);

Test1.Print();

A Test2 = new A();

Test2.Set(3);

Test2.Print();

A Ref = Test1;

Ref.Print();

}


}

결과:

12

3

12








































■자바에서 static선언에 대해서

- static의 특징

공용 멤버(변수, 함수)가 된다

객체 생성 없이 호출이 가능

- static 주의사항

static은 멤버(변수,함수)와 함수명에서만 사용

지역 함수 안에 static붙일 수 없다(C 와 차이점)

static 메서드의 경우 메서드 안에 지역 변수를 포함할 수 없다.

- 멤버와 main외부의 함수에 static이 붙은 경우

class A

{

static int m_nVar//정적 멤버변수

int m_nNum;

static void Set(int nVar)    //정적 멤버함

{

m_nVar = nVar;

//m_nNum = 3;   <- error!!

}

void Print()

{

System.out.println(m_nVar);

}

}


public class ex01 {


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

A.Set(9);    //

A Test1 = new A();

Test1.Print();


A Test2 = new A();

Test2.Print();


A.Set(3);

Test1.Print();

Test2.Print();

}



}

 


결과:

9

9

3

3













































■함수의 매개변수가 참조형인 경우

class A{...}

class B{

public static void main(String[] args)

{

A test = new A()

Ref(test);                   

}   


static void Ref(A RefClass)     //      == A RefClass = test; 

{

....

}

}



class A

{

int m_nVar;

}


public class ex01 {


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

A Test = new A();

Test.m_nVar = 7;

System.out.println(Test.m_nVar);

RefChange(Test);

System.out.println(Test.m_nVar);

}

static void RefChange(A test)

{

test.m_nVar = 9;

}



}

결과:

7



■오버로딩(overloading)

- 한 클래스 안에서 여러 개의 같은 메서드명을 사용하여 정의할 수 있는 기능

- 매개변수로 함수를 구분하여 리턴형은 상관없음

- ex.


class A

{

int add(int nVar1, int nVar2){return nVar1+nVar2;}

float add(float fVar1, float fVar2){return fVar1+fVar2;}

}


public class ex01 {


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

A Test = new A();

System.out.println(Test.add(0.5f, 0.3f));

System.out.println(Test.add(2, 7));

}

}

결과:

0.8























■생성자

- 클래스가 생성될 때 자동으로 호출되는 메서드

- 클래스 안의 멤버 변수 초기

- 형식1 : 클래스와 같은 이름을 가지는 메서드로 리턴형이 없다

class A

{

A(){...}

}


- 형식2 : 생성자는 매개변수를 가질 수 있으며 매개변수에 따라 호출된다.

class A

{

int m_nVar;

String m_strName;

A(int nVar){m_nVar = nVar;}

A(int nVar, String strName)

{

m_nVar = nVar;

m_strName = strName

}

}


- ex 


class A

{

int m_nVar;

String m_strName;

A(int nVar){m_nVar = nVar;}

A(int nVar, String strName)

{

m_nVar = nVar;

m_strName = strName;

}

void Print()

{

System.out.println(m_nVar+" ,"+m_strName);

}

}


public class ex01 {


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

A Test = new A(12,"Hello");

Test.Print();

}

}

결과:

12 ,Hello

 































■this 

- 객체 자체를 참조하는 키워드이며 C++의 this와 같은 역 할


class A

{

int m_nVar = 12;

void Print() {System.out.println(this.m_nVar);}


}


public class ex01 {


/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

A Test = new A();

Test.Print();

}

}

결과:

12 



,

C++ static과 friend

from Programing/C++ 2013. 3. 19. 20:38

■정적(static) 클래스와 지역 정적(static)클래스

- static class의 특징

한번 생성과 초기화

프로그램이 종료될 때 까지 소멸되지 않는다.


- 형식(1) : 기본 생성자만 있는 경우


class A{};


class B{

public:

    static A Test;

};


A B::Test;  //클래스의 초기화


int main()

{

  //생략

} 













- 형식(2) : 생성자에 초기화가 있는 경우


class A{

public:

    A(int nVar){}

};


class B{

public:

    static A Test;

};


A B::Test(10);  //클래스의 초기화


int main()

{


} 















- 예


#include <iostream>



using namespace std;


class A{

private:

    int m_nVar;

public:

    A(int nVar){

        m_nVar = nVar;

        cout<<"A 생성자 호출"<<m_nVar<<endl;

    }

    void Print(){cout<<m_nVar<<endl;}

    ~A(){cout<<"A 소멸자 호출"<<endl;}

};


class B{

public:

    static A ClassA;

    

    B(){cout<<"B 생성자 호출"<<endl;}

    ~B(){cout<<"B 소멸자 호출"<<endl;}

};


A B::ClassA(10);  //클래스의 초기화


void Set(int nVar)

{

    static A test(nVar);

    test.Print();

}


int main()

{

    

    Set(7);

    Set(12);

    

    B test1, test2;

    test1.ClassA.Print();

    test2.ClassA.Print();

    return 0;

}

결과:

A 생성자 호출10

A 생성자 호출7

7

7

B 생성자 호출

B 생성자 호출

10

10

B 소멸자 호출

B 소멸자 호출

A 소멸자 호출

A 소멸자 호출 














































■정적 멤버변수

- 모든 같은 클래스 안에서 공유하는 변수

- 클래스의 전역변수 역할

- 클래스 외부에서 한번은 초기화해야 한다.

- 초기화할 때는 ::을 이용하여 소속을 지정


■정적 멤버변수의 특징

- 클래스를 생성하지 않아도 정적 멤버변수를 사용할 수 있다.

- 형식


class A{

private:

    static int m_nVar;

};


int A::m_nVar =0; 


 

 


 


#include <iostream>



using namespace std;


class A{

private:

    static int m_nVar;

public:

    static int m_nPublicVar;

    void Set(int nVar){m_nVar = nVar;}

    void Print(){cout<<m_nVar<<endl;}

};


int A::m_nVar = 0;

int A::m_nPublicVar = 0;


int main()

{

    cout<<"public 정적 멤버 변수:"<<A::m_nPublicVar<<endl;

    

    A test1, test2, test3;

    

    test1.Set(12);

    test1.Print();

    test2.Print();

    test3.Print();

    

    A::m_nPublicVar = 7;

    cout<<test1.m_nPublicVar<<'\t'<<test2.m_nPublicVar<<'\t'<<test3.m_nPublicVar<<endl;

    cout<<A::m_nPublicVar<<endl;

    

    return 0;

}

결과:

public 정적 멤버 변수:0

12

12

12

7 7 7

7 






































■정적 멤버함수

- 정적 멤버변수에만 접근하는 함수

- 함수 안에 this 사용 불가


■정적 멤버변수의 특징

- 클래스를 생성하지 않아도 정적 멤버함수를 사용할 수 있다.



#include <iostream>



using namespace std;


class A{

private:

    static int m_nVar;

public:

    static int m_nPublicVar;

    void Set(int nVar){m_nVar = nVar;}

    void Print(){cout<<m_nVar<<endl;}

    static void Add(int nVar){m_nPublicVar += nVar;}

};


int A::m_nVar = 0;

int A::m_nPublicVar = 0;


int main()

{

    A::Add(12);

    cout<<A::m_nPublicVar<<endl;

    

    A test1, test2;

    

    test1.Add(7);

    

    cout<<test1.m_nPublicVar<<'\t'<<test2.m_nPublicVar<<endl;

    

    return 0;

}

결과:

12

19 19 



 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

■friend

- 일반 함수가 클래스의 모든 멤버에 접근할 수 있도록 한다.


■friend 사용 용도

- 클래스 안에 멤버 함수를 두지 않고 외부에 두고자 하는 경우

■friend 참고 사항

- 상속되지 않는다.

-  형식


class A{

private:

    int m_nVar;

public:

    friend bool IsEqual(A& a, A& b);


};


bool IsEqual(A& a, A& b)

{

    if(a.m_nVar ==b.m_nVar)

        return 1;

    else

        return 0;

} 














- friend 함수 예



#include <iostream>



using namespace std;


class A{

private:

    int m_nVar;

public:

    A(int nVar) : m_nVar(nVar){}

    friend bool IsEqual(A& a, A& b);


};


bool IsEqual(A& a, A& b)

{

    if(a.m_nVar ==b.m_nVar)

        return 1;

    else

        return 0;

}



int main()

{

    A test1(7), test2(12);

    if(IsEqual(test1, test2) ==1)

        cout<<"같은 "<<endl;

    else

        cout<<"다른 "<<endl;

    

    return 0;

} 


결과:

다른


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 


#include <iostream>



using namespace std;


class B; //class B 있다는 것을 알림


class A{

private:

    int m_nVar;

public:

    A(int nVar) : m_nVar(nVar){}

    friend bool IsEqual(A& a, B& b);


};


class B

{

private:

    int m_nVar;

public:

    B(int nVar) : m_nVar(nVar){}

    friend bool IsEqual(A& a, B& b);

    

};


bool IsEqual(A &a, B &b)

{

    if(a.m_nVar == b.m_nVar)

        return 1;

    else

        return 0;

}



int main()

{

    A test1(12);

    B test2(12);

    

    if(IsEqual(test1, test2) == 1)

        cout<<"같은 "<<endl;

    else

        cout<<"다른 "<<endl;

    

    return 0;

} 


■friend 클래스

- friend 클래스로 선언된 클래스는 자신이 속한 클래스 안의 모든 멤버에 대한 접근 권한을 가지게 된다

- private 권한과 상관없이 멤버를 사용할 수 있다.


■friend 클래스 형식

■friend 클래스 예



#include <iostream>



using namespace std;



class A

{

private:

    int m_nVar;

    friend class B;

public:

    A():m_nVar(12){}


};


class B

{

public:

    void Print(A& Ref){cout<<Ref.m_nVar<<endl;}

};


int main()

{

    A test1;

    B test2;

    test2.Print(test1);

 

    return 0;

} 



,


분수의 합구하는 코드


File Name Fraction.h

#import <Foundation/Foundation.h>


@interface Fraction : NSObject

{

    int numerator;

    int denominator;

}


@property int numerator, denominator;


-(void) print;

-(void) setTo: (int) n over: (int) d;

-(double) convertToNum;

-(void) add: (Fraction *) f;  //

-(void) reduce;     //약분

@end




File Name Fraction.m

#import "Fraction.h"


@implementation Fraction


@synthesize numerator, denominator;


-(void) print

{

    NSLog(@"%i/%i", numerator, denominator);

}



-(double) convertToNum

{

    if (denominator !=0)

        return (double) numerator/denominator;

    else

        return 1.0;

}


-(void) setTo: (int) n over: (int) d

{

    numerator = n;

    denominator = d;

}


-(void) add: (Fraction *) f

{

    numerator = numerator *f.denominator + denominator*f.numerator;

    denominator = denominator*f.denominator;

}


-(void) reduce

{

    int u = numerator;

    int v = denominator;

    int temp;

    

    while ( v!=0){

        temp = u % v;

        u = v;

        v = temp;

    }

    

    numerator /= u;

    denominator /= u;

}


@end




Main

#import <Foundation/Foundation.h>

#import "Fraction.h"


int main(int argc, const char * argv[])

{

    Fraction *aFraction = [[Fraction alloc]init];

    Fraction *bFraction = [[Fraction alloc]init];

    

    

    [aFraction setTo: 1 over: 4];

    [bFraction setTo: 1 over: 2];

    

    

    [aFraction print];

    NSLog(@"+");

    [bFraction print];

    NSLog(@"=");

    

    [aFraction add: bFraction];

    [aFraction reduce];

    [aFraction print];

    

    return 0;

}



,

//상속 예제


#import <Foundation/Foundation.h>


@interface ClassA: NSObject

{

    int x;

}

-(void) initVar;

@end


@implementation ClassA

-(void) initVar

{

    x = 100;

}

@end


@interface ClassB: ClassA

-(void) printVar;

@end


@implementation ClassB

-(void) printVar

{

    NSLog(@"x = %i",x);

}

@end


int main(int argc, const char * argv[])

{

    ClassB *b = [[ClassB alloc] init];

    

    [b initVar];

    [b printVar];

    return 0;

}



,

50까지의 정수중 소수를 찾는 코드


#import <Foundation/Foundation.h>


int main(int argc, const char * argv[])

{

    int p,d;

    BOOL isPrime;

    

    for(p=2;p<=50;p++)

    {

        isPrime = YES;

        

        for (d=2;d<p;d++)

        {

            if ( p % d == 0)

                isPrime = NO;

        }

        if(isPrime !=0)

            NSLog(@"%i",p);

    }

    return 0;

}

,

while문 문법

while(expression)

program statement


최대공약수 찾는 코드


#import <Foundation/Foundation.h>


int main(int argc, const char * argv[])

{



    unsigned int u, v, temp;

    NSLog(@"Please type in two nonnegative integer");

    scanf("%u%u",&u, &v);

    

    while(v!=0){

        temp = u%v;

        u=v;

        v=temp;

    }

    

    NSLog(@"Their greatest common divisor is %u",u);

    

    

        

    

    return 0;

}


,
1~200까지의 삼각수의 합을 구하는 for문

#import <Foundation/Foundation.h>


int main(int argc, const char * argv[])

{


    int n, triangularNumber;

    

    triangularNumber = 0;

    

    for(n=1;n<=200;n=n+1)

        triangularNumber += n;

    @autoreleasepool {

        

        // insert code here...

        NSLog(@"The 200th Triangular number is %i",triangularNumber);

        

    }

    return 0;

}



for문의 형태

for(init_expression; loop_condition; loop_expression)

program statement



정수를 입력받아 삼각수의 합을 표시


#import <Foundation/Foundation.h>


int main(int argc, const char * argv[])

{


    int n, triangularNumber, number;

    

    NSLog(@"What triangular number do you want?");

    scanf("%i", &number);

    

    triangularNumber = 0;

    

    for(n=1;n<=number;n++)

    {

        triangularNumber += n;

    }

 

    NSLog(@"Triangular number %i is %i\n",number, triangularNumber);

    

    return 0;

}


,


#import <Foundation/Foundation.h>


//inteface 

@interface Fraction:NSObject   //새로운 클래시이름:부모클래스

{

    int numerator;

    int denominator;

    

    

    

}

-(void) print;          //인스턴스 메서드

-(void) setNumerator: (int) n;

-(void) setDenominator: (int) d;

@end

//implementation


@implementation Fraction

-(void) print

{

    NSLog(@"%i/%i,",numerator,denominator);

}


-(void) setNumerator:(int) n

{

    numerator = n;

}


-(void) setDenominator:(int) d

{

    denominator = d;

}


@end


int main(int argc, const char * argv[])

{

    

    

    

   


    @autoreleasepool {

    

    Fraction *myFraction;

        

      //Fraction 인스턴스를 생성한다.

        myFraction = [Fraction alloc];

        myFraction = [myFraction init];

        

        [myFraction setNumerator: 1];

        [myFraction setDenominator:3];

        

        NSLog(@"the value of myFraction is:");

        [myFraction print];

       


        

    }

    return 0;

}




----

+ 클래스 메서드

- 인스턴스 메서드


alloc : allocate(할당하다)의 줄임말, 새로운 분수에 메모리 공간을 할당하는 것


,