먼저, 클래스에 대한 이해를 하기전에 왜 클래스가 필요한지 생각해보아야 합니다.
앞서 우리는 왜 변수를 선언하고 사용하는지에 대해서 이해를 했습니다.
변수의 형이라는것은
- 변수가 사용하는 메모리의 크기
- 변수가 가질 수 있는 정보
- 변수를 어떻게 조작하는가?
에 대한 정보가 포함된 정보입니다. 따라서 새로운 형을 만든다는 것은 프로그래머가 디자인하는 시스템에 맞는 최적의 형을 그 문제를 쉽게 해결할수 있는 변수를 만드는 것입니다.
1. 클래스란?
관련된 함수들과 연관된 변수들의 집합. (즉 여러 변수들과 함수들을 내가 필요한것만 골라서 뭉쳐놓은것! =묶는다=객체=캡슐화)
- 캡슐화라는건 프로그래머에게 상당한 이점을 준다. 객체안에 무엇있는지 어떻게 동작하는지 알필요가 없다. 우린 그냥 잘 사용한
다. 예를 들어 커피자판기에 우린 돈만 넣고 버튼만 누르면 커피가 나온다! 자판기가 어떻게 동작하는지는 몰라도 커피를 뽑는데
에는 전혀 지장이 없다!
그리고 클래스의 변수들은 멤버변수 또는 자료멤버라고 부르며
클래스의 함수들은 멤버함수 또는 클래스의 메쏘드라 부른다.
예를들어 자판기 클래스의 멤버함수는 동전투입부(), 음료출력부() 라 할수가 있고, 변수로는 콜라버튼, 사이다버튼 이라 할수가 있다. ( 예시가 너무 조잡하네요 ^^;..)
1-1. 클래스의 선언
클래스를 선언하기 위해서는 class라는 예약어를 사용해야 합니다.
class Who
{
int itsAge;
int itsSex;
Talk();
};
Who라는 클래스를 선언하였으며 중괄호안에 자료멤버(멤버변수)를 썼습니다. 그리고 메쏘드로는 Talk()를 선언하였습니다.
이 클래스를 선언하였다고 Who 클래스에게 메모리를 할당하지는 않습니다. 단지 클래스의 정보만을 컴파일러에게 알려줍니다.
(그리고 보통 프로그래머들은 멤버변수의 앞에 its를 붙여서 멤버변수임을 구별합니다)
이제 클래스를 선언하였다면 객체를 정의해보겠습니다.
Who ChulSu; //Who 클래스명으로 객체 철수를 정의함. : 이것을 Who를 실체화하는것이라 생각하면 된다.
클래스 멤버에게 접근하는법은 아래와 같습니다.
ChulSu.itsAge = 18; //철수의 멤버변수에 18살을 대입.
ChulSu.Talk(); //함수를 쓰려면 이와같이 정의한 객체 철수를 통하여 사용.
1-2. 객체에 값을 할당
기존의 C나 C++에서 int = 1; 이라고 값을 대입하지 않았습니다.
클래스는 일종의 데이터 형이라고 생각해야 합니다.
따라서 Who = 1; 이라는것을 문법상 오류입니다.
int a;
a= 1; 과 같이 우리는 사용할 것입니다.
Who.Chulsu;
Chulsu.itsAge = 18;
과 같이 사용하여야 합니다.
2. private(전용) 와 public(범용) 의 이해
클래스를 선언할때 주로 같이 사용되는 예약어로 private 와 public이 있습니다.
기본적으로 클래스를 선언하게 되면 private속성으로 자동선언이 되어집니다.
private : 전용멤버(privat클래스의 변수)는 그 클래스 안의 해당 메쏘드(함수)에 의해서만 접근이 가능함
public : 범용벰버(public클래스의 변수)는 다른 클래스의 객체에 의해서도 접근이 가능함
예제)
#include <iostream.h>
class Who
{
public :
int itsAge;
char itsSex;
};
int main()
{
Who.Chulsu;
Chulsu.itsAge = 18;
Chulse.itsSex = m;
cout<<"Chulsu Age =";
cout<<Chul.itsAge;
return 0;
}
만약 예제에서 public : 을 주석 처리해버리거나 빼버리면?? -> 컴파일 오류가 난다.
이는 내가 만든 Who라는 클래스라도.. 그리고 Who의 객체인 Chulsu라 하더라도 public이 아닌 private로 선언된 클래스의 멤버들에 관해서는 접근이 되지 않는 것이다. private 로 선언된 클래스내 멤버변수들은 클래스내의 함수들에 의한 내부적인 동작으로만 실행이되고 접근이 될뿐이다!
그럼 public에서는 private로 접근할수 없는가?..아니다. 범용 접근자 메쏘드(함수)를 만들어서 클래스의 전용(private) 멤버 변수들을 읽고 쓸수가 있다! (이런 알고리즘은 전용성과 보안성이 생긴다)
(예시)
class Who
{
public :
unsigned int GetAge();
void SetAge(unsigned int Age);
unsigned char GetSex();
void SetSex(unsigned char Sex);
Talk();
private :
unsigned int itsAge;
unsigned char itsSex;
};
즉 위와 같이 전용변수로써 나이와 성별을 지정해놓으면 객체는 보호된다.
3. 클래스 메쏘드의 구현
멤버함수의 정의는 클래스의 이름으로 시작하여 두개의 콜론을 넣고 함수명을 쓰고 매개변수를 쓰면 된다.
(예시)
#include <iostream.h>
class Who
{
public :
int GetAge();
void SetAge(int age);
void Talk();
private:
int itsAge;
};
int Who::GetAge() //클래스 메쏘드 함수
{
return itsAge;
}
void Who::SetAge(int age)
{
itsAge = age;
}
void Who::Talk()
{
cout<<"HAHAHa..\n";
}
int main()
{
Who.ChulSu;
ChulSu.setAge(18);
Chulsu.Talk();
cout<<"ChulSu Age is";
cout<<ChulSu.GetAge();
cout<<"\n";
ChulSu.Talk();
return 0;
}
위의 예시에서 중점적으로 봐야하는 부분은 int Who::GetAge() void Who::SetAge(int age)의 구현부입니다.
접근자 메쏘드의 쓰임이 왜 이렇게 이루어졌는지 클래스선언부를 꼭 확인하시고 개념을 이해하도록 합니다.
4. 생성자와 소멸자
작성중..
'Engineering > JAVA Programming' 카테고리의 다른 글
[개념이해] Instance (0) | 2013.04.29 |
---|---|
5) 함수에 대한 고찰 (0) | 2012.05.03 |
4) 자바의 데이터 타입과 연산자 (0) | 2012.04.28 |
3) 자바 프로그램의 구조에 대한 고찰 (0) | 2012.04.28 |
2) 자바 프로그래밍 환경설정 (0) | 2012.04.27 |