4.클래스와 객체
4.1.1.멤버변수 및 메소드 선언
클래스
-객체의 설계도, 틀(클래스는 실체가 아님)
-멤버 변수와 메소드 선언
객체
-클래스의 틀로 생성되어 하나의 클래스로 여러개의 객체를 생성 가능함
-메모리에 생성되어 실체(instance)라고함. 멤버변수와 메소드로 구성됨.
-각각의 객체는 별도의 메모리에 생성됨
클래스 선언(멤버변수 및 메소드 선언)
class 클래스명{
멤버 변수 선언;
public: //접근 권한 지정
메소드(원형) 선언;
};
-멤버변수는 선언시 초기화할 수 없음
-메소드는 주로 원형 형태로 선언함
4.1.2.클래스용 멤버변수 및 메소드 선언
클래스변수
-클래스 내에서 static을 붙여서 선언하는 변수로, 한번 선언되면 해당 클래스의 모든 인스턴스가 같은 저장공간을 가리킨다.
예제
public class test{
static int hanno=1;
public static void main(string[] args) {
test ex1 = new test();
test ex2 = new test();
system.out.println(ex1.hanno);
ex2.hanno=2;
system.out.println(ex1.hanno);
}
}
출력
1
2
->클래스변수인 hanno는, test클래스로 생성된 모든 인스턴스에서 같은 저장장소를 가리킴으로, ex2인스턴스에서 변수 hanno를 변경하면 ex1인스턴스의 hanno변수도 변경된다.
4.1.3.생성자 및 소멸자
생성자는 객체를 생성할 때 자동적으로 호출되는 함수로 클래스와 같은 이름의 형태를 띤 함수이며, 리턴형이 없으며 리턴 하지도 않는 특징을 가지고 있다. 생성자는 객체의 생성과 동시에 초기화를 해주기 위해서 필요하다.
ㄱ.생성자(ctor)
객체의 초기화를 담당하는 메서드를 가리킨다.
-인스턴스를 생성해주는 역할을 하는 특수한 메소드이다.
-반환값이 없어서 RETURN도 사용하지 않고 반환 값 타입을 메소드 정의에 포함시키지도 않는다.
-클래스에는 반드시 생성자가 존재해야 한다.
-인스턴스 변수의 초기화가 목적이다.
-클래스 이름과 동일한 이름을 가진 메소드이다.
ㄴ.소멸자
개체가 소멸(할당이 해제)될 때 사용되는 생성자 함수의 역함수.
-객체가 소멸될 때 자동으로 발생하는 메서드.
-클래스 이름 앞에 물결표 ( ~ )를 사용하여 함수를 클래스의 소멸자로 지정함.
-클래스 'String'의 소멸자는 '~String()'
사용방법
클래스명 참조변수 = new 클래스명(초기화 변수)
예: Person p1 = new Person(22, "한국인노동자");
4.1.4.접근 제한 - private, protected, public
[class의 경우]
public: 모든 패키지에서 이 클래스 참조 가능
protected: 자신을 포함하는 클래스에서 상속받은 클래스에서도 참조가능
private: 자신을 포함한 클래스에서만 참조가능
[메소드의 경우]
public: 이 클래스 밖에서도 이 메소드 참조 가능
protected: 상속받은 클래스와 이 클래스내에서만 참조 가능
private:이 클래스내에서만 참조가능
Private << protected << public
4.1.5.this, super(in JAVA), friend(in C++) 키워드
ㄱ.this
클래스 내부에 자동 선언되는 클래스 포인터. 선언된 객체의 주소를 저장하고 있으며 클래스 내부에서만 사용할 수 있다.
-상수 포인터로 변경이 불가능하다.
-클래스 내부에서도 사용 불가능한 경우가 있다.(예: static 멤버함수 내부)
-this();는 생성자 호출을 의미한다.
예:
class Number
{
private:
int val = 0;
public:
void add(int val)
{
this->val += val;
}
}
위에서 val은 add함수의 지역변수인 val을 가리키고, this->val은 Number 클래스의 멤버변수 val을 가리킨다.
ㄴ.super ( in java )
자신을 가리키는 키워드가 this라면, 부모를 가리키는 키워드는 super이다.
-자식클래스인 B에서 부모클래스 A의 메소드를 부를 일이 생겼다고 할 때, super.set(); 같은 식으로 이용한다.
-super()는 부모의 생성자를 의미한다.
ㄷ.friend ( in c++ )
지정된 해당 함수 혹은 클래스에 대해 자신의 private나 protected멤버를 public권한으로 접근할 수 있도록 해주는 키워드.
-객체사용이 편해지지만, 객체의 캡슐화를 무너뜨림.
4.1.6.멤버함수 오버로드 (overloading)
클래스 내부에 동일한 이름의 메서드 여러개를 정의하는 것.
-함수명은 같아야 한다.
-파라미터 타입과 개수는 서로 달라야 한다.
-리턴타입은 관계없다.
-메서드의 이름 낭비를 방지하고, 같은 메서드에 여러 종류의 매개변수를 받을 수 있다. 예:
class student{
void search(int number){
system.out.println("번호:"+number);
}
void search(string name){
system.out.println("이름:"+name);
}
void search(string name, int price){
system.out.println("번호:"+number);
system.out.println("이름:"+name);
}
}
[출처] [독학사/컴공/객체지향프로그래밍]1.객체지향의 기본적 개념|작성자 한국인노동자
모호함
함수가 오버로드되었을 때, 컴파일러가 구분할 수 없는 모호함이 발생한다면 컴파일 에러가 발생한다.
예
-max(int, int)와 max(int&, int&) -> 문맥 상으로 두개의 함수 구분이 불가능하다.
-int Pirnt(); char Print(); -> 리턴형으로는 두 함수의 구분이 불가능하다.(파라미터 타입으로 구분해야한다.)
4.1.7.연산자 오버로드(in C++)
4.1.8.정적 초기화 블록(in JAVA)
인스턴스화에 상관없이 딱 한번 호출되는 절차적인 코드들로 이루어진 블럭.
-생성자와 관계없이 메모리 로딩 시점에 우선 실행된다.
예
class hanno{
static {
for(int i=0; i<1000; i++) {
a = i;
}
}
}
'학위공부 > 독학사 요점정리' 카테고리의 다른 글
[독학사/컴공/객체지향프로그래밍]8.상속 (0) | 2020.06.30 |
---|---|
[독학사/컴공/객체지향프로그래밍]7.객체 (0) | 2020.06.29 |
[독학사/컴공/객체지향프로그래밍]5.연산자, 수식, 문장 (0) | 2020.06.29 |
[독학사/컴공/객체지향프로그래밍]4.변수선언 (0) | 2020.06.29 |
[독학사/컴공/객체지향프로그래밍]3.자료형 (0) | 2020.06.29 |