학위공부/독학사 요점정리

[독학사/컴공/객체지향프로그래밍]7.객체

듀부두부 2020. 6. 29. 19:26

4.2.객체

4.2.1.객체 변수 선언

OOP의 가장 핵심적인 클래스(객체)는 구조체가 확장된 것.

선언 방법은 C의 구조체 선언문에서 struct class로 바꾸면 되며, public이나 private와 같은 액세스 지정자도 추가 가능. 또한, 함수까지 포함할 수 있다.

 

 

:

//People 클래스 선언

class People{

private:

 int age;

 char* name;

 double height;

public;

 void set_People{int _Age, char* _name, double _height};//함수(behavior)도 포함 가능

 void show_People();

};

 

 

 

 

4.2.2.객체 생성 및 초기화

.JAVA

JAVA에서는 객체를 New 연산자로 선언하고 생성한다.

Class 타입 변수명 = new 생성자 ();

new:new 연산자를 통해 객체를 저장할 메모리를 할당한다. 곧이어 생성자를 호출하여 객체를 초기화한다. 생성자가 종료되면 new 연산자는 생성된 객체에 접근할 수 있도록 식별자를 반환한다.

 

 

.C++

1)new를 사용하지 않는(메모리를 동적으로 할당받지 않는)객체 생성

ex) Student kim;

 

 

2)new연산자를 사용한 동적할당

클래스이름 *객체이름; //객체 포인터 선언

객체이름 = new 클래스이름; //new연산자로 객체를 위한 메모리 동적할당

객체이름 = new 클래스이름(매개변수 리스트); //new 연산자에 의해 생성자가 자동으로 호출됨

 

 

3)생성자를 통한 멤버변수 초기화

ex)

class Student{

public:

 Student(); //기본 생성자

 Student(const int s1, const int s2); //생성자 오버로딩

private:

 int score[2], sum;

 double average;

};

//기본 생성자

Student::Student(){

score[0]=0;

score[1]=0;

sum=0;

average=0;

};

//생성자 오버로딩

Student::Student(const int s1, const int s2):sum(2),average(2){

 score[0] = s1;

 score[1] = s2;

}

 

 

4.2.3.객체 소멸

객체가 소멸할 때 자동으로 소멸자 함수를 실행한다. 따로 선언하지 않아도 자동으로 동작한다.

객체의 소멸 순서는 소멸자 호출-> 메모리 반환 순서로 객체가 소멸됨.

JAVA의 경우 레퍼런스가 참조하지 않는 객체는 가비지 컬렉션의 대상이 되어 자동으로 정리함

 

 

4.2.4.객체 사용 - 멤버변수접근 및 메소드 호출

인스턴스 이름과 .연산자를 사용해서 멤버변수접근, 메소드 호출을 한다.

class Number{

public:

 int number;

 int getNumber();

};

이라는 클래스가 있을 때에,

 

 

Number number; //인스턴스 생성

number.number = 1; //멤버변수접근

std::cout<<number.getnumber(); //메소드호출

 

4.3.1.패키지(in JAVA)

패키지(package):클래스의 묶음으로서 하나의 디렉토리이다. 패키지 안에 하위패키지를 만드는것도 가능하다. 클래스는 일반적으로 퍼블릭클래스로 존재하며, 패키지명(.하위패키지명).자바파일(=퍼블릭클래스명)순서로 실행한다.

->퍼블릭클래스: 하나의 자바파일에 여러개의 클래스를 작성하는 경우 설정된 하나의 대표 클래스. 'public 자바파일명'과 동일하며 존재하지 않을 수도 있음.

 

 

4.3.2.네임스페이스(in C++)

네임스페이스 또는 이름공간은 개체를 구분할 수 있는 범위를 나타내는 말로 일반적으로 하나의 이름공간에서는 하나의 이름이 단 하나의 개체만을 가리키게 된다. 각각의 이름공간에서는 같은 변수나 함수 이름을 사용할 수 없지만, 영역이 다르면 변수나 함수명이 같을 수도 있다.

 

 

ex)

 #include <iostream>

  using std::cout;

  using std::endl;

  

  namespace Box1{

     int boxSide = 4;

  }

  

  namespace Box2{

    int boxSide = 12; 

 }

 

 int main () {

   cout << Box1::boxSide << endl;  //output 4

   cout << Box2::boxSide << endl;  //output 12

  return 0;

 }

 

 

4.4.템플릿(in C++)

제너릭 프로그래밍(Generic Programming): 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식.

템플릿(template): 프로그래밍 언어의 한 기능으로, 함수와 클래스가 제너릭 형과 동작할 수 있게 도와준다. 함수나 클래스가 개별적으로 다시 작성하지 않고도 각기 다른 수많은 자료형에서 동작할 수 있게 한다.

-템플릿은 C++에서 다중상속과 연산자 오버로딩과 결합할 때 유용하다.

-템플릿의 종류에는 함수 템플릿, 클래스 템플릿, 변수 템플릿이 있다.

 

 

4.4.1템플릿 선언

형태는 아래와 같다.

template <class Type>

template <typename Type>

두 표현 모두 같은 의미와 행동을 하도록 되어있다. class대신 typename을 사용해도 되고, 그 반대도 성립한다.

 

 

4.4.2.템플릿 사용 

.함수 템플릿

여러 다른 자료형을 템플릿 인자로 받아, 함수 내부에서 활용할 수 있도록 한 것.

 

 

ex)

template <typename Type>//typename 대신 class를 대입하여도 된다.

Type max(Type a, Type b) {

 return a>b ? a : b;

}

->컴파일러가 전달되는 인자의 자료형을 보고 Type의 타입을 유추한다. 컴파일 과정 중 해당 함수가 어떤 자료형으로 호출이 될지 결정이 될 때 실제 함수가 생성이 된다.

 

 

.클래스 템플릿

사용법은 함수 템플릿이랑 동일하나, 클래스 템플릿에서는 자료형정보(<int>, <double>)을 생략하면 안된다.

 

 

ex)

template <typename type>

class student{

private:

 typenaeme data;

public:

 void showInfo(){

cout << data << endl;

}

};

 

 

int main(){

 data<int> data1(10);

 data1.showInfo();

}