- 멤버(Member)
멤버란 클래스를 구성하는 요소를 뜻하며 메서드와 변수로 이루어져 있습니다. 클래스는 멤버를 통해 내부의 데이터를 저장하거나 연산할 수 있는데, 이때 클래스 내부의 변수를 "멤버 변수"라고 칭합니다. 아래 예제는 간단하게 작성할 수 있는 클래스 코드입니다.
class ClassExample {
double mDouble;
void CE_Print_mDouble() {
System.out.println(mDouble);
}
void CE_Set_mDouble(double dInput) {
mDouble = dInput;
}
}
위 클래스는 ClassExample 이라는 이름으로 정의되었으며,
- mDouble 이라는 double형 멤버변수
- CE_Print_mDouble라는 void형 메소드
- CE_Set_mDouble라는 void형 메소드
로 이루어져 있습니다. 멤버 변수 혹은 메소드는 개수 제한 없이 필요한 만큼 선언하여 사용할 수 있습니다. 심지어 변수 혹은 메서드가 존재하지 않아도 클래스를 만들 수 있습니다. 이렇게 멤버들로 구성된 클래스는 하나의 자료형으로 사용할 수 있습니다.
클래스를 정의했다면 밑의 예제는 객체를 통해 클래스의 멤버를 사용한 것 입니다.
import java.io.*;
class Main {
public static void main(String[] args) {
ClassExample ce;
ce = new ClassExample();
ce.mDouble = 10;
ce.CE_Print_mDouble();
ce.CE_Set_mDouble(30);
ce.CE_Print_mDouble();
}
}
class ClassExample {
double mDouble;
void CE_Print_mDouble() {
System.out.println(mDouble);
}
void CE_Set_mDouble(double dInput) {
mDouble = dInput;
}
}
위 코드는 ClassExample 클래스를 main 함수 내에서 사용하는 방법을 나타낸 예시 입니다.
- 4번째 줄에서 ClassExample 클래스를 자료형으로 하고 ce라는 이름을 가진 객체가 선언 되었습니다. 하지만 이 선언만으로 객체를 사용할 수는 없습니다.
- 기본형 자료형을 제외한 나머지는 모두 참조형 자료형이기 때문에 클래스로 만들어진 자료형 또한 new로 메모리 할당 과정을 거쳐야 합니다. 5번째 줄에서 new를 통해 ce 객체에 메모리를 할당해 주었고, 이로 인해 ce 객체는 실체를 가지게 되었습니다. 여기서 한가지 짚고 넘어갈 것이 있습니다. new 뒤에 오는 클래스이름() 부분은 "생성자" 라고 합니다. 객체에 new로 메모리를 할당할 때 꼭 생성자를 적어주어야 합니다. 생성자의 자세한 역할 및 활용법은 다음장에서 설명하도록 하겠습니다. 즈금은 객체에 메모리를 할당할 때에는 new 뒤에 생성자를 꼭 붙인다 정도만 이해하시면 됩니다.(String 클래스는 예외적으로 new를 통해 메모리에 할당하는 작업 없이 바로 사용할 수 있는 점 참고하시기 바랍니다.)
- 7~11번째 줄은 객체를 사용하는 방법에 대한 예시입니다. 클래스 내부의 멤버들은 객체를 통해 제어할 수 있다고 설명했습니다. 7번재 줄을 살펴보겠습니다.
ce.mDouble = 10;
바로 이 부분이 ce 객체 내부의 멤버 변수를 사용한 예시입니다. 객체 뒤에 "."을 붙이게 되면 객체 내부의 멤버 변수 및 메서드를 사용할 수 있습니다. 위 예제에서 7번째 줄에 있는 소스코드는 ce 객체의 멤버 변수 mDouble에 10을 대입한 예시입니다. 그 다음, 8번째 줄은 ce 객체의 CE_Print_mDouble 메소드를 사용한 예시로, ce 내부의 변수 mDouble의 값을 출력하는 메서드임을 정의된 클래스에서 확인할 수 있습니다. 즉, 위 코드에서는 10이 출력되는 것입니다.
마찬가지로 정의된 클래스를 통해 10번째 줄의 ce.CE_Set_mDouble 메서드가 ce 객체 내부의 mDouble 멤버 변수에 매개변수로 전달되는 값을 저장한다는 것을 알 수 있습니다.
즉, 10번째 줄에서 ce 객체의 변수 mDouble에 30이 저장되며, 11번째 줄에서 이를 다시 출력하므로 위 예제를 동작시켰을 때 10과 30이 출력됩니다.
위 예제를 조금 변형한 아래 예제를 살펴보겠습니다.
import java.io.*;
class Main {
public static void main(String[] args) {
ClassExample ce1;
ce1 = new ClassExample();
ce1.CE_Set_mDouble(10);
ce1.CE_Print_mDouble();
ClassExample ce2 = new ClassExample();
ce2.CE_Set_mDouble(30);
ce2.CE_Print_mDouble();
}
}
class ClassExample {
double mDouble;
void CE_Print_mDouble() {
System.out.println(mDouble);
}
void CE_Set_mDouble(double dInput) {
mDouble = dInput;
}
}
위 코드에서 ClassExample 클래스를 자료형으로 갖는 ce1과 ce2라는 객체 2개가 생성된 것을 확인할 수 있습니다.
ce1 객체에 CE_Set_mDouble 메서드를 활용하여 10을 대입하였고, ce2 객체에 역시 같은 메소드를 활용하여 30을 입력하였습니다.
여기서 유의할 점은 ce1.mDouble과 ce2.mDouble 은 서로 아무 상관관계가 없다는 점입니다.
아무리 같은 클래스에서 발생한 객체일지라도 각 객체 내부의 멤버들은 다른 메모리 공간에 할당되기 때문에 ce1 객체 내부의 데이터가 바뀌는 것은 ce2의 데이터에 아무런 영향을 주지 못한다는 뜻입니다.
'비전공자의 개발과 친해지기 > 클래스와 객체' 카테고리의 다른 글
[JAVA : 클래스와 객체]6. 상속 (0) | 2022.06.08 |
---|---|
[JAVA : 클래스와 객체]5. static (0) | 2022.05.05 |
[JAVA : 클래스와 객체]4. 접근제한자 (0) | 2022.04.18 |
[JAVA : 클래스와 객체]3. 생성자(constructor) (1) | 2022.04.14 |
[JAVA : 클래스와 객체]1. 클래스와 객체 (0) | 2022.04.12 |